[
  {
    "path": ".custom-gcl.reference.yml",
    "content": "# The golangci-lint version used to build the custom binary.\n# Required.\nversion: v2.0.0\n\n# The name of the custom binary.\n# Optional.\n# Default: custom-gcl\nname: custom-golangci-lint\n\n# The directory path used to store the custom binary.\n# Optional.\n# Default: .\ndestination: ./my/path/\n\n# The list of the plugins to integrate inside the custom binary.\nplugins:\n  # a plugin from a Go proxy\n  - module: 'github.com/example/plugin3'\n    version: v1.2.3\n\n  # a plugin from a Go proxy (with a specific import path)\n  - module: 'github.com/example/plugin4'\n    import: 'github.com/example/plugin4/foo'\n    version: v1.0.0\n\n  # a plugin from local source (with absolute path)\n  - module: 'github.com/example/plugin2'\n    path: /my/local/path/plugin2\n\n  # a plugin from local source (with relative path)\n  - module: 'github.com/example/plugin1'\n    path: ./my/local/path/plugin1\n\n  # a plugin from local source (with absolute path and a specific import path)\n  - module: 'github.com/example/plugin2'\n    import: 'github.com/example/plugin4/foo'\n    path: /my/local/path/plugin2\n"
  },
  {
    "path": ".gitattributes",
    "content": "go.sum linguist-generated\nassets/* linguist-generated\n*       text=auto eol=lf\n*.ps1   text eol=crlf\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "See [contributing quick start](https://golangci-lint.run/docs/contributing/) on our website.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: 🐞 Bug Report\ndescription: \"Create a report to help us improve.\"\nlabels: [bug]\nbody:\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Welcome\n      options:\n        - label: Yes, I'm using a binary release within 2 latest [releases](https://github.com/golangci/golangci-lint/releases). Only such installations are supported.\n          required: true\n        - label: Yes, I've searched similar [issues on GitHub](https://github.com/golangci/golangci-lint/issues) and didn't find any.\n          required: true\n        - label: Yes, I've read the `typecheck` section of the [FAQ](https://golangci-lint.run/docs/welcome/faq/#why-do-you-have-typecheck-errors).\n          required: true\n        - label: Yes, I've tried with the standalone [linter](https://golangci-lint.run/docs/linters/) if available (e.g., gocritic, go vet, etc.).\n          required: true\n        - label: I agree to follow this project's [Code of Conduct](https://github.com/golangci/golangci-lint?tab=coc-ov-file)\n          required: true\n\n  - type: dropdown\n    id: install\n    attributes:\n      label: How did you install golangci-lint?\n      options:\n        - I don't know\n        - Official GitHub Action\n        - Official binary\n        - Brew\n        - MacPorts\n        - Chocolatey\n        - Scoop\n        - Docker\n        - go install\n        - Tools pattern\n        - go tool\n        - AUR\n        - Nix\n        - Deb\n        - RPM\n        - Other Linux package manager\n        - Via editor/IDE\n        - asdf/mise-en-place\n        - Other\n    validations:\n      required: true\n\n  - type: textarea\n    id: problem\n    attributes:\n      label: Description of the problem\n      placeholder: Your problem description\n    validations:\n      required: true\n\n  - type: textarea\n    id: version\n    attributes:\n      label: Version of golangci-lint\n      value: |-\n        <details>\n\n        ```console\n        $ golangci-lint --version\n        # Paste output here\n        ```\n\n        </details>\n    validations:\n      required: true\n\n  - type: textarea\n    id: config\n    attributes:\n      label: Configuration\n      value: |-\n        <details>\n\n        ```console\n        # paste configuration file or CLI flags here\n        ```\n\n        </details>\n    validations:\n      required: true\n\n  - type: textarea\n    id: go-env\n    attributes:\n      label: Go environment\n      value: |-\n        <details>\n\n        ```console\n        $ go version && go env\n        # paste output here\n        ```\n\n        </details>\n    validations:\n      required: true\n\n  - type: textarea\n    id: verbose-output\n    attributes:\n      label: Verbose output of running\n      value: |-\n        <details>\n\n        ```console\n        $ golangci-lint cache clean\n        $ golangci-lint run -v\n        # paste output here\n        ```\n\n        </details>\n    validations:\n      required: true\n\n  - type: textarea\n    id: code-example\n    attributes:\n      label: A minimal reproducible example or link to a public repository\n      description: if your problem is related to a private repository, a minimal reproducible example is required.\n      value: |-\n        <details>\n\n        ```go\n        // add your code here\n        ```\n\n        </details>\n    validations:\n      required: true\n\n  - type: checkboxes\n    id: validation\n    attributes:\n      label: Validation\n      options:\n        - label: Yes, I've included all information above (version, config, etc.).\n          required: true\n\n  - type: checkboxes\n    id: supporter\n    attributes:\n      label: Supporter\n      options:\n        - label: I am a [sponsor/backer](https://donate.golangci.org) of this project.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: 📖 Documentation\n    url: https://golangci-lint.run\n    about: Please take a look to our documentation.\n  - name: ❓ Questions\n    url: https://github.com/golangci/golangci-lint/discussions\n    about: If you have a question, or are looking for advice, please post on our Discussions forum!\n  - name: 💬 Chat on Slack\n    url: https://gophers.slack.com/archives/CS0TBRKPC\n    about: Maybe chatting with the community can help\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: 💡 Feature request\ndescription: \"Suggest an idea for this project.\"\nlabels: [enhancement]\nbody:\n\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Welcome\n      options:\n        - label: Yes, I've searched similar [issues on GitHub](https://github.com/golangci/golangci-lint/issues) and didn't find any.\n          required: true\n        - label: I agree to follow this project's [Code of Conduct](https://github.com/golangci/golangci-lint?tab=coc-ov-file)\n          required: true\n\n  - type: dropdown\n    id: install\n    attributes:\n      label: How did you install golangci-lint?\n      options:\n        - I don't know\n        - Official GitHub Action\n        - Official binary\n        - Brew\n        - MacPorts\n        - Chocolatey\n        - Scoop\n        - Docker\n        - go install\n        - Tools pattern\n        - go tool\n        - AUR\n        - Nix\n        - Deb\n        - RPM\n        - Other Linux package manager\n        - Via editor/IDE\n        - asdf/mise-en-place\n        - Other\n    validations:\n      required: true\n\n  - type: textarea\n    id: problem\n    attributes:\n      label: Your feature request related to a problem? Please describe\n      placeholder: \"A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\"\n    validations:\n      required: true\n\n  - type: textarea\n    id: solution\n    attributes:\n      label: Describe the solution you'd like\n      placeholder: \"A clear and concise description of what you want to happen.\"\n    validations:\n      required: true\n\n  - type: textarea\n    id: alternatives\n    attributes:\n      label: Describe alternatives you've considered\n      placeholder: \"A clear and concise description of any alternative solutions or features you've considered.\"\n    validations:\n      required: true\n\n  - type: textarea\n    id: additional\n    attributes:\n      label: Additional context\n      placeholder: \"Add any other context or screenshots about the feature request here.\"\n    validations:\n      required: false\n\n  - type: checkboxes\n    id: supporter\n    attributes:\n      label: Supporter\n      options:\n        - label: I am a [sponsor/backer](https://donate.golangci.org) of this project.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\n\nWARNING:\n\nWe use Dependabot to update dependencies (linters included).\nThe updates happen at least automatically once a week (Sunday 11am UTC).\n\nNon-versioned dependencies are managed by the golangci-lint maintainers.\n\nNo pull requests to update a linter will be accepted unless:\nyou are the original author of the linter, AND there are important changes required (like a major version bump).\n\n-->\n\n<!--\n\nWARNING:\n\nPull requests from a fork inside a GitHub organization are not allowed.\nOnly pull requests from personal forks are allowed. \n\n-->\n"
  },
  {
    "path": ".github/boring-cyborg.yml",
    "content": "firstPRWelcomeComment: Hey, thank you for opening your first Pull Request !\n\n# Comment to be posted to on first time issues\nfirstIssueWelcomeComment: >\n  Hey, thank you for opening your first Issue ! 🙂\n  If you would like to contribute we have a [guide for contributors](https://golangci-lint.run/docs/contributing/).\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: gomod\n    directory: \"/\"\n    schedule:\n      interval: weekly\n      day: \"sunday\"\n      time: \"11:00\" # 11am UTC\n    ignore:\n      # Ignore forked linters because of their versioning issues.\n      - dependency-name: \"github.com/golangci/dupl\"\n      - dependency-name: \"github.com/golangci/gofmt\"\n      - dependency-name: \"github.com/golangci/swaggoswag\"\n      - dependency-name: \"github.com/golangci/unconvert\"\n  - package-ecosystem: github-actions\n    directory: \"/\"\n    schedule:\n      interval: weekly\n    groups:\n      github-actions:\n        patterns:\n          - \"*\"  # Group all updates into a single larger pull request.\n  - package-ecosystem: docker\n    directory: \"/build\"\n    schedule:\n      interval: weekly\n    groups:\n      docker:\n        patterns:\n          - \"*\"  # Group all updates into a single larger pull request.\n  - package-ecosystem: gomod\n    directory: \"/scripts/gen_github_action_config\"\n    schedule:\n      interval: weekly\n    groups:\n      scripts:\n        patterns:\n          - \"*\"  # Group all updates into a single larger pull request.\n  - package-ecosystem: gomod\n    directories:\n      - pkg/golinters/arangolint/testdata/\n      - pkg/golinters/ginkgolinter/testdata/\n      - pkg/golinters/loggercheck/testdata/\n      - pkg/golinters/protogetter/testdata/\n      - pkg/golinters/spancheck/testdata/\n      - pkg/golinters/zerologlint/testdata/\n    groups:\n      linter-testdata:\n        patterns:\n          - \"*\"  # Group all updates into a single larger pull request.\n    schedule:\n      interval: monthly\n      day: \"wednesday\"\n      time: \"11:00\" # 11am UTC\n"
  },
  {
    "path": ".github/new-linter-checklist.md",
    "content": "In order for a pull request adding a linter to be reviewed, the linter and the PR must follow some requirements.\n\n- [ ] The CLA must be signed\n\n### Pull Request Description\n\n- [ ] It must have a link to the linter repository.\n- [ ] It must provide a short description of the linter.\n\n### Linter\n\n- [ ] It must not be a duplicate of another linter or a rule of a linter (the team will help to verify that).\n- [ ] It must have a valid license (AGPL is not allowed), and the file must contain the required information by the license, ex: author, year, etc.\n- [ ] It must use Go version <= 1.22.0\n- [ ] The linter repository must have a CI and tests.\n- [ ] It must use [`go/analysis`](https://golangci-lint.run/docs/contributing/new-linters/).\n- [ ] It must have a valid tag, ex: `v1.0.0`, `v0.1.0`.\n- [ ] It must not contain `init()`.\n- [ ] It must not contain `panic()`.\n- [ ] It must not contain `log.Fatal()`, `os.Exit()`, or similar.\n- [ ] It must not modify the AST.\n- [ ] It must not have false positives/negatives (the team will help to verify that).\n- [ ] It must have tests inside golangci-lint.\n\n### The Linter Tests Inside Golangci-lint\n\n- [ ] They must have at least one std lib import.\n- [ ] They must have integration tests without configuration (default).\n- [ ] They must have integration tests with configuration (if the linter has a configuration).\n\n### `.golangci.next.reference.yml`\n\n- [ ] The file `.golangci.next.reference.yml` must be updated.\n- [ ] The file `.golangci.reference.yml` must NOT be edited.\n- [ ] The linter must be added to the lists of available linters (alphabetical case-insensitive order).\n    - `enable` and `disable` options\n- [ ] If the linter has a configuration, the exhaustive configuration of the linter must be added (alphabetical case-insensitive order)\n    - The values must be different from the default ones.\n    - The default values must be defined in a comment.\n    - The option must have a short description.\n\n### Others Requirements\n\n- [ ] The files (tests and linter) inside golangci-lint must have the same name as the linter.\n- [ ] The `.golangci.yml` of golangci-lint itself must not be edited and the linter must not be added to this file.\n- [ ] The linters must be sorted in the alphabetical order (case-insensitive) in the `lintersdb/builder_linter.go` and `.golangci.next.reference.yml`.\n- [ ] The load mode (`WithLoadMode(...)`):\n    - if the linter uses `goanalysis.LoadModeSyntax` -> no `WithLoadForGoAnalysis()` in `lintersdb/builder_linter.go`\n    - if the linter uses `goanalysis.LoadModeTypesInfo`, it requires `WithLoadForGoAnalysis()` in `lintersdb/builder_linter.go`\n- [ ] The version in `WithSince(...)` must be the next minor version (`v1.X.0`) of golangci-lint.\n- [ ] `WithURL()` must contain the URL of the repository.\n\n### Recommendations\n\n- [ ] The file `jsonschema/golangci.next.jsonschema.json` should be updated.\n- [ ] The file `jsonschema/golangci.jsonschema.json` must NOT be edited.\n- [ ] The linter repository should have a readme and linting.\n- [ ] The linter should be published as a binary (useful to diagnose bug origins).\n- [ ] The linter repository should have a `.gitignore` (IDE files, binaries, OS files, etc. should not be committed)\n- [ ] A tag should never be recreated.\n- [ ] Use `main` as the default branch name.\n\n---\n\nThe golangci-lint team will edit this comment to check the boxes before and during the review.\n\nThe code review will start after the completion of those checkboxes (except for the specific items that the team will help to verify).\n\nThe reviews should be addressed as commits (no squash).\n\nIf the author of the PR is a member of the golangci-lint team, he should not edit this message.\n\n**This checklist does not imply that we will accept the linter.**\n"
  },
  {
    "path": ".github/peril/.gitignore",
    "content": "node_modules/\n"
  },
  {
    "path": ".github/peril/README.md",
    "content": "Based on https://github.com/gatsbyjs/gatsby/tree/HEAD/peril.\n\n## Update a code\n\n```bash\nheroku ps:restart web --app golangci-peril\nheroku logs --app golangci-peril -t\n```\n"
  },
  {
    "path": ".github/peril/package.json",
    "content": "{\n  \"dependencies\": {\n    \"jest\": \"^29.0.3\"\n  },\n  \"scripts\": {\n    \"test\": \"jest\"\n  },\n  \"jest\": {\n    \"rootDir\": \"../\",\n    \"roots\": [\n      \"<rootDir>/peril\"\n    ],\n    \"transform\": {\n      \"^.+\\\\.tsx?$\": \"<rootDir>/node_modules/ts-jest/preprocessor.js\"\n    },\n    \"moduleFileExtensions\": [\n      \"js\",\n      \"jsx\",\n      \"ts\",\n      \"tsx\",\n      \"json\"\n    ]\n  }\n}\n"
  },
  {
    "path": ".github/peril/rules/invite-collaborator.ts",
    "content": "import { danger } from \"danger\";\n\nconst comment = (username: string) => `\nHey, @${username} — we just merged your PR to \\`golangci-lint\\`! 🔥🚀\n\n\\`golangci-lint\\` is built by awesome people like you. Let us say “thanks”: **we just invited you to join the [GolangCI](https://github.com/golangci) organization on GitHub.**\nThis will add you to our team of maintainers. Accept the invite by visiting [this link](https://github.com/orgs/golangci/invitation).\n\nBy joining the team, you’ll be able to label issues, review pull requests, and merge approved pull requests.\nMore information about contributing is [here](https://golangci-lint.run/docs/contributing/).\n\nThanks again!\n`;\n\nconst teamId = `3840765`;\n\nexport const inviteCollaborator = async () => {\n  const gh = danger.github;\n  const api = gh.api;\n\n  // Details about the repo.\n  const owner = gh.thisPR.owner;\n  const repo = gh.thisPR.repo;\n  const number = gh.thisPR.number;\n\n  // Details about the collaborator.\n  const username = gh.pr.user.login;\n\n  // Check whether or not we’ve already invited this contributor.\n  try {\n    const inviteCheck = (await api.teams.getMembership({\n      team_id: teamId,\n      username,\n    } as any)) as any;\n    const isInvited = inviteCheck.headers.status !== \"404\";\n\n    // If we’ve already invited them, don’t spam them with more messages.\n    if (isInvited) {\n      console.log(\n        `@${username} has already been invited to this org. Doing nothing.`\n      );\n      return;\n    }\n  } catch (err) {\n    console.info(\n      `Error checking membership of ${username} in team ${teamId}: ${err.stack}`\n    );\n    // If the user hasn’t been invited, the invite check throws an error.\n  }\n\n  try {\n    const invite = await api.teams.addOrUpdateMembership({\n      team_id: teamId,\n      username,\n    } as any);\n\n    if (invite.data.state === \"active\") {\n      console.log(\n        `@${username} is already a ${invite.data.role} for this team.`\n      );\n    } else {\n      console.log(`We’ve invited @${username} to join this team.`);\n    }\n  } catch (err) {\n    console.log(\"Something went wrong.\");\n    console.log(err);\n    return;\n  }\n\n  // For new contributors, roll out the welcome wagon!\n  await api.issues.createComment({\n    owner,\n    repo,\n    number,\n    body: comment(username),\n  });\n};\n\nexport default async () => {\n  await inviteCollaborator();\n};\n"
  },
  {
    "path": ".github/peril/settings.json",
    "content": "{\n  \"$schema\": \"https://raw.githubusercontent.com/danger/peril/HEAD/peril-settings-json.schema\",\n  \"settings\": {\n    \"ignored_repos\": [],\n    \"env_vars\": [\"SLACK_WEBHOOK_URL\", \"GITHUB_ACCESS_TOKEN\"]\n  },\n  \"repos\": {\n    \"golangci/golangci-lint\": {\n      \"pull_request.closed (pull_request.merged == true)\": [\n        \".github/peril/rules/invite-collaborator.ts\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": ".github/peril/tests/invite-collaborator.test.ts",
    "content": "jest.mock(\"danger\", () => jest.fn());\nimport * as danger from \"danger\";\n\nconst dm = danger as any;\n\nimport { inviteCollaborator } from \"../rules/invite-collaborator\";\n\nbeforeEach(() => {\n  dm.danger = {\n    github: {\n      thisPR: {\n        owner: \"gatsbyjs\",\n        repo: \"peril-gatsbyjs\",\n        number: 1,\n      },\n      pr: {\n        user: {\n          login: \"someUser\",\n        },\n      },\n      api: {\n        teams: {\n          getMembership: () => Promise.resolve({ meta: { status: \"404\" } }),\n          addOrUpdateMembership: jest.fn(() =>\n            Promise.resolve({ data: { state: \"pending\" } })\n          ),\n        },\n        issues: {\n          createComment: jest.fn(),\n        },\n      },\n    },\n  };\n});\n\ndescribe(\"a closed pull request\", () => {\n  it(\"was merged and authored by a first-time contributor\", async () => {\n    dm.danger.github.pr.merged = true;\n\n    await inviteCollaborator();\n\n    expect(dm.danger.github.api.issues.createComment).toBeCalled();\n    expect(dm.danger.github.api.orgs.addTeamMembership).toBeCalled();\n  });\n\n  it(\"was merged and authored by an existing collaborator\", async () => {\n    dm.danger.github.pr.merged = true;\n    dm.danger.github.api.orgs.getTeamMembership = () =>\n      Promise.resolve({ headers: { status: \"204 No Content\" } });\n\n    await inviteCollaborator();\n\n    expect(dm.danger.github.api.issues.createComment).not.toBeCalled();\n  });\n\n  it(\"does not comment if invitation failed\", async () => {\n    dm.danger.github.pr.merged = true;\n    dm.danger.github.api.orgs.addTeamMembership = () =>\n      Promise.reject({ headers: { status: \"422 Unprocessable Entity\" } });\n\n    await inviteCollaborator();\n\n    expect(dm.danger.github.api.issues.createComment).not.toBeCalled();\n  });\n});\n"
  },
  {
    "path": ".github/peril/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"esModuleInterop\": false,\n    \"target\": \"es5\",\n    \"module\": \"commonjs\",\n    \"lib\": [\"es2017\"],\n    \"strict\": true\n  }\n}\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 366\n\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 30\n\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - pinned\n  - security\n  - blocked\n  - protected\n  - triaged\n\n# Label to use when marking an issue as stale\nstaleLabel: stale\n\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\nname: \"CodeQL\"\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches:\n      - main\n  schedule:\n    - cron: '0 17 * * 5'\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n\n    permissions:\n      # required for all workflows\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        # Override automatic language detection by changing the below list\n        # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']\n        # TODO: Enable for javascript later\n        language: [ 'go']\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n\n      # Initializes the CodeQL tools for scanning.\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v4\n        with:\n          languages: ${{ matrix.language }}\n          # If you wish to specify custom queries, you can do so here or in a config file.\n          # By default, queries listed here will override any specified in a config file.\n          # Prefix the list here with \"+\" to use these queries and those in the config file.\n          # queries: ./path/to/local/query, your-org/your-repo/queries@main\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v4\n"
  },
  {
    "path": ".github/workflows/deploy-documentation.yml",
    "content": "name: Deploy Documentation\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n\n  doc:\n    name: Build and deploy documentation\n    runs-on: ubuntu-latest\n    env:\n      # https://github.com/actions/setup-go#supported-version-syntax\n      # ex:\n      # - 1.18beta1 -> 1.18.0-beta.1\n      # - 1.18rc1 -> 1.18.0-rc.1\n      GO_VERSION: '1.26'\n      HUGO_VERSION: 0.148.1\n      CGO_ENABLED: 0\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n      - run: go mod download\n\n      - name: Setup Hugo\n        run: |\n          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \\\n          && sudo dpkg -i ${{ runner.temp }}/hugo.deb\n\n      - name: Build Documentation\n        run: make docs_build\n\n      - name: Deploy to GitHub Pages\n        uses: peaceiris/actions-gh-pages@v4\n        with:\n          publish_dir: docs/public\n          force_orphan: true\n          github_token: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/new-linter-checklist.yml",
    "content": "name: Add new linter checklist\n\non:\n  workflow_dispatch:\n    inputs:\n      pr:\n        description: PR number\n        required: true\n        type: number\n\npermissions:\n  pull-requests: write\n\njobs:\n  add-comment:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - name: Add checklist\n        run: |\n          # Avoid adding multiple comments for the same PR.\n          comment_exist=$(gh pr view \"$NUMBER\" \\\n            --json comments \\\n            --jq '.comments[].author | select(.login==\"github-actions\") | .login' \\\n            | wc -l)\n          [ \"$comment_exist\" -gt 0 ] && edit_last=\"--edit-last\"\n\n          gh pr comment \"$NUMBER\" --body \"$(cat .github/new-linter-checklist.md)\" $edit_last\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          GH_REPO: ${{ github.repository }}\n          NUMBER: ${{ inputs.pr }}\n"
  },
  {
    "path": ".github/workflows/post-release.yml",
    "content": "name: \"Post release\"\non:\n  release:\n    types:\n      - published\n\nenv:\n  # https://github.com/actions/setup-go#supported-version-syntax\n  # ex:\n  # - 1.18beta1 -> 1.18.0-beta.1\n  # - 1.18rc1 -> 1.18.0-rc.1\n  GO_VERSION: '1.26'\n\njobs:\n  update-gha-assets:\n    name: \"Update GitHub Action assets\"\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_TOKEN: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n      - name: Update GitHub Action config\n        run: make assets/github-action-config.json\n\n      - name: Create Pull Request\n        uses: peter-evans/create-pull-request@v8\n        with:\n          base: main\n          token: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n          branch-suffix: timestamp\n          title: \"docs: update GitHub Action assets\"\n          delete-branch: true\n\n  update-assets:\n    name: \"Update documentation assets\"\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_TOKEN: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n      - name: Update reference files\n        run: cp .golangci.next.reference.yml .golangci.reference.yml\n\n      - name: Update JSON schema files\n        run: cp jsonschema/golangci.next.jsonschema.json jsonschema/golangci.jsonschema.json\n\n      - name: Update information\n        run: make website_dump_info\n\n      - name: Create Pull Request\n        uses: peter-evans/create-pull-request@v8\n        with:\n          base: main\n          token: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n          branch-suffix: timestamp\n          title: \"docs: update documentation assets\"\n          delete-branch: true\n          body: |\n            - [ ] update changelog\n            - [ ] add previous version JSON Schema\n\n  check-install-script:\n    name: Installation script (remote)\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest, windows-latest]\n    runs-on: ${{ matrix.os }}\n    steps:\n      - run: curl -sSfL https://golangci-lint.run/install.sh | sh -s -- -b \"./install-golangci-lint\"\n"
  },
  {
    "path": ".github/workflows/pr-checks.yml",
    "content": "name: Checks\non:\n  push:\n    branches:\n      - main\n  pull_request:\n\nenv:\n  # https://github.com/actions/setup-go#supported-version-syntax\n  # ex:\n  # - 1.18beta1 -> 1.18.0-beta.1\n  # - 1.18rc1 -> 1.18.0-rc.1\n  GO_VERSION: '1.26'\n\njobs:\n  # Check if there is any dirty change for go mod tidy\n  go-mod:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n      - name: Check go mod\n        run: |\n          go mod tidy\n          git diff --exit-code go.mod\n          git diff --exit-code go.sum\n\n  # This check is disabled because of GitHub API instability: 504 Gateway Timeout.\n  # Checks: GitHub action assets\n#  check-generated:\n#    runs-on: ubuntu-latest\n#    steps:\n#      - uses: actions/checkout@v6\n#        with:\n#          fetch-depth: 0\n#      - uses: actions/setup-go@v6\n#        with:\n#          go-version: ${{ env.GO_VERSION }}\n#      - name: Check generated files are up-to-date\n#        run: make fast_check_generated\n#        env:\n#          # needed for github-action-config.json generation\n#          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n  check-local-install-script:\n    name: Installation script (local)\n    strategy:\n      matrix:\n        os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]\n    runs-on: ${{ matrix.os }}\n    steps:\n      - uses: actions/checkout@v6\n      - name: Check installation script\n        run: cat ./install.sh | sh -s -- -d -b \"./install-golangci-lint\"\n\n  # Note: the command `run` is tested by the other workflows (`make test`).\n  check-commands:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n      - name: Build golangci-lint\n        run: make build\n\n      - run: ./golangci-lint\n\n      - run: ./golangci-lint fmt\n      - run: ./golangci-lint fmt --diff\n      - run: cat cmd/golangci-lint/main.go | ./golangci-lint fmt --stdin\n\n      - run: ./golangci-lint cache\n      - run: ./golangci-lint cache status\n      - run: ./golangci-lint cache clean\n\n      - run: ./golangci-lint completion\n      - run: ./golangci-lint completion bash\n      - run: ./golangci-lint completion bash --no-descriptions\n      - run: ./golangci-lint completion zsh\n      - run: ./golangci-lint completion zsh --no-descriptions\n      - run: ./golangci-lint completion fish\n      - run: ./golangci-lint completion fish --no-descriptions\n      - run: ./golangci-lint completion powershell\n      - run: ./golangci-lint completion powershell --no-descriptions\n\n      - run: ./golangci-lint config\n      - run: ./golangci-lint config path\n      - run: ./golangci-lint config path --json\n      - run: ./golangci-lint config verify --schema jsonschema/golangci.next.jsonschema.json\n\n      - run: ./golangci-lint help\n      - run: ./golangci-lint help linters\n      - run: ./golangci-lint help linters --json\n      - run: ./golangci-lint help formatters\n      - run: ./golangci-lint help formatters --json\n      - run: ./golangci-lint linters\n      - run: ./golangci-lint linters --json\n      - run: ./golangci-lint formatters\n      - run: ./golangci-lint formatters --json\n      - run: ./golangci-lint version\n      - run: ./golangci-lint version --short\n      - run: ./golangci-lint version --debug\n      - run: ./golangci-lint version --json\n      - run: ./golangci-lint version --json --debug\n"
  },
  {
    "path": ".github/workflows/pr-documentation.yml",
    "content": "name: Check Documentation\n\non:\n  pull_request:\n\njobs:\n\n  doc:\n    name: Build documentation\n    runs-on: ubuntu-latest\n    env:\n      # https://github.com/actions/setup-go#supported-version-syntax\n      # ex:\n      # - 1.18beta1 -> 1.18.0-beta.1\n      # - 1.18rc1 -> 1.18.0-rc.1\n      GO_VERSION: '1.26'\n      HUGO_VERSION: 0.148.1\n      CGO_ENABLED: 0\n\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n      - run: go mod download\n\n      - name: Setup Hugo\n        run: |\n          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \\\n          && sudo dpkg -i ${{ runner.temp }}/hugo.deb\n\n      - name: Build Documentation\n        run: make docs_build\n"
  },
  {
    "path": ".github/workflows/pr-tests.yml",
    "content": "name: Tests\non:\n  push:\n    branches:\n      - main\n  pull_request:\n\nenv:\n  # https://github.com/actions/setup-go#supported-version-syntax\n  # ex:\n  # - 1.18beta1 -> 1.18.0-beta.1\n  # - 1.18rc1 -> 1.18.0-rc.1\n  GO_VERSION: '1.26'\n\njobs:\n  # Check if there is any dirty change for go mod tidy\n  go-mod:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n      - name: Check go mod\n        run: |\n          go mod tidy\n          git diff --exit-code go.mod\n          git diff --exit-code go.sum\n\n  # We already run the current golangci-lint in tests, but here we test\n  # our GitHub action with the latest stable golangci-lint.\n  golangci-lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          # https://github.com/actions/setup-go#supported-version-syntax\n          # ex:\n          # - 1.18beta1 -> 1.18.0-beta.1\n          # - 1.18rc1 -> 1.18.0-rc.1\n          # TODO(ldez) must be changed after the first release of golangci-lint with go1.25\n          # go-version: ${{ env.GO_VERSION }}\n          go-version: '1.25'\n      - name: lint\n        uses: golangci/golangci-lint-action@v9.2.0\n        with:\n          version: latest\n\n  tests-on-windows:\n    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors\n    runs-on: windows-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }} # test only the latest go version to speed up CI\n      - name: Run tests\n        run: make.exe test\n\n  tests-on-macos:\n    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors\n    runs-on: macos-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }} # test only the latest go version to speed up CI\n      - name: Run tests\n        run: make test\n\n  tests-on-unix:\n    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors\n    strategy:\n      matrix:\n        os:\n          - ubuntu-latest\n          - ubuntu-24.04-arm\n        golang:\n          - '1.25'\n          - '1.26'\n    runs-on: ${{ matrix.os }}\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ matrix.golang }}\n      - name: Run tests\n        run: make test\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: \"Release a tag\"\non:\n  push:\n    tags:\n      - v*\n\npermissions:\n  # Allow the workflow to write attestations.\n  id-token: write\n  attestations: write\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    env:\n      # https://github.com/actions/setup-go#supported-version-syntax\n      # ex:\n      # - 1.18beta1 -> 1.18.0-beta.1\n      # - 1.18rc1 -> 1.18.0-rc.1\n      GO_VERSION: '1.26'\n      CHOCOLATEY_VERSION: 2.2.0\n    steps:\n      # temporary workaround for an error in free disk space action\n      # https://github.com/jlumbroso/free-disk-space/issues/14\n      - name: Update Package List and Remove Dotnet\n        run: |\n          sudo apt-get update\n          sudo apt-get remove -y '^dotnet-.*'\n\n      # https://github.com/marketplace/actions/free-disk-space-ubuntu\n      - name: Free Disk Space\n        uses: jlumbroso/free-disk-space@main\n        with:\n          # this might remove tools that are actually needed\n          tool-cache: false\n\n          # all of these default to true\n          android: true\n          dotnet: true\n          haskell: true\n          large-packages: true\n          docker-images: true\n          swap-storage: false\n\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n      - uses: actions/setup-go@v6\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n#      - name: Install chocolatey\n#        run: |\n#          mono --version\n#          mkdir -p /opt/chocolatey\n#          wget -q -O - \"https://github.com/chocolatey/choco/releases/download/${CHOCOLATEY_VERSION}/chocolatey.v${CHOCOLATEY_VERSION}.tar.gz\" | tar -xz -C \"/opt/chocolatey\"\n#          echo '#!/bin/bash' >> /usr/local/bin/choco\n#          echo 'mono /opt/chocolatey/choco.exe $@' >> /usr/local/bin/choco\n#          chmod +x /usr/local/bin/choco\n#          choco --version\n\n      - name: Install snapcraft\n        run: sudo snap install snapcraft --classic\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v4\n\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v4\n\n      - name: Login do docker.io\n        run: docker login -u golangci -p ${{ secrets.GOLANGCI_LINT_DOCKER_TOKEN }}\n\n      - name: Create release\n        id: goreleaser\n        uses: goreleaser/goreleaser-action@v7\n        with:\n          version: latest\n          args: release --clean --timeout=90m\n        env:\n          AUR_KEY: ${{ secrets.AUR_KEY }}\n          CHOCOLATEY_API_KEY: ${{ secrets.CHOCOLATEY_API_KEY }}\n          SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}\n          GITHUB_TOKEN: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n\n      - uses: actions/attest@v4\n        with:\n          subject-checksums: ./dist/golangci-lint-${{ fromJSON(steps.goreleaser.outputs.metadata).version }}-checksums.txt\n          github-token: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n      - uses: actions/attest@v4\n        with:\n          subject-checksums: ./dist/digests.txt\n          github-token: ${{ secrets.GOLANGCI_LINT_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "*.test\n.DS_Store\n/*.pdf\n/*.pprof\n/*.txt\n/test.lock\n/.idea/\n/.vscode/\n/dist/\n/golangci-lint\n/golangci-lint.exe\n/test/path\n/tools/Dracula.itermcolors\n/tools/dist/\n/tools/godownloader\n/tools/goreleaser\n/tools/node_modules\n/tools/svg-term\n/vendor/\ncoverage.out\ncoverage.xml\n/custom-golangci-lint\n/custom-gcl\n.custom-gcl.yml\n.custom-gcl.yaml\n**/testdata/fix.tmp/\n"
  },
  {
    "path": ".golangci.next.reference.yml",
    "content": "# This file contains all available configuration options\n# with their default values (in comments).\n#\n# This file is not a configuration example,\n# it contains the exhaustive configuration with explanations of the options.\n\n# Defines the configuration version.\n# The only possible value is \"2\".\nversion: \"2\"\n\nlinters:\n  # Default set of linters.\n  # The value can be:\n  # - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default\n  # - `all`: enables all linters by default.\n  # - `none`: disables all linters by default.\n  # - `fast`: enables only linters considered as \"fast\" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`).\n  # Default: standard\n  default: all\n\n  # Enable specific linter.\n  enable:\n    - arangolint\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - embeddedstructfieldcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funcorder\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godoclint\n    - godot\n    - godox\n    - goheader\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - iotamixing\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - modernize\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - noinlineerr\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unqueryvet\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - wsl_v5\n    - zerologlint\n\n  # Disable specific linters.\n  disable:\n    - arangolint\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - embeddedstructfieldcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funcorder\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godoclint\n    - godot\n    - godox\n    - goheader\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - iotamixing\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - modernize\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - noinlineerr\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unqueryvet\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - wsl_v5\n    - zerologlint\n\n  # All available settings of specific linters.\n  settings:\n    asasalint:\n      # To specify a set of function names to exclude.\n      # The values are merged with the builtin exclusions.\n      # The builtin exclusions can be disabled by setting `use-builtin-exclusions` to `false`.\n      # Default: [\"^(fmt|log|logger|t|)\\.(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$\"]\n      exclude:\n        - Append\n        - \\.Wrapf\n      # To enable/disable the asasalint builtin exclusions of function names.\n      # See the default value of `exclude` to get the builtin exclusions.\n      # Default: true\n      use-builtin-exclusions: false\n\n    bidichk:\n      # The following configurations check for all mentioned invisible Unicode runes.\n      # All runes are enabled by default.\n      left-to-right-embedding: false\n      right-to-left-embedding: false\n      pop-directional-formatting: false\n      left-to-right-override: false\n      right-to-left-override: false\n      left-to-right-isolate: false\n      right-to-left-isolate: false\n      first-strong-isolate: false\n      pop-directional-isolate: false\n\n    copyloopvar:\n      # Check all assigning the loop variable to another variable.\n      # Default: false\n      check-alias: true\n\n    cyclop:\n      # The maximal code complexity to report.\n      # Default: 10\n      max-complexity: 10\n      # The maximal average package complexity.\n      # If it's higher than 0.0 (float) the check is enabled.\n      # Default: 0.0\n      package-average: 0.5\n\n    decorder:\n      # Required order of `type`, `const`, `var` and `func` declarations inside a file.\n      # Default: types before constants before variables before functions.\n      dec-order:\n        - type\n        - const\n        - var\n        - func\n\n      # If true, underscore vars (vars with \"_\" as the name) will be ignored at all checks.\n      # Default: false (underscore vars are not ignored)\n      ignore-underscore-vars: false\n\n      # If true, order of declarations is not checked at all.\n      # Default: true (disabled)\n      disable-dec-order-check: false\n\n      # If true, `init` func can be anywhere in file (does not have to be declared before all other functions).\n      # Default: true (disabled)\n      disable-init-func-first-check: false\n\n      # If true, multiple global `type`, `const` and `var` declarations are allowed.\n      # Default: true (disabled)\n      disable-dec-num-check: false\n\n      # If true, type declarations will be ignored for dec num check.\n      # Default: false (type statements are not ignored)\n      disable-type-dec-num-check: false\n\n      # If true, const declarations will be ignored for dec num check.\n      # Default: false (const statements are not ignored)\n      disable-const-dec-num-check: false\n\n      # If true, var declarations will be ignored for dec num check.\n      # Default: false (var statements are not ignored)\n      disable-var-dec-num-check: false\n\n    depguard:\n      # Rules to apply.\n      #\n      # Variables:\n      # - File Variables\n      #   Use an exclamation mark `!` to negate a variable.\n      #   Example: `!$test` matches any file that is not a go test file.\n      #\n      #   `$all` - matches all go files\n      #   `$test` - matches all go test files\n      #\n      # - Package Variables\n      #\n      #   `$gostd` - matches all of go's standard library (Pulled from `GOROOT`)\n      #\n      # Default (applies if no custom rules are defined): Only allow $gostd in all files.\n      rules:\n        # Name of a rule.\n        main:\n          # Defines package matching behavior. Available modes:\n          # - `original`: allowed if it doesn't match the deny list and either matches the allow list or the allow list is empty.\n          # - `strict`: allowed only if it matches the allow list and either doesn't match the deny list or the allow rule is more specific (longer) than the deny rule.\n          # - `lax`: allowed if it doesn't match the deny list or the allow rule is more specific (longer) than the deny rule.\n          # Default: \"original\"\n          list-mode: lax\n          # List of file globs that will match this list of settings to compare against.\n          # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.\n          # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.\n          # The placeholder '${config-path}' is substituted with a path relative to the configuration file.\n          # Default: $all\n          files:\n            - \"!**/*_a _file.go\"\n          # List of allowed packages.\n          # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).\n          # Default: []\n          allow:\n            - $gostd\n            - github.com/OpenPeeDeeP\n          # List of packages that are not allowed.\n          # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).\n          # Default: []\n          deny:\n            - pkg: \"math/rand$\"\n              desc: use math/rand/v2\n            - pkg: \"github.com/sirupsen/logrus\"\n              desc: not allowed\n            - pkg: \"github.com/pkg/errors\"\n              desc: Should be replaced by standard lib errors package\n\n    dogsled:\n      # Checks assignments with too many blank identifiers.\n      # Default: 2\n      max-blank-identifiers: 3\n\n    dupl:\n      # Tokens count to trigger issue.\n      # Default: 150\n      threshold: 100\n\n    dupword:\n      # Keywords for detecting duplicate words.\n      # If this list is not empty, only the words defined in this list will be detected.\n      # Default: []\n      keywords:\n        - \"the\"\n        - \"and\"\n        - \"a\"\n      # Keywords used to ignore detection.\n      # Default: []\n      ignore:\n        - \"0C0C\"\n      # Checks only comments, skip strings.\n      # Default: false\n      comments-only: true\n\n    embeddedstructfieldcheck:\n      # Checks that there is an empty space between the embedded fields and regular fields.\n      # Default: true\n      empty-line: false\n      # Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\n      # Default: false\n      forbid-mutex: true\n\n    errcheck:\n      # Report about not checking of errors in type assertions: `a := b.(MyStruct)`.\n      # Such cases aren't reported by default.\n      # Default: false\n      check-type-assertions: true\n\n      # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`.\n      # Such cases aren't reported by default.\n      # Default: false\n      check-blank: true\n\n      # To disable the errcheck built-in exclude list.\n      # See `-excludeonly` option in https://github.com/kisielk/errcheck#excluding-functions for details.\n      # Default: false\n      disable-default-exclusions: true\n\n      # List of functions to exclude from checking, where each entry is a single function to exclude.\n      # See https://github.com/kisielk/errcheck#excluding-functions for details.\n      exclude-functions:\n        - io/ioutil.ReadFile\n        - io.Copy(*bytes.Buffer)\n        - io.Copy(os.Stdout)\n\n      # Display function signature instead of selector.\n      # Default: false\n      verbose: true\n\n    errchkjson:\n      # With check-error-free-encoding set to true, errchkjson does warn about errors\n      # from json encoding functions that are safe to be ignored,\n      # because they are not possible to happen.\n      #\n      # if check-error-free-encoding is set to true and errcheck linter is enabled,\n      # it is recommended to add the following exceptions to prevent from false positives:\n      #\n      #     linters:\n      #       settings:\n      #         errcheck:\n      #           exclude-functions:\n      #             - encoding/json.Marshal\n      #             - encoding/json.MarshalIndent\n      #\n      # Default: false\n      check-error-free-encoding: true\n\n      # Issue on struct encoding that doesn't have exported fields.\n      # Default: false\n      report-no-exported: false\n\n    errorlint:\n      # Check whether fmt.Errorf uses the %w verb for formatting errors.\n      # See the https://github.com/polyfloyd/go-errorlint for caveats.\n      # Default: true\n      errorf: false\n      # Permit more than 1 %w verb, valid per Go 1.20 (requires `errorf: true`).\n      # Default: true\n      errorf-multi: false\n      # Check for plain type assertions and type switches.\n      # Default: true\n      asserts: false\n      # Check for plain error comparisons.\n      # Default: true\n      comparison: false\n      # Allowed errors.\n      # Default: []\n      allowed-errors:\n        - err: \"io.EOF\"\n          fun: \"example.com/pkg.Read\"\n      # Allowed error \"wildcards\".\n      # Default: []\n      allowed-errors-wildcard:\n        - err: \"example.com/pkg.ErrMagic\"\n          fun: \"example.com/pkg.Magic\"\n\n    exhaustive:\n      # Program elements to check for exhaustiveness.\n      # Default: [ switch ]\n      check:\n        - switch\n        - map\n      # Presence of \"default\" case in switch statements satisfies exhaustiveness,\n      # even if all enum members are not listed.\n      # Default: false\n      default-signifies-exhaustive: true\n      # Enum members matching the supplied regex do not have to be listed in\n      # switch statements to satisfy exhaustiveness.\n      # Default: \"\"\n      ignore-enum-members: \"Example.+\"\n      # Enum types matching the supplied regex do not have to be listed in\n      # switch statements to satisfy exhaustiveness.\n      # Default: \"\"\n      ignore-enum-types: \"Example.+\"\n      # Consider enums only in package scopes, not in inner scopes.\n      # Default: false\n      package-scope-only: true\n      # Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.\n      # Default: false\n      explicit-exhaustive-switch: true\n      # Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.\n      # Default: false\n      explicit-exhaustive-map: true\n      # Switch statement requires default case even if exhaustive.\n      # Default: false\n      default-case-required: true\n\n    exhaustruct:\n      # List of regular expressions to match type names that should be processed.\n      # Anonymous structs can be matched by '<anonymous>' alias.\n      #\n      # Each regular expression must match the full type name, including package path.\n      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`,\n      # but not `http\\.Cookie`.\n      # Default: []\n      include:\n        - '.+\\.Test'\n        - 'example\\.com/package\\.ExampleStruct[\\d]{1,2}'\n      # List of regular expressions to match type names that should be excluded from processing.\n      # Anonymous structs can be matched by '<anonymous>' alias.\n      # Has precedence over `include`.\n      # Each regular expression must match the full type name, including package path.\n      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`,\n      # but not `http\\.Cookie`.\n      # Default: []\n      exclude:\n        - '.+/cobra\\.Command$'\n      # Allows empty structures, effectively excluding them from the check.\n      # Default: false\n      allow-empty: true\n      # List of regular expressions to match type names that should be allowed to be empty.\n      # Anonymous structs can be matched by '<anonymous>' alias.\n      # Each regular expression must match the full type name, including package path.\n      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`,\n      # but not `http\\.Cookie`.\n      # Default: []\n      allow-empty-rx:\n        - '.*/http\\.Cookie'\n      # Allows empty structures in return statements.\n      # Default: false\n      allow-empty-returns: true\n      # Allows empty structures in variable declarations.\n      # Default: false\n      allow-empty-declarations: true\n\n    fatcontext:\n      # Check for potential fat contexts in struct pointers.\n      # May generate false positives.\n      # Default: false\n      check-struct-pointers: true\n\n    forbidigo:\n      # Forbid the following identifiers (list of regexp).\n      # Default: [\"^(fmt\\\\.Print(|f|ln)|print|println)$\"]\n      forbid:\n        # Built-in bootstrapping functions.\n        - pattern: ^print(ln)?$\n        # Optional message that gets included in error reports.\n        - pattern: ^fmt\\.Print.*$\n          msg: Do not commit print statements.\n        # Alternatively, put messages at the end of the regex, surrounded by `(# )?`.\n        # Escape any special characters. Those messages get included in error reports.\n        - pattern: 'fmt\\.Print.*(# Do not commit print statements\\.)?'\n        # Forbid spew Dump, whether it is called as function or method.\n        # Depends on analyze-types below.\n        - pattern: ^spew\\.(ConfigState\\.)?Dump$\n        # The package name might be ambiguous.\n        # The full import path can be used as additional criteria.\n        # Depends on analyze-types below.\n        - pattern: ^v1.Dump$\n          pkg: ^example.com/pkg/api/v1$\n      # Exclude godoc examples from forbidigo checks.\n      # Default: true\n      exclude-godoc-examples: false\n      # Instead of matching the literal source code,\n      # use type information to replace expressions with strings that contain the package name\n      # and (for methods and fields) the type name.\n      # This makes it possible to handle import renaming and forbid struct fields and methods.\n      # Default: false\n      analyze-types: true\n\n    funcorder:\n      # Checks that constructors are placed after the structure declaration.\n      # Default: true\n      constructor: false\n      # Checks if the exported methods of a structure are placed before the non-exported ones.\n      # Default: true\n      struct-method: false\n      # Checks if the constructors and/or structure methods are sorted alphabetically.\n      # Default: false\n      alphabetical: true\n\n    funlen:\n      # Checks the number of lines in a function.\n      # If lower than 0, disable the check.\n      # Default: 60\n      lines: -1\n      # Checks the number of statements in a function.\n      # If lower than 0, disable the check.\n      # Default: 40\n      statements: -1\n      # Ignore comments when counting lines.\n      # Default: true\n      ignore-comments: false\n\n    ginkgolinter:\n      # Suppress the wrong length assertion warning.\n      # Default: false\n      suppress-len-assertion: true\n\n      # Suppress the wrong nil assertion warning.\n      # Default: false\n      suppress-nil-assertion: true\n\n      # Suppress the wrong error assertion warning.\n      # Default: false\n      suppress-err-assertion: true\n\n      # Suppress the wrong comparison assertion warning.\n      # Default: false\n      suppress-compare-assertion: true\n\n      # Suppress the function all in async assertion warning.\n      # Default: false\n      suppress-async-assertion: true\n\n      # Suppress warning for comparing values from different types, like `int32` and `uint32`.\n      # Default: false\n      suppress-type-compare-assertion: true\n\n      # Trigger warning for ginkgo focus containers like `FDescribe`, `FContext`, `FWhen` or `FIt`.\n      # Default: false\n      forbid-focus-container: true\n\n      # Don't trigger warnings for HaveLen(0)\n      # Default: false\n      allow-havelen-zero: true\n\n      # Force using `Expect` with `To`, `ToNot` or `NotTo`.\n      # Reject using `Expect` with `Should` or `ShouldNot`.\n      # Default: false\n      force-expect-to: true\n\n      # Best effort validation of async intervals (timeout and polling).\n      # Ignored the `suppress-async-assertion` is true.\n      # Default: false\n      validate-async-intervals: true\n\n      # Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\n      # Default: false\n      forbid-spec-pollution: true\n\n      # Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\n      # Default: false\n      force-succeed: true\n\n      # Force adding assertion descriptions to gomega matchers.\n      # Default: false\n      force-assertion-description: true\n\n      # Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\n      # Default: false\n      force-tonot: true\n\n    gochecksumtype:\n      # Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\n      # Default: true\n      default-signifies-exhaustive: false\n      # Include shared interfaces in the exhaustiveness check.\n      # Default: false\n      include-shared-interfaces: true\n\n    gocognit:\n      # Minimal code complexity to report.\n      # Default: 30 (but we recommend 10-20)\n      min-complexity: 10\n\n    goconst:\n      # Minimal length of string constant.\n      # Default: 3\n      min-len: 2\n      # Minimum occurrences of constant string count to trigger issue.\n      # Default: 3\n      min-occurrences: 2\n      # Look for existing constants matching the values.\n      # Default: true\n      match-constant: false\n      # Search also for duplicated numbers.\n      # Default: false\n      numbers: true\n      # Minimum value, only works with `goconst.numbers`.\n      # Default: 3\n      min: 2\n      # Maximum value, only works with `goconst.numbers`.\n      # Default: 3\n      max: 2\n      # Ignore when constant is not used as function argument.\n      # Default: true\n      ignore-calls: false\n      # Exclude strings matching the given regular expression.\n      # Default: \"\"\n      ignore-string-values:\n        - 'foo.+'\n      # Detects constants with identical values.\n      # Default: false\n      find-duplicates: true\n      # Evaluates of constant expressions like Prefix + \"suffix\".\n      # Default: false\n      eval-const-expressions: true\n\n    gocritic:\n      # Disable all checks.\n      # Default: false\n      disable-all: true\n      # Which checks should be enabled in addition to default checks; can't be combined with 'disabled-checks'.\n      # By default, list of stable checks is used (https://go-critic.com/overview#checks-overview):\n      #   appendAssign, argOrder, assignOp, badCall, badCond, captLocal, caseOrder, codegenComment, commentFormatting,\n      #   defaultCaseOrder, deprecatedComment, dupArg, dupBranchBody, dupCase, dupSubExpr, elseif, exitAfterDefer,\n      #   flagDeref, flagName, ifElseChain, mapKey, newDeref, offBy1, regexpMust, singleCaseSwitch, sloppyLen,\n      #   sloppyTypeAssert, switchTrue, typeSwitchVar, underef, unlambda, unslice, valSwap, wrapperFunc\n      # To see which checks are enabled run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic`.\n      enabled-checks:\n        # Detects suspicious append result assignments.\n        # https://go-critic.com/overview.html#appendassign\n        - appendAssign\n        # Detects `append` chains to the same slice that can be done in a single `append` call.\n        # https://go-critic.com/overview.html#appendcombine\n        - appendCombine\n        # Detects suspicious arguments order.\n        # https://go-critic.com/overview.html#argorder\n        - argOrder\n        # Detects assignments that can be simplified by using assignment operators.\n        # https://go-critic.com/overview.html#assignop\n        - assignOp\n        # Detects suspicious function calls.\n        # https://go-critic.com/overview.html#badcall\n        - badCall\n        # Detects suspicious condition expressions.\n        # https://go-critic.com/overview.html#badcond\n        - badCond\n        # Detects suspicious mutex lock/unlock operations.\n        # https://go-critic.com/overview.html#badlock\n        - badLock\n        # Detects suspicious regexp patterns.\n        # https://go-critic.com/overview.html#badregexp\n        - badRegexp\n        # Detects bad usage of sort package.\n        # https://go-critic.com/overview.html#badsorting\n        - badSorting\n        # Detects bad usage of sync.OnceFunc.\n        # https://go-critic.com/overview.html#badsynconcefunc\n        - badSyncOnceFunc\n        # Detects bool expressions that can be simplified.\n        # https://go-critic.com/overview.html#boolexprsimplify\n        - boolExprSimplify\n        # Detects when predeclared identifiers are shadowed in assignments.\n        # https://go-critic.com/overview.html#builtinshadow\n        - builtinShadow\n        # Detects top-level declarations that shadow the predeclared identifiers.\n        # https://go-critic.com/overview.html#builtinshadowdecl\n        - builtinShadowDecl\n        # Detects capitalized names for local variables.\n        # https://go-critic.com/overview.html#captlocal\n        - captLocal\n        # Detects erroneous case order inside switch statements.\n        # https://go-critic.com/overview.html#caseorder\n        - caseOrder\n        # Detects malformed 'code generated' file comments.\n        # https://go-critic.com/overview.html#codegencomment\n        - codegenComment\n        # Detects comments with non-idiomatic formatting.\n        # https://go-critic.com/overview.html#commentformatting\n        - commentFormatting\n        # Detects commented-out code inside function bodies.\n        # https://go-critic.com/overview.html#commentedoutcode\n        - commentedOutCode\n        # Detects commented-out imports.\n        # https://go-critic.com/overview.html#commentedoutimport\n        - commentedOutImport\n        # Detects when default case in switch isn't on 1st or last position.\n        # https://go-critic.com/overview.html#defaultcaseorder\n        - defaultCaseOrder\n        # Detects loops inside functions that use defer.\n        # https://go-critic.com/overview.html#deferinloop\n        - deferInLoop\n        # Detects deferred function literals that can be simplified.\n        # https://go-critic.com/overview.html#deferunlambda\n        - deferUnlambda\n        # Detects malformed 'deprecated' doc-comments.\n        # https://go-critic.com/overview.html#deprecatedcomment\n        - deprecatedComment\n        # Detects comments that silence go lint complaints about doc-comment.\n        # https://go-critic.com/overview.html#docstub\n        - docStub\n        # Detects suspicious duplicated arguments.\n        # https://go-critic.com/overview.html#duparg\n        - dupArg\n        # Detects duplicated branch bodies inside conditional statements.\n        # https://go-critic.com/overview.html#dupbranchbody\n        - dupBranchBody\n        # Detects duplicated case clauses inside switch or select statements.\n        # https://go-critic.com/overview.html#dupcase\n        - dupCase\n        # Detects multiple imports of the same package under different aliases.\n        # https://go-critic.com/overview.html#dupimport\n        - dupImport\n        # Detects duplicated option function arguments in variadic function calls.\n        # https://go-critic.com/overview.html#dupoption\n        - dupOption\n        # Detects suspicious duplicated sub-expressions.\n        # https://go-critic.com/overview.html#dupsubexpr\n        - dupSubExpr\n        # Detects suspicious formatting strings usage.\n        # https://go-critic.com/overview.html#dynamicfmtstring\n        - dynamicFmtString\n        # Detects else with nested if statement that can be replaced with else-if.\n        # https://go-critic.com/overview.html#elseif\n        - elseif\n        # Detects suspicious empty declarations blocks.\n        # https://go-critic.com/overview.html#emptydecl\n        - emptyDecl\n        # Detects fallthrough that can be avoided by using multi case values.\n        # https://go-critic.com/overview.html#emptyfallthrough\n        - emptyFallthrough\n        # Detects empty string checks that can be written more idiomatically.\n        # https://go-critic.com/overview.html#emptystringtest\n        - emptyStringTest\n        # Detects unoptimal strings/bytes case-insensitive comparison.\n        # https://go-critic.com/overview.html#equalfold\n        - equalFold\n        # Detects unwanted dependencies on the evaluation order.\n        # https://go-critic.com/overview.html#evalorder\n        - evalOrder\n        # Detects calls to exit/fatal inside functions that use defer.\n        # https://go-critic.com/overview.html#exitafterdefer\n        - exitAfterDefer\n        # Detects exposed methods from sync.Mutex and sync.RWMutex.\n        # https://go-critic.com/overview.html#exposedsyncmutex\n        - exposedSyncMutex\n        # Detects suspicious reassignment of error from another package.\n        # https://go-critic.com/overview.html#externalerrorreassign\n        - externalErrorReassign\n        # Detects problems in filepath.Join() function calls.\n        # https://go-critic.com/overview.html#filepathjoin\n        - filepathJoin\n        # Detects immediate dereferencing of `flag` package pointers.\n        # https://go-critic.com/overview.html#flagderef\n        - flagDeref\n        # Detects suspicious flag names.\n        # https://go-critic.com/overview.html#flagname\n        - flagName\n        # Detects hex literals that have mixed case letter digits.\n        # https://go-critic.com/overview.html#hexliteral\n        - hexLiteral\n        # Detects nil usages in http.NewRequest calls, suggesting http.NoBody as an alternative.\n        # https://go-critic.com/overview.html#httpnobody\n        - httpNoBody\n        # Detects params that incur excessive amount of copying.\n        # https://go-critic.com/overview.html#hugeparam\n        - hugeParam\n        # Detects repeated if-else statements and suggests to replace them with switch statement.\n        # https://go-critic.com/overview.html#ifelsechain\n        - ifElseChain\n        # Detects when imported package names shadowed in the assignments.\n        # https://go-critic.com/overview.html#importshadow\n        - importShadow\n        # Detects strings.Index calls that may cause unwanted allocs.\n        # https://go-critic.com/overview.html#indexalloc\n        - indexAlloc\n        # Detects non-assignment statements inside if/switch init clause.\n        # https://go-critic.com/overview.html#initclause\n        - initClause\n        # Detects suspicious map literal keys.\n        # https://go-critic.com/overview.html#mapkey\n        - mapKey\n        # Detects method expression call that can be replaced with a method call.\n        # https://go-critic.com/overview.html#methodexprcall\n        - methodExprCall\n        # Finds where nesting level could be reduced.\n        # https://go-critic.com/overview.html#nestingreduce\n        - nestingReduce\n        # Detects immediate dereferencing of `new` expressions.\n        # https://go-critic.com/overview.html#newderef\n        - newDeref\n        # Detects return statements those results evaluate to nil.\n        # https://go-critic.com/overview.html#nilvalreturn\n        - nilValReturn\n        # Detects old-style octal literals.\n        # https://go-critic.com/overview.html#octalliteral\n        - octalLiteral\n        # Detects various off-by-one kind of errors.\n        # https://go-critic.com/overview.html#offby1\n        - offBy1\n        # Detects if function parameters could be combined by type and suggest the way to do it.\n        # https://go-critic.com/overview.html#paramtypecombine\n        - paramTypeCombine\n        # Detects expressions like []rune(s)[0] that may cause unwanted rune slice allocation.\n        # https://go-critic.com/overview.html#preferdecoderune\n        - preferDecodeRune\n        # Detects concatenation with os.PathSeparator which can be replaced with filepath.Join.\n        # https://go-critic.com/overview.html#preferfilepathjoin\n        - preferFilepathJoin\n        # Detects fmt.Sprint(f/ln) calls which can be replaced with fmt.Fprint(f/ln).\n        # https://go-critic.com/overview.html#preferfprint\n        - preferFprint\n        # Detects w.Write or io.WriteString calls which can be replaced with w.WriteString.\n        # https://go-critic.com/overview.html#preferstringwriter\n        - preferStringWriter\n        # Detects WriteRune calls with rune literal argument that is single byte and reports to use WriteByte instead.\n        # https://go-critic.com/overview.html#preferwritebyte\n        - preferWriteByte\n        # Detects input and output parameters that have a type of pointer to referential type.\n        # https://go-critic.com/overview.html#ptrtorefparam\n        - ptrToRefParam\n        # Detects append all its data while range it.\n        # https://go-critic.com/overview.html#rangeappendall\n        - rangeAppendAll\n        # Detects expensive copies of `for` loop range expressions.\n        # https://go-critic.com/overview.html#rangeexprcopy\n        - rangeExprCopy\n        # Detects loops that copy big objects during each iteration.\n        # https://go-critic.com/overview.html#rangevalcopy\n        - rangeValCopy\n        # Detects redundant fmt.Sprint calls.\n        # https://go-critic.com/overview.html#redundantsprint\n        - redundantSprint\n        # Detects `regexp.Compile*` that can be replaced with `regexp.MustCompile*`.\n        # https://go-critic.com/overview.html#regexpmust\n        - regexpMust\n        # Detects suspicious regexp patterns.\n        # https://go-critic.com/overview.html#regexppattern\n        - regexpPattern\n        # Detects regexp patterns that can be simplified.\n        # https://go-critic.com/overview.html#regexpsimplify\n        - regexpSimplify\n        # Detects suspicious http.Error call without following return.\n        # https://go-critic.com/overview.html#returnafterhttperror\n        - returnAfterHttpError\n        # Runs user-defined rules using ruleguard linter.\n        # https://go-critic.com/overview.html#ruleguard\n        - ruleguard\n        # Detects switch statements that could be better written as if statement.\n        # https://go-critic.com/overview.html#singlecaseswitch\n        - singleCaseSwitch\n        # Detects slice clear loops, suggests an idiom that is recognized by the Go compiler.\n        # https://go-critic.com/overview.html#sliceclear\n        - sliceClear\n        # Detects usage of `len` when result is obvious or doesn't make sense.\n        # https://go-critic.com/overview.html#sloppylen\n        - sloppyLen\n        # Detects suspicious/confusing re-assignments.\n        # https://go-critic.com/overview.html#sloppyreassign\n        - sloppyReassign\n        # Detects redundant type assertions.\n        # https://go-critic.com/overview.html#sloppytypeassert\n        - sloppyTypeAssert\n        # Detects suspicious sort.Slice calls.\n        # https://go-critic.com/overview.html#sortslice\n        - sortSlice\n        # Detects \"%s\" formatting directives that can be replaced with %q.\n        # https://go-critic.com/overview.html#sprintfquotedstring\n        - sprintfQuotedString\n        # Detects issue in Query() and Exec() calls.\n        # https://go-critic.com/overview.html#sqlquery\n        - sqlQuery\n        # Detects string concat operations that can be simplified.\n        # https://go-critic.com/overview.html#stringconcatsimplify\n        - stringConcatSimplify\n        # Detects redundant conversions between string and []byte.\n        # https://go-critic.com/overview.html#stringxbytes\n        - stringXbytes\n        # Detects strings.Compare usage.\n        # https://go-critic.com/overview.html#stringscompare\n        - stringsCompare\n        # Detects switch-over-bool statements that use explicit `true` tag value.\n        # https://go-critic.com/overview.html#switchtrue\n        - switchTrue\n        # Detects sync.Map load+delete operations that can be replaced with LoadAndDelete.\n        # https://go-critic.com/overview.html#syncmaploadanddelete\n        - syncMapLoadAndDelete\n        # Detects manual conversion to milli- or microseconds.\n        # https://go-critic.com/overview.html#timeexprsimplify\n        - timeExprSimplify\n        # Detects TODO comments without detail/assignee.\n        # https://go-critic.com/overview.html#todocommentwithoutdetail\n        - todoCommentWithoutDetail\n        # Detects function with too many results.\n        # https://go-critic.com/overview.html#toomanyresultschecker\n        - tooManyResultsChecker\n        # Detects potential truncation issues when comparing ints of different sizes.\n        # https://go-critic.com/overview.html#truncatecmp\n        - truncateCmp\n        # Detects repeated type assertions and suggests to replace them with type switch statement.\n        # https://go-critic.com/overview.html#typeassertchain\n        - typeAssertChain\n        # Detects method declarations preceding the type definition itself.\n        # https://go-critic.com/overview.html#typedeffirst\n        - typeDefFirst\n        # Detects type switches that can benefit from type guard clause with variable.\n        # https://go-critic.com/overview.html#typeswitchvar\n        - typeSwitchVar\n        # Detects unneeded parenthesis inside type expressions and suggests to remove them.\n        # https://go-critic.com/overview.html#typeunparen\n        - typeUnparen\n        # Detects unchecked errors in if statements.\n        # https://go-critic.com/overview.html#uncheckedinlineerr\n        - uncheckedInlineErr\n        # Detects dereference expressions that can be omitted.\n        # https://go-critic.com/overview.html#underef\n        - underef\n        # Detects redundant statement labels.\n        # https://go-critic.com/overview.html#unlabelstmt\n        - unlabelStmt\n        # Detects function literals that can be simplified.\n        # https://go-critic.com/overview.html#unlambda\n        - unlambda\n        # Detects unnamed results that may benefit from names.\n        # https://go-critic.com/overview.html#unnamedresult\n        - unnamedResult\n        # Detects unnecessary braced statement blocks.\n        # https://go-critic.com/overview.html#unnecessaryblock\n        - unnecessaryBlock\n        # Detects redundantly deferred calls.\n        # https://go-critic.com/overview.html#unnecessarydefer\n        - unnecessaryDefer\n        # Detects slice expressions that can be simplified to sliced expression itself.\n        # https://go-critic.com/overview.html#unslice\n        - unslice\n        # Detects value swapping code that are not using parallel assignment.\n        # https://go-critic.com/overview.html#valswap\n        - valSwap\n        # Detects conditions that are unsafe due to not being exhaustive.\n        # https://go-critic.com/overview.html#weakcond\n        - weakCond\n        # Ensures that `//nolint` comments include an explanation.\n        # https://go-critic.com/overview.html#whynolint\n        - whyNoLint\n        # Detects function calls that can be replaced with convenience wrappers.\n        # https://go-critic.com/overview.html#wrapperfunc\n        - wrapperFunc\n        # Detects Yoda style expressions and suggests to replace them.\n        # https://go-critic.com/overview.html#yodastyleexpr\n        - yodaStyleExpr\n        # Detects bytes.Repeat with 0 value.\n        # https://go-critic.com/overview.html#zerobyterepeat\n        - zeroByteRepeat\n\n      # Enable all checks.\n      # Default: false\n      enable-all: true\n      # Which checks should be disabled; can't be combined with 'enabled-checks'.\n      # Default: []\n      disabled-checks:\n        - appendAssign\n        - appendCombine\n        - argOrder\n        - assignOp\n        - badCall\n        - badCond\n        - badLock\n        - badRegexp\n        - badSorting\n        - badSyncOnceFunc\n        - boolExprSimplify\n        - builtinShadow\n        - builtinShadowDecl\n        - captLocal\n        - caseOrder\n        - codegenComment\n        - commentFormatting\n        - commentedOutCode\n        - commentedOutImport\n        - defaultCaseOrder\n        - deferInLoop\n        - deferUnlambda\n        - deprecatedComment\n        - docStub\n        - dupArg\n        - dupBranchBody\n        - dupCase\n        - dupImport\n        - dupSubExpr\n        - dynamicFmtString\n        - elseif\n        - emptyDecl\n        - emptyFallthrough\n        - emptyStringTest\n        - equalFold\n        - evalOrder\n        - exitAfterDefer\n        - exposedSyncMutex\n        - externalErrorReassign\n        - filepathJoin\n        - flagDeref\n        - flagName\n        - hexLiteral\n        - httpNoBody\n        - hugeParam\n        - ifElseChain\n        - importShadow\n        - indexAlloc\n        - initClause\n        - mapKey\n        - methodExprCall\n        - nestingReduce\n        - newDeref\n        - nilValReturn\n        - octalLiteral\n        - offBy1\n        - paramTypeCombine\n        - preferDecodeRune\n        - preferFilepathJoin\n        - preferFprint\n        - preferStringWriter\n        - preferWriteByte\n        - ptrToRefParam\n        - rangeAppendAll\n        - rangeExprCopy\n        - rangeValCopy\n        - redundantSprint\n        - regexpMust\n        - regexpPattern\n        - regexpSimplify\n        - returnAfterHttpError\n        - ruleguard\n        - singleCaseSwitch\n        - sliceClear\n        - sloppyLen\n        - sloppyReassign\n        - sloppyTypeAssert\n        - sortSlice\n        - sprintfQuotedString\n        - sqlQuery\n        - stringConcatSimplify\n        - stringXbytes\n        - stringsCompare\n        - switchTrue\n        - syncMapLoadAndDelete\n        - timeExprSimplify\n        - todoCommentWithoutDetail\n        - tooManyResultsChecker\n        - truncateCmp\n        - typeAssertChain\n        - typeDefFirst\n        - typeSwitchVar\n        - typeUnparen\n        - uncheckedInlineErr\n        - underef\n        - unlabelStmt\n        - unlambda\n        - unnamedResult\n        - unnecessaryBlock\n        - unnecessaryDefer\n        - unslice\n        - valSwap\n        - weakCond\n        - whyNoLint\n        - wrapperFunc\n        - yodaStyleExpr\n\n      # Enable multiple checks by tags in addition to default checks.\n      # Run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic` to see all tags and checks.\n      # See https://github.com/go-critic/go-critic#usage -> section \"Tags\".\n      # Default: []\n      enabled-tags:\n        - diagnostic\n        - style\n        - performance\n        - experimental\n        - opinionated\n      disabled-tags:\n        - diagnostic\n        - style\n        - performance\n        - experimental\n        - opinionated\n\n      # Settings passed to gocritic.\n      # The settings key is the name of a supported gocritic checker.\n      # The list of supported checkers can be found at https://go-critic.com/overview.\n      settings:\n        # Must be valid enabled check name.\n        captLocal:\n          # Whether to restrict checker to params only.\n          # Default: true\n          paramsOnly: false\n        commentedOutCode:\n          # Min length of the comment that triggers a warning.\n          # Default: 15\n          minLength: 50\n        elseif:\n          # Whether to skip balanced if-else pairs.\n          # Default: true\n          skipBalanced: false\n        hugeParam:\n          # Size in bytes that makes the warning trigger.\n          # Default: 80\n          sizeThreshold: 70\n        ifElseChain:\n          # Min number of if-else blocks that makes the warning trigger.\n          # Default: 2\n          minThreshold: 4\n        nestingReduce:\n          # Min number of statements inside a branch to trigger a warning.\n          # Default: 5\n          bodyWidth: 4\n        rangeExprCopy:\n          # Size in bytes that makes the warning trigger.\n          # Default: 512\n          sizeThreshold: 516\n          # Whether to check test functions\n          # Default: true\n          skipTestFuncs: false\n        rangeValCopy:\n          # Size in bytes that makes the warning trigger.\n          # Default: 128\n          sizeThreshold: 32\n          # Whether to check test functions.\n          # Default: true\n          skipTestFuncs: false\n        ruleguard:\n          # Enable debug to identify which 'Where' condition was rejected.\n          # The value of the parameter is the name of a function in a ruleguard file.\n          #\n          # When a rule is evaluated:\n          # If:\n          #   The Match() clause is accepted; and\n          #   One of the conditions in the Where() clause is rejected,\n          # Then:\n          #   ruleguard prints the specific Where() condition that was rejected.\n          #\n          # The option is passed to the ruleguard 'debug-group' argument.\n          # Default: \"\"\n          debug: 'emptyDecl'\n          # Determines the behavior when an error occurs while parsing ruleguard files.\n          # If flag is not set, log error and skip rule files that contain an error.\n          # If flag is set, the value must be a comma-separated list of error conditions.\n          # - 'all':    fail on all errors.\n          # - 'import': ruleguard rule imports a package that cannot be found.\n          # - 'dsl':    gorule file does not comply with the ruleguard DSL.\n          # Default: \"\"\n          failOn: dsl,import\n          # Comma-separated list of file paths containing ruleguard rules.\n          # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.\n          # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.\n          # The placeholder '${config-path}' is substituted with a path relative to the configuration file.\n          # Glob patterns such as 'rules-*.go' may be specified.\n          # Default: \"\"\n          rules: '${base-path}/ruleguard/rules-*.go,${base-path}/myrule1.go'\n          # Comma-separated list of enabled groups or skip empty to enable everything.\n          # Tags can be defined with # character prefix.\n          # Default: \"<all>\"\n          enable: \"myGroupName,#myTagName\"\n          # Comma-separated list of disabled groups or skip empty to enable everything.\n          # Tags can be defined with # character prefix.\n          # Default: \"\"\n          disable: \"myGroupName,#myTagName\"\n        tooManyResultsChecker:\n          # Maximum number of results.\n          # Default: 5\n          maxResults: 10\n        truncateCmp:\n          # Whether to skip int/uint/uintptr types.\n          # Default: true\n          skipArchDependent: false\n        underef:\n          # Whether to skip (*x).method() calls where x is a pointer receiver.\n          # Default: true\n          skipRecvDeref: false\n        unnamedResult:\n          # Whether to check exported functions.\n          # Default: false\n          checkExported: true\n\n    gocyclo:\n      # Minimal code complexity to report.\n      # Default: 30 (but we recommend 10-20)\n      min-complexity: 10\n\n    godoclint:\n      # Default set of rules to enable.\n      # Possible values are: `basic`, `all` or `none`.\n      # Default: `basic` (enables `pkg-doc`, `single-pkg-doc`, `start-with-name`, and `deprecated`)\n      default: all\n\n      # List of rules to enable in addition to the default set.\n      # Default: empty\n      enable:\n        # Check proper package-level godoc, if any.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#pkg-doc\n        - pkg-doc\n        # Assert at most one godoc per package.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#single-pkg-doc\n        - single-pkg-doc\n        # Require all packages to have a godoc.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-pkg-doc\n        - require-pkg-doc\n        # Assert symbol godocs start with the symbol name.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#start-with-name\n        - start-with-name\n        # Require godoc for all public symbols.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-doc\n        - require-doc\n        # Assert correct formatting of deprecation notes.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#deprecated\n        - deprecated\n        # Assert maximum line length for godocs.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#max-len\n        - max-len\n        # Assert no unused link in godocs.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#no-unused-link\n        - no-unused-link\n        # Require proper doc links to standard library declarations where applicable.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-stdlib-doclink\n        - require-stdlib-doclink\n\n      # List of rules to disable.\n      # Default: empty\n      disable:\n        - pkg-doc\n        - single-pkg-doc\n        - require-pkg-doc\n        - start-with-name\n        - require-doc\n        - deprecated\n        - max-len\n        - no-unused-link\n        - require-stdlib-doclink\n\n      # A map for fine-tuning individual rules.\n      # All subkeys are optional.\n      options:\n        max-len:\n          # Maximum line length for godocs, not including the `//`, `/*` or `*/` tokens.\n          # Default: 77\n          length: 127\n\n        require-doc:\n          # Ignore exported (public) symbols when applying the `require-doc` rule.\n          # Default: false\n          ignore-exported: true\n\n          # Ignore unexported (private) symbols when applying the `require-doc` rule.\n          # Default: true\n          ignore-unexported: false\n\n        start-with-name:\n          # Include unexported symbols when applying the `start-with-name` rule.\n          # Default: false\n          include-unexported: true\n\n    godot:\n      # Comments to be checked: `declarations`, `toplevel`, `noinline` or `all`.\n      # Default: declarations\n      scope: toplevel\n      # List of regexps for excluding particular comment lines from check.\n      # Default: []\n      exclude:\n        # Exclude todo and fixme comments.\n        - \"^fixme:\"\n        - \"^todo:\"\n      # Check that each sentence ends with a period.\n      # Default: true\n      period: false\n      # Check that each sentence starts with a capital letter.\n      # Default: false\n      capital: true\n\n    godox:\n      # Report any comments starting with keywords, this is useful for TODO or FIXME comments that\n      # might be left in the code accidentally and should be resolved before merging.\n      # Default: [\"TODO\", \"BUG\", \"FIXME\"]\n      keywords:\n        - NOTE\n        - OPTIMIZE # marks code that should be optimized before merging\n        - HACK # marks hack-around that should be removed before merging\n\n    goheader:\n      # Supports two types 'const` and `regexp`.\n      # Values can be used recursively.\n      # Default: {}\n      values:\n        const:\n          # Define here const type values in format k:v.\n          # For example:\n          COMPANY: MY COMPANY\n        regexp:\n          # Define here regexp type values.\n          # for example:\n          AUTHOR: .*@mycompany\\.com\n      # The template used for checking.\n      # Put here copyright header template for source code files.\n      # Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.\n      # Default: \"\"\n      template: |-\n        {{ AUTHOR }} {{ COMPANY }} {{ YEAR }}\n        SPDX-License-Identifier: Apache-2.0\n\n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at:\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n        Unless required by applicable law or agreed to in writing, software\n        distributed under the License is distributed on an \"AS IS\" BASIS,\n        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n        See the License for the specific language governing permissions and\n        limitations under the License.\n      # As alternative of directive 'template', you may put the path to file with the template source.\n      # Useful if you need to load the template from a specific file.\n      # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.\n      # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.\n      # The placeholder '${config-path}' is substituted with a path relative to the configuration file.\n      # Default: \"\"\n      template-path: /path/to/my/template.tmpl\n\n    gomoddirectives:\n      # Allow local `replace` directives.\n      # Default: false\n      replace-local: true\n      # List of allowed `replace` directives.\n      # Default: []\n      replace-allow-list:\n        - launchpad.net/gocheck\n      # Allow to not explain why the version has been retracted in the `retract` directives.\n      # Default: false\n      retract-allow-no-explanation: true\n      # Forbid the use of the `exclude` directives.\n      # Default: false\n      exclude-forbidden: true\n      # Forbid the use of the `ignore` directives (>= go1.25).\n      # Default: false\n      ignore-forbidden: true\n      # Forbid the use of the `toolchain` directive.\n      # Default: false\n      toolchain-forbidden: true\n      # Defines a pattern to validate `toolchain` directive.\n      # Default: '' (no match)\n      toolchain-pattern: 'go1\\.23\\.\\d+$'\n      # Forbid the use of the `tool` directives.\n      # Default: false\n      tool-forbidden: true\n      # Forbid the use of the `godebug` directive.\n      # Default: false\n      go-debug-forbidden: true\n      # Defines a pattern to validate `go` minimum version directive.\n      # Default: '' (no match)\n      go-version-pattern: '\\d\\.\\d+(\\.0)?'\n      # Check the validity of the module path.\n      # Default: false\n      check-module-path: true\n\n    gomodguard:\n      allowed:\n        # List of allowed modules.\n        # Default: []\n        modules:\n          - gopkg.in/yaml.v2\n        # List of allowed module domains.\n        # Default: []\n        domains:\n          - golang.org\n      blocked:\n        # List of blocked modules.\n        # Default: []\n        modules:\n          # Blocked module.\n          - github.com/uudashr/go-module:\n              # Recommended modules that should be used instead. (Optional)\n              recommendations:\n                - golang.org/x/mod\n              # Reason why the recommended module should be used. (Optional)\n              reason: \"`mod` is the official go.mod parser library.\"\n        # List of blocked module version constraints.\n        # Default: []\n        versions:\n          # Blocked module with version constraint.\n          - github.com/mitchellh/go-homedir:\n              # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons.\n              version: \"< 1.1.0\"\n              # Reason why the version constraint exists. (Optional)\n              reason: \"testing if blocked version constraint works.\"\n        # Set to true to raise lint issues for packages that are loaded from a local path via replace directive.\n        # Default: false\n        local-replace-directives: false\n\n    gosec:\n      # To select a subset of rules to run.\n      # Available rules: https://github.com/securego/gosec#available-rules\n      # Default: [] - means include all rules\n      includes:\n        - G101 # Look for hardcoded credentials\n        - G102 # Bind to all interfaces\n        - G103 # Audit the use of unsafe block\n        - G104 # Audit errors not checked\n        - G106 # Audit the use of ssh.InsecureIgnoreHostKey function\n        - G107 # Url provided to HTTP request as taint input\n        - G108 # Profiling endpoint is automatically exposed\n        - G109 # Converting strconv.Atoi result to int32/int16\n        - G110 # Detect io.Copy instead of io.CopyN when decompression\n        - G111 # Detect http.Dir('/') as a potential risk\n        - G112 # Detect ReadHeaderTimeout not configured as a potential risk\n        - G113 # HTTP request smuggling via conflicting headers or bare LF in body parsing\n        - G114 # Use of net/http serve function that has no support for setting timeouts\n        - G115 # Type conversion which leads to integer overflow\n        - G116 # Detect Trojan Source attacks using bidirectional Unicode characters\n        - G117 # Potential exposure of secrets via JSON/YAML/XML/TOML marshaling\n        - G118 # Context propagation failure leading to goroutine/resource leaks\n        - G119 # Unsafe redirect policy may propagate sensitive headers\n        - G120 # Unbounded form parsing in HTTP handlers can cause memory exhaustion\n        - G121 # Unsafe CrossOriginProtection bypass patterns\n        - G122 # Filesystem TOCTOU race risk in filepath.Walk/WalkDir callbacks\n        - G123 # TLS resumption may bypass VerifyPeerCertificate when VerifyConnection is unset\n        - G201 # SQL query construction using format string\n        - G202 # SQL query construction using string concatenation\n        - G203 # Use of unescaped data in HTML templates\n        - G204 # Audit use of command execution\n        - G301 # Poor file permissions used when creating a directory\n        - G302 # Poor file permissions used when creation file or using chmod\n        - G303 # Creating tempfile using a predictable path\n        - G304 # File path provided as taint input\n        - G305 # File path traversal when extracting zip archive\n        - G306 # Poor file permissions used when writing to a file\n        - G307 # Poor file permissions used when creating a file with os.Create\n        - G401 # Detect the usage of MD5 or SHA1\n        - G402 # Look for bad TLS connection settings\n        - G403 # Ensure minimum RSA key length of 2048 bits\n        - G404 # Insecure random number source (rand)\n        - G405 # Detect the usage of DES or RC4\n        - G406 # Detect the usage of deprecated MD4 or RIPEMD160\n        - G408 # Stateful misuse of ssh.PublicKeyCallback leading to auth bypass\n        - G501 # Import blocklist: crypto/md5\n        - G502 # Import blocklist: crypto/des\n        - G503 # Import blocklist: crypto/rc4\n        - G504 # Import blocklist: net/http/cgi\n        - G505 # Import blocklist: crypto/sha1\n        - G506 # Import blocklist: golang.org/x/crypto/md4\n        - G507 # Import blocklist: golang.org/x/crypto/ripemd160\n        - G601 # Implicit memory aliasing in RangeStmt\n        - G602 # Possible slice bounds out of range\n        - G701 # SQL injection via taint analysis\n        - G702 # Command injection via taint analysis\n        - G703 # Path traversal via taint analysis\n        - G704 # SSRF via taint analysis\n        - G705 # XSS via taint analysis\n        - G706 # Log injection via taint analysis\n        - G707 # SMTP command/header injection via taint analysis\n\n      # To specify a set of rules to explicitly exclude.\n      # Available rules: https://github.com/securego/gosec#available-rules\n      # Default: []\n      excludes:\n        - G101 # Look for hardcoded credentials\n        - G102 # Bind to all interfaces\n        - G103 # Audit the use of unsafe block\n        - G104 # Audit errors not checked\n        - G106 # Audit the use of ssh.InsecureIgnoreHostKey function\n        - G107 # Url provided to HTTP request as taint input\n        - G108 # Profiling endpoint is automatically exposed\n        - G109 # Converting strconv.Atoi result to int32/int16\n        - G110 # Detect io.Copy instead of io.CopyN when decompression\n        - G111 # Detect http.Dir('/') as a potential risk\n        - G112 # Detect ReadHeaderTimeout not configured as a potential risk\n        - G114 # Use of net/http serve function that has no support for setting timeouts\n        - G115 # Type conversion which leads to integer overflow\n        - G116 # Detect Trojan Source attacks using bidirectional Unicode characters\n        - G201 # SQL query construction using format string\n        - G202 # SQL query construction using string concatenation\n        - G203 # Use of unescaped data in HTML templates\n        - G204 # Audit use of command execution\n        - G301 # Poor file permissions used when creating a directory\n        - G302 # Poor file permissions used when creation file or using chmod\n        - G303 # Creating tempfile using a predictable path\n        - G304 # File path provided as taint input\n        - G305 # File path traversal when extracting zip archive\n        - G306 # Poor file permissions used when writing to a file\n        - G307 # Poor file permissions used when creating a file with os.Create\n        - G401 # Detect the usage of MD5 or SHA1\n        - G402 # Look for bad TLS connection settings\n        - G403 # Ensure minimum RSA key length of 2048 bits\n        - G404 # Insecure random number source (rand)\n        - G405 # Detect the usage of DES or RC4\n        - G406 # Detect the usage of deprecated MD4 or RIPEMD160\n        - G501 # Import blocklist: crypto/md5\n        - G502 # Import blocklist: crypto/des\n        - G503 # Import blocklist: crypto/rc4\n        - G504 # Import blocklist: net/http/cgi\n        - G505 # Import blocklist: crypto/sha1\n        - G506 # Import blocklist: golang.org/x/crypto/md4\n        - G507 # Import blocklist: golang.org/x/crypto/ripemd160\n        - G601 # Implicit memory aliasing in RangeStmt\n        - G602 # Possible slice bounds out of range\n\n      # Filter out the issues with a lower severity than the given value.\n      # Valid options are: low, medium, high.\n      # Default: low\n      severity: medium\n\n      # Filter out the issues with a lower confidence than the given value.\n      # Valid options are: low, medium, high.\n      # Default: low\n      confidence: medium\n\n      # Concurrency value.\n      # Default: the number of logical CPUs usable by the current process.\n      concurrency: 12\n\n      # To specify the configuration of rules.\n      config:\n        # Globals are applicable to all rules.\n        global:\n          # If true, ignore #nosec in comments (and an alternative as well).\n          # Default: false\n          nosec: true\n          # Add an alternative comment prefix to #nosec (both will work at the same time).\n          # Default: \"\"\n          \"#nosec\": \"#my-custom-nosec\"\n          # Define whether nosec issues are counted as finding or not.\n          # Default: false\n          show-ignored: true\n          # Audit mode enables addition checks that for normal code analysis might be too nosy.\n          # Default: false\n          audit: true\n        G101:\n          # Regexp pattern for variables and constants to find.\n          # Default: \"(?i)passwd|pass|password|pwd|secret|token|pw|apiKey|bearer|cred\"\n          pattern: \"(?i)example\"\n          # If true, complain about all cases (even with low entropy).\n          # Default: false\n          ignore_entropy: false\n          # Maximum allowed entropy of the string.\n          # Default: \"80.0\"\n          entropy_threshold: \"80.0\"\n          # Maximum allowed value of entropy/string length.\n          # Is taken into account if entropy >= entropy_threshold/2.\n          # Default: \"3.0\"\n          per_char_threshold: \"3.0\"\n          # Calculate entropy for first N chars of the string.\n          # Default: \"16\"\n          truncate: \"32\"\n        # Additional functions to ignore while checking unhandled errors.\n        # Following functions always ignored:\n        #   bytes.Buffer:\n        #     - Write\n        #     - WriteByte\n        #     - WriteRune\n        #     - WriteString\n        #   fmt:\n        #     - Print\n        #     - Printf\n        #     - Println\n        #     - Fprint\n        #     - Fprintf\n        #     - Fprintln\n        #   strings.Builder:\n        #     - Write\n        #     - WriteByte\n        #     - WriteRune\n        #     - WriteString\n        #   io.PipeWriter:\n        #     - CloseWithError\n        #   hash.Hash:\n        #     - Write\n        #   os:\n        #     - Unsetenv\n        # Default: {}\n        G104:\n          fmt:\n            - Fscanf\n        G111:\n          # Regexp pattern to find potential directory traversal.\n          # Default: \"http\\\\.Dir\\\\(\\\"\\\\/\\\"\\\\)|http\\\\.Dir\\\\('\\\\/'\\\\)\"\n          pattern: \"custom\\\\.Dir\\\\(\\\\)\"\n        # Maximum allowed permissions mode for os.Mkdir and os.MkdirAll.\n        # Default: \"0750\"\n        G301: \"0750\"\n        # Maximum allowed permissions mode for os.OpenFile and os.Chmod.\n        # Default: \"0600\"\n        G302: \"0600\"\n        # Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile.\n        # Default: \"0600\"\n        G306: \"0600\"\n\n    gosmopolitan:\n      # Allow and ignore `time.Local` usages.\n      #\n      # Default: false\n      allow-time-local: true\n      # List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".\n      # String literals inside call-like expressions to, or struct literals of those names,\n      # are exempt from the writing system check.\n      #\n      # Default: []\n      escape-hatches:\n        - 'github.com/nicksnyder/go-i18n/v2/i18n.Message'\n        - 'example.com/your/project/i18n/markers.Raw'\n        - 'example.com/your/project/i18n/markers.OK'\n        - 'example.com/your/project/i18n/markers.TODO'\n        - 'command-line-arguments.Simple'\n      # List of Unicode scripts to watch for any usage in string literals.\n      # https://pkg.go.dev/unicode#pkg-variables\n      #\n      # Default: [\"Han\"]\n      watch-for-scripts:\n        - Devanagari\n        - Han\n        - Hangul\n        - Hiragana\n        - Katakana\n\n    govet:\n      # Disable all analyzers.\n      # Default: false\n      disable-all: true\n      # Enable analyzers by name.\n      # (In addition to default:\n      #   appends, asmdecl, assign, atomic, bools, buildtag, cgocall, composites, copylocks, defers, directive, errorsas,\n      #   framepointer, httpresponse, ifaceassert, loopclosure, lostcancel, nilfunc, printf, shift, sigchanyzer, slog,\n      #   stdmethods, stringintconv, structtag, testinggoroutine, tests, timeformat, unmarshal, unreachable, unsafeptr,\n      #   unusedresult\n      # ).\n      # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.\n      # Default: []\n      enable:\n        # Check for missing values after append.\n        - appends\n        # Report mismatches between assembly files and Go declarations.\n        - asmdecl\n        # Check for useless assignments.\n        - assign\n        # Check for common mistakes using the sync/atomic package.\n        - atomic\n        # Check for non-64-bits-aligned arguments to sync/atomic functions.\n        - atomicalign\n        # Check for common mistakes involving boolean operators.\n        - bools\n        # Check //go:build and // +build directives.\n        - buildtag\n        # Detect some violations of the cgo pointer passing rules.\n        - cgocall\n        # Check for unkeyed composite literals.\n        - composites\n        # Check for locks erroneously passed by value.\n        - copylocks\n        # Check for calls of reflect.DeepEqual on error values.\n        - deepequalerrors\n        # Report common mistakes in defer statements.\n        - defers\n        # Check Go toolchain directives such as //go:debug.\n        - directive\n        # Report passing non-pointer or non-error values to errors.As.\n        - errorsas\n        # Find structs that would use less memory if their fields were sorted.\n        - fieldalignment\n        # Find calls to a particular function.\n        - findcall\n        # Report assembly that clobbers the frame pointer before saving it.\n        - framepointer\n        # Check format of addresses passed to net.Dial.\n        - hostport\n        # Report using Go 1.22 enhanced ServeMux patterns in older Go versions.\n        - httpmux\n        # Check for mistakes using HTTP responses.\n        - httpresponse\n        # Detect impossible interface-to-interface type assertions.\n        - ifaceassert\n        # Check references to loop variables from within nested functions.\n        - loopclosure\n        # Check cancel func returned by context.WithCancel is called.\n        - lostcancel\n        # Check for useless comparisons between functions and nil.\n        - nilfunc\n        # Check for redundant or impossible nil comparisons.\n        - nilness\n        # Check consistency of Printf format strings and arguments.\n        - printf\n        # Check for comparing reflect.Value values with == or reflect.DeepEqual.\n        - reflectvaluecompare\n        # Check for possible unintended shadowing of variables.\n        - shadow\n        # Check for shifts that equal or exceed the width of the integer.\n        - shift\n        # Check for unbuffered channel of os.Signal.\n        - sigchanyzer\n        # Check for invalid structured logging calls.\n        - slog\n        # Check the argument type of sort.Slice.\n        - sortslice\n        # Check signature of methods of well-known interfaces.\n        - stdmethods\n        # Report uses of too-new standard library symbols.\n        - stdversion\n        # Check for string(int) conversions.\n        - stringintconv\n        # Check that struct field tags conform to reflect.StructTag.Get.\n        - structtag\n        # Report calls to (*testing.T).Fatal from goroutines started by a test.\n        - testinggoroutine\n        # Check for common mistaken usages of tests and examples.\n        - tests\n        # Check for calls of (time.Time).Format or time.Parse with 2006-02-01.\n        - timeformat\n        # Report passing non-pointer or non-interface values to unmarshal.\n        - unmarshal\n        # Check for unreachable code.\n        - unreachable\n        # Check for invalid conversions of uintptr to unsafe.Pointer.\n        - unsafeptr\n        # Check for unused results of calls to some functions.\n        - unusedresult\n        # Checks for unused writes.\n        - unusedwrite\n        # Check for misuses of sync.WaitGroup.\n        - waitgroup\n\n      # Enable all analyzers.\n      # Default: false\n      enable-all: true\n      # Disable analyzers by name.\n      # (In addition to default\n      #   atomicalign, deepequalerrors, fieldalignment, findcall, nilness, reflectvaluecompare, shadow, sortslice,\n      #   timeformat, unusedwrite\n      # ).\n      # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.\n      # Default: []\n      disable:\n        - appends\n        - asmdecl\n        - assign\n        - atomic\n        - atomicalign\n        - bools\n        - buildtag\n        - cgocall\n        - composites\n        - copylocks\n        - deepequalerrors\n        - defers\n        - directive\n        - errorsas\n        - fieldalignment\n        - findcall\n        - framepointer\n        - hostport\n        - httpmux\n        - httpresponse\n        - ifaceassert\n        - loopclosure\n        - lostcancel\n        - nilfunc\n        - nilness\n        - printf\n        - reflectvaluecompare\n        - shadow\n        - shift\n        - sigchanyzer\n        - slog\n        - sortslice\n        - stdmethods\n        - stdversion\n        - stringintconv\n        - structtag\n        - testinggoroutine\n        - tests\n        - timeformat\n        - unmarshal\n        - unreachable\n        - unsafeptr\n        - unusedresult\n        - unusedwrite\n        - waitgroup\n\n      # Settings per analyzer.\n      settings:\n        # Analyzer name, run `go tool vet help` to see all analyzers.\n        printf:\n          # Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`).\n          # Default: []\n          funcs:\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Infof\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Warnf\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Errorf\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Fatalf\n        shadow:\n          # Whether to be strict about shadowing; can be noisy.\n          # Default: false\n          strict: true\n        unusedresult:\n          # Comma-separated list of functions whose results must be used.\n          # (In addition to default:\n          #   context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue, errors.New, fmt.Errorf,\n          #   fmt.Sprint, fmt.Sprintf, sort.Reverse\n          # ).\n          # Default: []\n          funcs:\n            - pkg.MyFunc\n          # Comma-separated list of names of methods of type func() string whose results must be used.\n          # (In addition to default Error,String).\n          # Default: []\n          stringmethods:\n            - MyMethod\n\n    grouper:\n      # Require the use of a single global 'const' declaration only.\n      # Default: false\n      const-require-single-const: true\n      # Require the use of grouped global 'const' declarations.\n      # Default: false\n      const-require-grouping: true\n\n      # Require the use of a single 'import' declaration only.\n      # Default: false\n      import-require-single-import: true\n      # Require the use of grouped 'import' declarations.\n      # Default: false\n      import-require-grouping: true\n\n      # Require the use of a single global 'type' declaration only.\n      # Default: false\n      type-require-single-type: true\n      # Require the use of grouped global 'type' declarations.\n      # Default: false\n      type-require-grouping: true\n\n      # Require the use of a single global 'var' declaration only.\n      # Default: false\n      var-require-single-var: true\n      # Require the use of grouped global 'var' declarations.\n      # Default: false\n      var-require-grouping: true\n\n    iface:\n      # List of analyzers.\n      # Default: [\"identical\"]\n      enable:\n        - identical # Identifies interfaces in the same package that have identical method sets.\n        - unused # Identifies interfaces that are not used anywhere in the same package where the interface is defined.\n        - opaque # Identifies functions that return interfaces, but the actual returned value is always a single concrete implementation.\n        - unexported # Identifies interfaces that are not exported but are used in exported functions or methods.\n      settings:\n        unused:\n          # List of packages path to exclude from the check.\n          # Default: []\n          exclude:\n            - github.com/example/log\n\n    importas:\n      # Do not allow unaliased imports of aliased packages.\n      # Default: false\n      no-unaliased: true\n      # Do not allow non-required aliases.\n      # Default: false\n      no-extra-aliases: true\n      # List of aliases\n      # Default: []\n      alias:\n        # Using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package.\n        - pkg: knative.dev/serving/pkg/apis/serving/v1\n          alias: servingv1\n        # Using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package.\n        - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1\n          alias: autoscalingv1alpha1\n        # You can specify the package path by regular expression,\n        # and alias by regular expression expansion syntax like below.\n        # See https://github.com/julz/importas#use-regular-expression for details.\n        - pkg: knative.dev/serving/pkg/apis/(\\w+)/(v[\\w\\d]+)\n          alias: $1$2\n        # An explicit empty alias can be used to ensure no aliases are used for a package.\n        # This can be useful if `no-extra-aliases: true` doesn't fit your need.\n        # Multiple packages can use an empty alias.\n        - pkg: errors\n          alias: \"\"\n\n    inamedparam:\n      # Skips check for interface methods with only a single parameter.\n      # Default: false\n      skip-single-param: true\n\n    ineffassign:\n      # Check escaping variables of type error, may cause false positives.\n      # Default: false\n      check-escaping-errors: true\n\n    interfacebloat:\n      # The maximum number of methods allowed for an interface.\n      # Default: 10\n      max: 5\n\n    iotamixing:\n      # Whether to report individual consts rather than just the const block.\n      # Default: false\n      report-individual: true\n\n    ireturn:\n      # List of interfaces to allow.\n      # Lists of the keywords and regular expressions matched to interface or package names can be used.\n      # `allow` and `reject` settings cannot be used at the same time.\n      #\n      # Keywords:\n      # - `empty` for `interface{}`\n      # - `error` for errors\n      # - `stdlib` for standard library\n      # - `anon` for anonymous interfaces\n      # - `generic` for generic interfaces added in go 1.18\n      #\n      # Default: [anon, error, empty, stdlib]\n      allow:\n        - anon\n        # You can specify idiomatic endings for interface\n        - (or|er)$\n\n      # List of interfaces to reject.\n      # Lists of the keywords and regular expressions matched to interface or package names can be used.\n      # `allow` and `reject` settings cannot be used at the same time.\n      #\n      # Keywords:\n      # - `empty` for `interface{}`\n      # - `error` for errors\n      # - `stdlib` for standard library\n      # - `anon` for anonymous interfaces\n      # - `generic` for generic interfaces added in go 1.18\n      #\n      # Default: []\n      reject:\n        - github.com\\/user\\/package\\/v4\\.Type\n\n    lll:\n      # Max line length, lines longer will be reported.\n      # '\\t' is counted as 1 character by default, and can be changed with the tab-width option.\n      # Default: 120.\n      line-length: 120\n      # Tab width in spaces.\n      # Default: 1\n      tab-width: 1\n\n    loggercheck:\n      # Allow check for the github.com/go-kit/log library.\n      # Default: true\n      kitlog: false\n      # Allow check for the k8s.io/klog/v2 library.\n      # Default: true\n      klog: false\n      # Allow check for the github.com/go-logr/logr library.\n      # Default: true\n      logr: false\n      # Allow check for the log/slog library.\n      # Default: true\n      slog: false\n      # Allow check for the \"sugar logger\" from go.uber.org/zap library.\n      # Default: true\n      zap: false\n      # Require all logging keys to be inlined constant strings.\n      # Default: false\n      require-string-key: true\n      # Require printf-like format specifier (%s, %d for example) not present.\n      # Default: false\n      no-printf-like: true\n      # List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\n      # For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt\n      # Default: empty\n      rules:\n        - k8s.io/klog/v2.InfoS   # package level exported functions\n        - (github.com/go-logr/logr.Logger).Error  # \"Methods\"\n        - (*go.uber.org/zap.SugaredLogger).With  # Also \"Methods\", but with a pointer receiver\n\n    maintidx:\n      # Show functions with maintainability index lower than N.\n      # A high index indicates better maintainability (it's kind of the opposite of complexity).\n      # Default: 20\n      under: 100\n\n    makezero:\n      # Allow only slices initialized with a length of zero.\n      # Default: false\n      always: true\n\n    misspell:\n      # Correct spellings using locale preferences for US or UK.\n      # Setting locale to US will correct the British spelling of 'colour' to 'color'.\n      # Default is to use a neutral variety of English.\n      locale: US\n      # Typos to ignore.\n      # Should be in lower case.\n      # Default: []\n      ignore-rules:\n        - someword\n      # Extra word corrections.\n      # `typo` and `correction` should only contain letters.\n      # The words are case-insensitive.\n      # Default: []\n      extra-words:\n        - typo: \"iff\"\n          correction: \"if\"\n        - typo: \"cancelation\"\n          correction: \"cancellation\"\n      # Mode of the analysis:\n      # - default: checks all the file content.\n      # - restricted: checks only comments.\n      # Default: \"\"\n      mode: restricted\n\n    mnd:\n      # List of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\n      # Default: [\"argument\", \"case\", \"condition\", \"operation\", \"return\", \"assign\"]\n      checks:\n        - argument\n        - case\n        - condition\n        - operation\n        - return\n        - assign\n      # List of numbers to exclude from analysis.\n      # The numbers should be written as string.\n      # Values always ignored: \"1\", \"1.0\", \"0\" and \"0.0\".\n      # Default: []\n      ignored-numbers:\n        - '0666'\n        - '0755'\n        - '42'\n      # List of file patterns to exclude from analysis.\n      # Values always ignored: `.+_test.go`.\n      # Default: []\n      ignored-files:\n        - 'magic1_.+\\.go$'\n      # List of function patterns to exclude from analysis.\n      # Following functions are always ignored: `time.Date`,\n      # `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`,\n      # `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`.\n      # Default: []\n      ignored-functions:\n        - '^math\\.'\n        - '^http\\.StatusText$'\n\n    modernize:\n      # List of analyzers to disable.\n      # By default, all analyzers are enabled.\n      disable:\n        # Replace interface{} with any.\n        - any\n        # Replace []byte(fmt.Sprintf) with fmt.Appendf.\n        - fmtappendf\n        # Remove redundant re-declaration of loop variables.\n        - forvar\n        # Replace explicit loops over maps with calls to maps package.\n        - mapsloop\n        # Replace if/else statements with calls to min or max.\n        - minmax\n        # Simplify code by using go1.26's new(expr).\n        - newexpr\n        # Suggest replacing omitempty with omitzero for struct fields.\n        - omitzero\n        # Remove obsolete //+build comments.\n        - plusbuild\n        # Replace 3-clause for loops with for-range over integers.\n        - rangeint\n        # Replace reflect.TypeOf(x) with TypeFor[T]().\n        - reflecttypefor\n        # Replace loops with slices.Contains or slices.ContainsFunc.\n        - slicescontains\n        # Replace sort.Slice with slices.Sort for basic types.\n        - slicessort\n        # Use iterators instead of Len/At-style APIs.\n        - stditerators\n        # Replace strings.Index etc. with strings.Cut.\n        - stringscut\n        # Replace HasPrefix/TrimPrefix with CutPrefix.\n        - stringscutprefix\n        # Replace ranging over Split/Fields with SplitSeq/FieldsSeq.\n        - stringsseq\n        # Replace += with strings.Builder.\n        - stringsbuilder\n        # Replace context.WithCancel with t.Context in tests.\n        - testingcontext\n        # Replace unsafe pointer arithmetic with function calls.\n        - unsafefuncs\n        # Replace wg.Add(1)/go/wg.Done() with wg.Go.\n        - waitgroup\n\n    musttag:\n      # A set of custom functions to check in addition to the builtin ones.\n      # Default: json, xml, gopkg.in/yaml.v3, BurntSushi/toml, mitchellh/mapstructure, jmoiron/sqlx\n      functions:\n        # The full name of the function, including the package.\n        - name: github.com/hashicorp/hcl/v2/hclsimple.DecodeFile\n          # The struct tag whose presence should be ensured.\n          tag: hcl\n          # The position of the argument to check.\n          arg-pos: 2\n\n    nakedret:\n      # Make an issue if func has more lines of code than this setting, and it has naked returns.\n      # Default: 30\n      max-func-lines: 31\n\n    nestif:\n      # Minimal complexity of if statements to report.\n      # Default: 5\n      min-complexity: 4\n\n    nilnil:\n      # To check functions with only two return values (`return nil, nil`).\n      # If disabled then returns like `return nil, nil, ..., nil` are supported.\n      # Default: true\n      only-two: false\n      # In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\n      # E.g, `return clone, fh.indexer.Update(clone)` will be considered as invalid.\n      # Default: false\n      detect-opposite: true\n      # List of return types to check.\n      # Default: [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n      checked-types:\n        - chan\n        - func\n        - iface\n        - map\n        - ptr\n        - uintptr\n        - unsafeptr\n\n    nlreturn:\n      # Size of the block (including return statement that is still \"OK\"),\n      # so no return split required.\n      # Default: 1\n      block-size: 2\n\n    nolintlint:\n      # Disable to ensure that all nolint directives actually have an effect.\n      # Default: false\n      allow-unused: true\n      # Exclude following linters from requiring an explanation.\n      # Default: []\n      allow-no-explanation: [ ]\n      # Enable to require an explanation of nonzero length after each nolint directive.\n      # Default: false\n      require-explanation: true\n      # Enable to require nolint directives to mention the specific linter being suppressed.\n      # Default: false\n      require-specific: true\n\n    nonamedreturns:\n      # Report named error if it is assigned inside defer.\n      # Default: false\n      report-error-in-defer: true\n\n    paralleltest:\n      # Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\n      # Default: false\n      ignore-missing: true\n      # Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are\n      # still required to have `t.Parallel`, but subtests are allowed to skip it.\n      # Default: false\n      ignore-missing-subtests: true\n\n    perfsprint:\n      # Enable/disable optimization of integer formatting.\n      # Default: true\n      integer-format: false\n      # Optimizes even if it requires an int or uint type cast.\n      # Default: true\n      int-conversion: false\n      # Enable/disable optimization of error formatting.\n      # Default: true\n      error-format: false\n      # Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\n      # Default: false\n      err-error: true\n      # Optimizes `fmt.Errorf`.\n      # Default: true\n      errorf: false\n      # Enable/disable optimization of string formatting.\n      # Default: true\n      string-format: false\n      # Optimizes `fmt.Sprintf` with only one argument.\n      # Default: true\n      sprintf1: false\n      # Optimizes into strings concatenation.\n      # Default: true\n      strconcat: false\n      # Enable/disable optimization of bool formatting.\n      # Default: true\n      bool-format: false\n      # Enable/disable optimization of hex formatting.\n      # Default: true\n      hex-format: false\n      # Enable/disable optimization of concat loop.\n      # Default: true\n      concat-loop: false\n      # Optimization of `concat-loop` even with other operations.\n      # Default: false\n      loop-other-ops: true\n\n    prealloc:\n      # IMPORTANT: we don't recommend using this linter before doing performance profiling.\n      # For most programs usage of prealloc will be a premature optimization.\n\n      # Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\n      # Default: true\n      simple: false\n      # Report pre-allocation suggestions on range loops.\n      # Default: true\n      range-loops: false\n      # Report pre-allocation suggestions on for loops.\n      # Default: false\n      for-loops: true\n\n    predeclared:\n      # List of predeclared identifiers to not report on.\n      # Default: []\n      ignore:\n        - new\n        - int\n      # Include method names and field names in checks.\n      # Default: false\n      qualified-name: true\n\n    promlinter:\n      # Promlinter cannot infer all metrics name in static analysis.\n      # Enable strict mode will also include the errors caused by failing to parse the args.\n      # Default: false\n      strict: true\n      # Please refer to https://github.com/yeya24/promlinter#usage for detailed usage.\n      # Default: []\n      disabled-linters:\n        # Help detects issues related to the help text for a metric.\n        - Help\n        # MetricUnits detects issues with metric unit names.\n        - MetricUnits\n        # Counter detects issues specific to counters, as well as patterns that should only be used with counters.\n        - Counter\n        # HistogramSummaryReserved detects when other types of metrics use names or labels reserved for use by histograms and/or summaries.\n        - HistogramSummaryReserved\n        # MetricTypeInName detects when metric types are included in the metric name.\n        - MetricTypeInName\n        # ReservedChars detects colons in metric names.\n        - ReservedChars\n        # CamelCase detects metric names and label names written in camelCase.\n        - CamelCase\n        # UnitAbbreviations detects abbreviated units in the metric name.\n        - UnitAbbreviations\n\n    protogetter:\n      # Skip files generated by specified generators from the checking.\n      # Checks only the file's initial comment, which must follow the format: \"// Code generated by <generator-name>\".\n      # Files generated by protoc-gen-go, protoc-gen-go-grpc, and protoc-gen-grpc-gateway are always excluded automatically.\n      # Default: []\n      skip-generated-by: [\"protoc-gen-go-my-own-generator\"]\n      # Skip files matching the specified glob pattern from the checking.\n      # Default: []\n      skip-files:\n        - \"*.pb.go\"\n        - \"*/vendor/*\"\n        - \"/full/path/to/file.go\"\n      # Skip any generated files from the checking.\n      # Default: false\n      skip-any-generated: true\n      # Skip first argument of append function.\n      # Default: false\n      replace-first-arg-in-append: true\n\n    reassign:\n      # Patterns for global variable names that are checked for reassignment.\n      # See https://github.com/curioswitch/go-reassign#usage\n      # Default: [\"EOF\", \"Err.*\"]\n      patterns:\n        - \".*\"\n\n    recvcheck:\n      # Disables the built-in method exclusions:\n      # - `MarshalText`\n      # - `MarshalJSON`\n      # - `MarshalYAML`\n      # - `MarshalXML`\n      # - `MarshalBinary`\n      # - `GobEncode`\n      # Default: false\n      disable-builtin: true\n      # User-defined method exclusions.\n      # The format is `struct_name.method_name` (ex: `Foo.MethodName`).\n      # A wildcard `*` can use as a struct name (ex: `*.MethodName`).\n      # Default: []\n      exclusions:\n        - \"*.Value\"\n\n    revive:\n      # Maximum number of open files at the same time.\n      # See https://github.com/mgechev/revive#command-line-flags\n      # Defaults to unlimited.\n      max-open-files: 2048\n\n      # Sets the default severity.\n      # See https://github.com/mgechev/revive#configuration\n      # Default: warning\n      severity: error\n\n      # Enable all available rules.\n      # Default: false\n      enable-all-rules: true\n\n      # By default, the default rules are enabled,\n      # but if you explicitly define or configure a rule, the default rules will be disabled.\n      # This option, when set to `true`, allows you to avoid explicitly redefining default rules when adding a rule.\n      # Default: false\n      enable-default-rules: true\n\n      # Enable validation of comment directives.\n      # See https://github.com/mgechev/revive#comment-directives\n      directives:\n        - name: specify-disable-reason\n          severity: error\n\n      # Sets the default failure confidence.\n      # This means that linting errors with less than 0.8 confidence will be ignored.\n      # Default: 0.8\n      confidence: 0.1\n      # Revive handles the default rules in a way that can be unexpected:\n      # - If there are no explicit rules, the default rules are used.\n      # - If there is at least one explicit rule, the default rules are not used, unless `enable-default-rules` is `true`.\n      # Run `GL_DEBUG=revive golangci-lint run --enable-only=revive` to see default, all available rules, and enabled rules.\n      rules:\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#add-constant\n        - name: add-constant\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - max-lit-count: \"3\"\n              allow-strs: '\"\"'\n              allow-ints: \"0,1,2\"\n              allow-floats: \"0.0,0.,1.0,1.,2.0,2.\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#argument-limit\n        - name: argument-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 4 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#atomic\n        - name: atomic\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#banned-characters\n        - name: banned-characters\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ \"Ω\",\"Σ\",\"σ\", \"7\" ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bare-return\n        - name: bare-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#blank-imports\n        - name: blank-imports\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bool-literal-in-expr\n        - name: bool-literal-in-expr\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#call-to-gc\n        - name: call-to-gc\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cognitive-complexity\n        - name: cognitive-complexity\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 7 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comment-spacings\n        - name: comment-spacings\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - mypragma\n            - otherpragma\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comments-density\n        - name: comments-density\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 15 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-naming\n        - name: confusing-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-results\n        - name: confusing-results\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#constant-logical-expr\n        - name: constant-logical-expr\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-as-argument\n        - name: context-as-argument\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allow-types-before: \"*testing.T,*github.com/user/repo/testing.Harness\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-keys-type\n        - name: context-keys-type\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cyclomatic\n        - name: cyclomatic\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#datarace\n        - name: datarace\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#deep-exit\n        - name: deep-exit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#defer\n        - name: defer\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"call-chain\"\n            - \"loop\"\n            - \"method-call\"\n            - \"recover\"\n            - \"immediate-recover\"\n            - \"return\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#dot-imports\n        - name: dot-imports\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allowed-packages: [\"github.com/onsi/ginkgo/v2\", \"github.com/onsi/gomega\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#duplicated-imports\n        - name: duplicated-imports\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#early-return\n        - name: early-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"preserve-scope\"\n            - \"allow-jump\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-block\n        - name: empty-block\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-lines\n        - name: empty-lines\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-map-style\n        - name: enforce-map-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"make\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-repeated-arg-type-style\n        - name: enforce-repeated-arg-type-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"short\"\n            # Or this parameter:\n            - func-arg-style: \"full\"\n              func-ret-val-style: \"short\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-slice-style\n        - name: enforce-slice-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"make\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-switch-style\n        - name: enforce-switch-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ \"allowNoDefault\" ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#epoch-naming\n        - name: epoch-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-naming\n        - name: error-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-return\n        - name: error-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-strings\n        - name: error-strings\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"xerrors.New\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#errorf\n        - name: errorf\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#exported\n        - name: exported\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"check-private-receivers\"\n            - \"disable-stuttering-check\"\n            - \"say-repetitive-instead-of-stutters\"\n            - \"check-public-interface\"\n            - \"disable-checks-on-constants\"\n            - \"disable-checks-on-functions\"\n            - \"disable-checks-on-methods\"\n            - \"disable-checks-on-types\"\n            - \"disable-checks-on-variables\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-header\n        - name: file-header\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - This is the text that must appear at the top of source files.\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-length-limit\n        - name: file-length-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - max: 100\n              skip-comments: true\n              skip-blank-lines: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#filename-format\n        - name: filename-format\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"^[_a-z][_a-z0-9]*\\\\.go$\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#flag-parameter\n        - name: flag-parameter\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#forbidden-call-in-wg-go\n        - name: forbidden-call-in-wg-go\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-length\n        - name: function-length\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 10, 0 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-result-limit\n        - name: function-result-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#get-return\n        - name: get-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-branches\n        - name: identical-branches\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-branches\n        - name: identical-ifelseif-branches\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-conditions\n        - name: identical-ifelseif-conditions\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-branches\n        - name: identical-switch-branches\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-conditions\n        - name: identical-switch-conditions\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#if-return\n        - name: if-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-alias-naming\n        - name: import-alias-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"^[a-z][a-z0-9]{0,}$\"\n            # Or this parameter:\n            - allow-regex: \"^[a-z][a-z0-9]{0,}$\"\n              deny-regex: '^v\\d+$'\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-shadowing\n        - name: import-shadowing\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#imports-blocklist\n        - name: imports-blocklist\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"crypto/md5\"\n            - \"crypto/sha1\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#increment-decrement\n        - name: increment-decrement\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#indent-error-flow\n        - name: indent-error-flow\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"preserve-scope\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#inefficient-map-lookup\n        - name: inefficient-map-lookup\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#line-length-limit\n        - name: line-length-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 80 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-control-nesting\n        - name: max-control-nesting\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-public-structs\n        - name: max-public-structs\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-parameter\n        - name: modifies-parameter\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-value-receiver\n        - name: modifies-value-receiver\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#nested-structs\n        - name: nested-structs\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#optimize-operands-order\n        - name: optimize-operands-order\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-comments\n        - name: package-comments\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-directory-mismatch\n        - name: package-directory-mismatch\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - ignore-directories: [\"testcases\", \"testinfo\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-naming\n        - name: package-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - skip-convention-name-check: true\n              convention-name-check-regex: \"^[a-z][a-zA-Z0-9]*$\"\n              skip-top-level-check: true\n              skip-default-bad-name-check: true\n              check-extra-bad-name: true\n              user-defined-bad-names:\n                - foo\n                - bar\n              skip-collision-with-common-std: true\n              check-collision-with-all-std: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range\n        - name: range\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-address\n        - name: range-val-address\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-in-closure\n        - name: range-val-in-closure\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#receiver-naming\n        - name: receiver-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - max-length: 2\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redefines-builtin-id\n        - name: redefines-builtin-id\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-build-tag\n        - name: redundant-build-tag\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-import-alias\n        - name: redundant-import-alias\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-test-main-exit\n        - name: redundant-test-main-exit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-format\n        - name: string-format\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - - 'core.WriteError[1].Message'\n              - '/^([^A-Z]|$)/'\n              - must not start with a capital letter\n            - - 'fmt.Errorf[0]'\n              - '/(^|[^\\.!?])$/'\n              - must not end in punctuation\n            - - panic\n              - '/^[^\\n]*$/'\n              - must not contain line breaks\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-of-int\n        - name: string-of-int\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#struct-tag\n        - name: struct-tag\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"!validate\"\n            - \"json,inline\"\n            - \"bson,outline,gnu\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#superfluous-else\n        - name: superfluous-else\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"preserve-scope\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-date\n        - name: time-date\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-equal\n        - name: time-equal\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-naming\n        - name: time-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unchecked-type-assertion\n        - name: unchecked-type-assertion\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - accept-ignored-assertion-result: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unconditional-recursion\n        - name: unconditional-recursion\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-naming\n        - name: unexported-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-return\n        - name: unexported-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unhandled-error\n        - name: unhandled-error\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"^fmt.Printf\"\n            - \"myFunction\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-format\n        - name: unnecessary-format\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-if\n        - name: unnecessary-if\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-stmt\n        - name: unnecessary-stmt\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unreachable-code\n        - name: unreachable-code\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-slices-sort\n        - name: use-slices-sort\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unsecure-url-scheme\n        - name: unsecure-url-scheme\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-parameter\n        - name: unused-parameter\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allow-regex: \"^_\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-receiver\n        - name: unused-receiver\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allow-regex: \"^_\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-any\n        - name: use-any\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-errors-new\n        - name: use-errors-new\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-fmt-print\n        - name: use-fmt-print\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-slices-sort\n        - name: use-slices-sort\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-waitgroup-go\n        - name: use-waitgroup-go\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-break\n        - name: useless-break\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-fallthrough\n        - name: useless-fallthrough\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-declaration\n        - name: var-declaration\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-naming\n        - name: var-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - [ \"ID\" ] # AllowList\n            - [ \"VM\" ] # DenyList\n            - - skip-initialism-name-checks: true\n                upper-case-const: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#waitgroup-by-value\n        - name: waitgroup-by-value\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n\n    rowserrcheck:\n      # database/sql is always checked.\n      # Default: []\n      packages:\n        - github.com/jmoiron/sqlx\n\n    sloglint:\n      # Enforce not mixing key-value pairs and attributes.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-mixed-arguments\n      # Default: true\n      no-mixed-args: false\n      # Enforce using key-value pairs only (overrides no-mixed-args, incompatible with attr-only).\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-value-pairs-only\n      # Default: false\n      kv-only: true\n      # Enforce using attributes only (overrides no-mixed-args, incompatible with kv-only).\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#attributes-only\n      # Default: false\n      attr-only: true\n      # Enforce not using global loggers.\n      # Values:\n      # - \"\": disabled\n      # - \"all\": report all global loggers\n      # - \"default\": report only the default slog logger\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global\n      # Default: \"\"\n      no-global: \"all\"\n      # Enforce using methods that accept a context.\n      # Values:\n      # - \"\": disabled\n      # - \"all\": report all contextless calls\n      # - \"scope\": report only if a context exists in the scope of the outermost function\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only\n      # Default: \"\"\n      context: \"all\"\n      # Enforce using static values for log messages.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#static-messages\n      # Default: false\n      static-msg: true\n      # Enforce message style.\n      # Values: lowercased, capitalized\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#message-style\n      # Default: \"\"\n      msg-style: capitalized\n      # Enforce using constants instead of raw keys.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-raw-keys\n      # Default: false\n      no-raw-keys: true\n      # Enforce key naming convention.\n      # Values: snake, kebab, camel, pascal\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-naming-convention\n      # Default: \"\"\n      key-naming-case: snake\n      # Enforce not using specific keys.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#forbidden-keys\n      # Default: []\n      forbidden-keys:\n        - time\n        - level\n        - msg\n        - source\n        - foo\n      # Enforce putting arguments on separate lines.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#arguments-on-separate-lines\n      # Default: false\n      args-on-sep-lines: true\n\n    spancheck:\n      # Checks to enable.\n      # Options include:\n      # - `end`: check that `span.End()` is called\n      # - `record-error`: check that `span.RecordError(err)` is called when an error is returned\n      # - `set-status`: check that `span.SetStatus(codes.Error, msg)` is called when an error is returned\n      # Default: [\"end\"]\n      checks:\n        - end\n        - record-error\n        - set-status\n      # A list of regexes for function signatures that silence `record-error` and `set-status` reports\n      # if found in the call path to a returned error.\n      # https://github.com/jjti/go-spancheck#ignore-check-signatures\n      # Default: []\n      ignore-check-signatures:\n        - \"telemetry.RecordError\"\n      # A list of regexes for additional function signatures that create spans.\n      # This is useful if you have a utility method to create spans.\n      # Each entry should be of the form `<regex>:<telemetry-type>`, where `telemetry-type` can be `opentelemetry` or `opencensus`.\n      # https://github.com/jjti/go-spancheck#extra-start-span-signatures\n      # Default: []\n      extra-start-span-signatures:\n        - \"github.com/user/repo/telemetry/trace.Start:opentelemetry\"\n\n    staticcheck:\n      # https://staticcheck.dev/docs/configuration/options/#dot_import_whitelist\n      # Default: [\"github.com/mmcloughlin/avo/build\", \"github.com/mmcloughlin/avo/operand\", \"github.com/mmcloughlin/avo/reg\"]\n      dot-import-whitelist:\n        - fmt\n      # https://staticcheck.dev/docs/configuration/options/#initialisms\n      # Default: [\"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\"]\n      initialisms: [ \"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\" ]\n      # https://staticcheck.dev/docs/configuration/options/#http_status_code_whitelist\n      # Default: [\"200\", \"400\", \"404\", \"500\"]\n      http-status-code-whitelist: [ \"200\", \"400\", \"404\", \"500\" ]\n      # SAxxxx checks in https://staticcheck.dev/docs/configuration/options/#checks\n      # Example (to disable some checks): [ \"all\", \"-SA1000\", \"-SA1001\"]\n      # Run `GL_DEBUG=staticcheck golangci-lint run --enable=staticcheck` to see all available checks and enabled by config checks.\n      # Default: [\"all\", \"-ST1000\", \"-ST1003\", \"-ST1016\", \"-ST1020\", \"-ST1021\", \"-ST1022\"]\n      checks:\n        # Invalid regular expression.\n        # https://staticcheck.dev/docs/checks/#SA1000\n        - SA1000\n        # Invalid template.\n        # https://staticcheck.dev/docs/checks/#SA1001\n        - SA1001\n        # Invalid format in 'time.Parse'.\n        # https://staticcheck.dev/docs/checks/#SA1002\n        - SA1002\n        # Unsupported argument to functions in 'encoding/binary'.\n        # https://staticcheck.dev/docs/checks/#SA1003\n        - SA1003\n        # Suspiciously small untyped constant in 'time.Sleep'.\n        # https://staticcheck.dev/docs/checks/#SA1004\n        - SA1004\n        # Invalid first argument to 'exec.Command'.\n        # https://staticcheck.dev/docs/checks/#SA1005\n        - SA1005\n        # 'Printf' with dynamic first argument and no further arguments.\n        # https://staticcheck.dev/docs/checks/#SA1006\n        - SA1006\n        # Invalid URL in 'net/url.Parse'.\n        # https://staticcheck.dev/docs/checks/#SA1007\n        - SA1007\n        # Non-canonical key in 'http.Header' map.\n        # https://staticcheck.dev/docs/checks/#SA1008\n        - SA1008\n        # '(*regexp.Regexp).FindAll' called with 'n == 0', which will always return zero results.\n        # https://staticcheck.dev/docs/checks/#SA1010\n        - SA1010\n        # Various methods in the \"strings\" package expect valid UTF-8, but invalid input is provided.\n        # https://staticcheck.dev/docs/checks/#SA1011\n        - SA1011\n        # A nil 'context.Context' is being passed to a function, consider using 'context.TODO' instead.\n        # https://staticcheck.dev/docs/checks/#SA1012\n        - SA1012\n        # 'io.Seeker.Seek' is being called with the whence constant as the first argument, but it should be the second.\n        # https://staticcheck.dev/docs/checks/#SA1013\n        - SA1013\n        # Non-pointer value passed to 'Unmarshal' or 'Decode'.\n        # https://staticcheck.dev/docs/checks/#SA1014\n        - SA1014\n        # Using 'time.Tick' in a way that will leak. Consider using 'time.NewTicker', and only use 'time.Tick' in tests, commands and endless functions.\n        # https://staticcheck.dev/docs/checks/#SA1015\n        - SA1015\n        # Trapping a signal that cannot be trapped.\n        # https://staticcheck.dev/docs/checks/#SA1016\n        - SA1016\n        # Channels used with 'os/signal.Notify' should be buffered.\n        # https://staticcheck.dev/docs/checks/#SA1017\n        - SA1017\n        # 'strings.Replace' called with 'n == 0', which does nothing.\n        # https://staticcheck.dev/docs/checks/#SA1018\n        - SA1018\n        # Using a deprecated function, variable, constant or field.\n        # https://staticcheck.dev/docs/checks/#SA1019\n        - SA1019\n        # Using an invalid host:port pair with a 'net.Listen'-related function.\n        # https://staticcheck.dev/docs/checks/#SA1020\n        - SA1020\n        # Using 'bytes.Equal' to compare two 'net.IP'.\n        # https://staticcheck.dev/docs/checks/#SA1021\n        - SA1021\n        # Modifying the buffer in an 'io.Writer' implementation.\n        # https://staticcheck.dev/docs/checks/#SA1023\n        - SA1023\n        # A string cutset contains duplicate characters.\n        # https://staticcheck.dev/docs/checks/#SA1024\n        - SA1024\n        # It is not possible to use '(*time.Timer).Reset''s return value correctly.\n        # https://staticcheck.dev/docs/checks/#SA1025\n        - SA1025\n        # Cannot marshal channels or functions.\n        # https://staticcheck.dev/docs/checks/#SA1026\n        - SA1026\n        # Atomic access to 64-bit variable must be 64-bit aligned.\n        # https://staticcheck.dev/docs/checks/#SA1027\n        - SA1027\n        # 'sort.Slice' can only be used on slices.\n        # https://staticcheck.dev/docs/checks/#SA1028\n        - SA1028\n        # Inappropriate key in call to 'context.WithValue'.\n        # https://staticcheck.dev/docs/checks/#SA1029\n        - SA1029\n        # Invalid argument in call to a 'strconv' function.\n        # https://staticcheck.dev/docs/checks/#SA1030\n        - SA1030\n        # Overlapping byte slices passed to an encoder.\n        # https://staticcheck.dev/docs/checks/#SA1031\n        - SA1031\n        # Wrong order of arguments to 'errors.Is'.\n        # https://staticcheck.dev/docs/checks/#SA1032\n        - SA1032\n        # 'sync.WaitGroup.Add' called inside the goroutine, leading to a race condition.\n        # https://staticcheck.dev/docs/checks/#SA2000\n        - SA2000\n        # Empty critical section, did you mean to defer the unlock?.\n        # https://staticcheck.dev/docs/checks/#SA2001\n        - SA2001\n        # Called 'testing.T.FailNow' or 'SkipNow' in a goroutine, which isn't allowed.\n        # https://staticcheck.dev/docs/checks/#SA2002\n        - SA2002\n        # Deferred 'Lock' right after locking, likely meant to defer 'Unlock' instead.\n        # https://staticcheck.dev/docs/checks/#SA2003\n        - SA2003\n        # 'TestMain' doesn't call 'os.Exit', hiding test failures.\n        # https://staticcheck.dev/docs/checks/#SA3000\n        - SA3000\n        # Assigning to 'b.N' in benchmarks distorts the results.\n        # https://staticcheck.dev/docs/checks/#SA3001\n        - SA3001\n        # Binary operator has identical expressions on both sides.\n        # https://staticcheck.dev/docs/checks/#SA4000\n        - SA4000\n        # '&*x' gets simplified to 'x', it does not copy 'x'.\n        # https://staticcheck.dev/docs/checks/#SA4001\n        - SA4001\n        # Comparing unsigned values against negative values is pointless.\n        # https://staticcheck.dev/docs/checks/#SA4003\n        - SA4003\n        # The loop exits unconditionally after one iteration.\n        # https://staticcheck.dev/docs/checks/#SA4004\n        - SA4004\n        # Field assignment that will never be observed. Did you mean to use a pointer receiver?.\n        # https://staticcheck.dev/docs/checks/#SA4005\n        - SA4005\n        # A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?.\n        # https://staticcheck.dev/docs/checks/#SA4006\n        - SA4006\n        # The variable in the loop condition never changes, are you incrementing the wrong variable?.\n        # https://staticcheck.dev/docs/checks/#SA4008\n        - SA4008\n        # A function argument is overwritten before its first use.\n        # https://staticcheck.dev/docs/checks/#SA4009\n        - SA4009\n        # The result of 'append' will never be observed anywhere.\n        # https://staticcheck.dev/docs/checks/#SA4010\n        - SA4010\n        # Break statement with no effect. Did you mean to break out of an outer loop?.\n        # https://staticcheck.dev/docs/checks/#SA4011\n        - SA4011\n        # Comparing a value against NaN even though no value is equal to NaN.\n        # https://staticcheck.dev/docs/checks/#SA4012\n        - SA4012\n        # Negating a boolean twice ('!!b') is the same as writing 'b'. This is either redundant, or a typo.\n        # https://staticcheck.dev/docs/checks/#SA4013\n        - SA4013\n        # An if/else if chain has repeated conditions and no side-effects; if the condition didn't match the first time, it won't match the second time, either.\n        # https://staticcheck.dev/docs/checks/#SA4014\n        - SA4014\n        # Calling functions like 'math.Ceil' on floats converted from integers doesn't do anything useful.\n        # https://staticcheck.dev/docs/checks/#SA4015\n        - SA4015\n        # Certain bitwise operations, such as 'x ^ 0', do not do anything useful.\n        # https://staticcheck.dev/docs/checks/#SA4016\n        - SA4016\n        # Discarding the return values of a function without side effects, making the call pointless.\n        # https://staticcheck.dev/docs/checks/#SA4017\n        - SA4017\n        # Self-assignment of variables.\n        # https://staticcheck.dev/docs/checks/#SA4018\n        - SA4018\n        # Multiple, identical build constraints in the same file.\n        # https://staticcheck.dev/docs/checks/#SA4019\n        - SA4019\n        # Unreachable case clause in a type switch.\n        # https://staticcheck.dev/docs/checks/#SA4020\n        - SA4020\n        # \"x = append(y)\" is equivalent to \"x = y\".\n        # https://staticcheck.dev/docs/checks/#SA4021\n        - SA4021\n        # Comparing the address of a variable against nil.\n        # https://staticcheck.dev/docs/checks/#SA4022\n        - SA4022\n        # Impossible comparison of interface value with untyped nil.\n        # https://staticcheck.dev/docs/checks/#SA4023\n        - SA4023\n        # Checking for impossible return value from a builtin function.\n        # https://staticcheck.dev/docs/checks/#SA4024\n        - SA4024\n        # Integer division of literals that results in zero.\n        # https://staticcheck.dev/docs/checks/#SA4025\n        - SA4025\n        # Go constants cannot express negative zero.\n        # https://staticcheck.dev/docs/checks/#SA4026\n        - SA4026\n        # '(*net/url.URL).Query' returns a copy, modifying it doesn't change the URL.\n        # https://staticcheck.dev/docs/checks/#SA4027\n        - SA4027\n        # 'x % 1' is always zero.\n        # https://staticcheck.dev/docs/checks/#SA4028\n        - SA4028\n        # Ineffective attempt at sorting slice.\n        # https://staticcheck.dev/docs/checks/#SA4029\n        - SA4029\n        # Ineffective attempt at generating random number.\n        # https://staticcheck.dev/docs/checks/#SA4030\n        - SA4030\n        # Checking never-nil value against nil.\n        # https://staticcheck.dev/docs/checks/#SA4031\n        - SA4031\n        # Comparing 'runtime.GOOS' or 'runtime.GOARCH' against impossible value.\n        # https://staticcheck.dev/docs/checks/#SA4032\n        - SA4032\n        # Assignment to nil map.\n        # https://staticcheck.dev/docs/checks/#SA5000\n        - SA5000\n        # Deferring 'Close' before checking for a possible error.\n        # https://staticcheck.dev/docs/checks/#SA5001\n        - SA5001\n        # The empty for loop (\"for {}\") spins and can block the scheduler.\n        # https://staticcheck.dev/docs/checks/#SA5002\n        - SA5002\n        # Defers in infinite loops will never execute.\n        # https://staticcheck.dev/docs/checks/#SA5003\n        - SA5003\n        # \"for { select { ...\" with an empty default branch spins.\n        # https://staticcheck.dev/docs/checks/#SA5004\n        - SA5004\n        # The finalizer references the finalized object, preventing garbage collection.\n        # https://staticcheck.dev/docs/checks/#SA5005\n        - SA5005\n        # Infinite recursive call.\n        # https://staticcheck.dev/docs/checks/#SA5007\n        - SA5007\n        # Invalid struct tag.\n        # https://staticcheck.dev/docs/checks/#SA5008\n        - SA5008\n        # Invalid Printf call.\n        # https://staticcheck.dev/docs/checks/#SA5009\n        - SA5009\n        # Impossible type assertion.\n        # https://staticcheck.dev/docs/checks/#SA5010\n        - SA5010\n        # Possible nil pointer dereference.\n        # https://staticcheck.dev/docs/checks/#SA5011\n        - SA5011\n        # Passing odd-sized slice to function expecting even size.\n        # https://staticcheck.dev/docs/checks/#SA5012\n        - SA5012\n        # Using 'regexp.Match' or related in a loop, should use 'regexp.Compile'.\n        # https://staticcheck.dev/docs/checks/#SA6000\n        - SA6000\n        # Missing an optimization opportunity when indexing maps by byte slices.\n        # https://staticcheck.dev/docs/checks/#SA6001\n        - SA6001\n        # Storing non-pointer values in 'sync.Pool' allocates memory.\n        # https://staticcheck.dev/docs/checks/#SA6002\n        - SA6002\n        # Converting a string to a slice of runes before ranging over it.\n        # https://staticcheck.dev/docs/checks/#SA6003\n        - SA6003\n        # Inefficient string comparison with 'strings.ToLower' or 'strings.ToUpper'.\n        # https://staticcheck.dev/docs/checks/#SA6005\n        - SA6005\n        # Using io.WriteString to write '[]byte'.\n        # https://staticcheck.dev/docs/checks/#SA6006\n        - SA6006\n        # Defers in range loops may not run when you expect them to.\n        # https://staticcheck.dev/docs/checks/#SA9001\n        - SA9001\n        # Using a non-octal 'os.FileMode' that looks like it was meant to be in octal.\n        # https://staticcheck.dev/docs/checks/#SA9002\n        - SA9002\n        # Empty body in an if or else branch.\n        # https://staticcheck.dev/docs/checks/#SA9003\n        - SA9003\n        # Only the first constant has an explicit type.\n        # https://staticcheck.dev/docs/checks/#SA9004\n        - SA9004\n        # Trying to marshal a struct with no public fields nor custom marshaling.\n        # https://staticcheck.dev/docs/checks/#SA9005\n        - SA9005\n        # Dubious bit shifting of a fixed size integer value.\n        # https://staticcheck.dev/docs/checks/#SA9006\n        - SA9006\n        # Deleting a directory that shouldn't be deleted.\n        # https://staticcheck.dev/docs/checks/#SA9007\n        - SA9007\n        # 'else' branch of a type assertion is probably not reading the right value.\n        # https://staticcheck.dev/docs/checks/#SA9008\n        - SA9008\n        # Ineffectual Go compiler directive.\n        # https://staticcheck.dev/docs/checks/#SA9009\n        - SA9009\n        # Incorrect or missing package comment.\n        # https://staticcheck.dev/docs/checks/#ST1000\n        - ST1000\n        # Dot imports are discouraged.\n        # https://staticcheck.dev/docs/checks/#ST1001\n        - ST1001\n        # Poorly chosen identifier.\n        # https://staticcheck.dev/docs/checks/#ST1003\n        - ST1003\n        # Incorrectly formatted error string.\n        # https://staticcheck.dev/docs/checks/#ST1005\n        - ST1005\n        # Poorly chosen receiver name.\n        # https://staticcheck.dev/docs/checks/#ST1006\n        - ST1006\n        # A function's error value should be its last return value.\n        # https://staticcheck.dev/docs/checks/#ST1008\n        - ST1008\n        # Poorly chosen name for variable of type 'time.Duration'.\n        # https://staticcheck.dev/docs/checks/#ST1011\n        - ST1011\n        # Poorly chosen name for error variable.\n        # https://staticcheck.dev/docs/checks/#ST1012\n        - ST1012\n        # Should use constants for HTTP error codes, not magic numbers.\n        # https://staticcheck.dev/docs/checks/#ST1013\n        - ST1013\n        # A switch's default case should be the first or last case.\n        # https://staticcheck.dev/docs/checks/#ST1015\n        - ST1015\n        # Use consistent method receiver names.\n        # https://staticcheck.dev/docs/checks/#ST1016\n        - ST1016\n        # Don't use Yoda conditions.\n        # https://staticcheck.dev/docs/checks/#ST1017\n        - ST1017\n        # Avoid zero-width and control characters in string literals.\n        # https://staticcheck.dev/docs/checks/#ST1018\n        - ST1018\n        # Importing the same package multiple times.\n        # https://staticcheck.dev/docs/checks/#ST1019\n        - ST1019\n        # The documentation of an exported function should start with the function's name.\n        # https://staticcheck.dev/docs/checks/#ST1020\n        - ST1020\n        # The documentation of an exported type should start with type's name.\n        # https://staticcheck.dev/docs/checks/#ST1021\n        - ST1021\n        # The documentation of an exported variable or constant should start with variable's name.\n        # https://staticcheck.dev/docs/checks/#ST1022\n        - ST1022\n        # Redundant type in variable declaration.\n        # https://staticcheck.dev/docs/checks/#ST1023\n        - ST1023\n        # Use plain channel send or receive instead of single-case select.\n        # https://staticcheck.dev/docs/checks/#S1000\n        - S1000\n        # Replace for loop with call to copy.\n        # https://staticcheck.dev/docs/checks/#S1001\n        - S1001\n        # Omit comparison with boolean constant.\n        # https://staticcheck.dev/docs/checks/#S1002\n        - S1002\n        # Replace call to 'strings.Index' with 'strings.Contains'.\n        # https://staticcheck.dev/docs/checks/#S1003\n        - S1003\n        # Replace call to 'bytes.Compare' with 'bytes.Equal'.\n        # https://staticcheck.dev/docs/checks/#S1004\n        - S1004\n        # Drop unnecessary use of the blank identifier.\n        # https://staticcheck.dev/docs/checks/#S1005\n        - S1005\n        # Use \"for { ... }\" for infinite loops.\n        # https://staticcheck.dev/docs/checks/#S1006\n        - S1006\n        # Simplify regular expression by using raw string literal.\n        # https://staticcheck.dev/docs/checks/#S1007\n        - S1007\n        # Simplify returning boolean expression.\n        # https://staticcheck.dev/docs/checks/#S1008\n        - S1008\n        # Omit redundant nil check on slices, maps, and channels.\n        # https://staticcheck.dev/docs/checks/#S1009\n        - S1009\n        # Omit default slice index.\n        # https://staticcheck.dev/docs/checks/#S1010\n        - S1010\n        # Use a single 'append' to concatenate two slices.\n        # https://staticcheck.dev/docs/checks/#S1011\n        - S1011\n        # Replace 'time.Now().Sub(x)' with 'time.Since(x)'.\n        # https://staticcheck.dev/docs/checks/#S1012\n        - S1012\n        # Use a type conversion instead of manually copying struct fields.\n        # https://staticcheck.dev/docs/checks/#S1016\n        - S1016\n        # Replace manual trimming with 'strings.TrimPrefix'.\n        # https://staticcheck.dev/docs/checks/#S1017\n        - S1017\n        # Use \"copy\" for sliding elements.\n        # https://staticcheck.dev/docs/checks/#S1018\n        - S1018\n        # Simplify \"make\" call by omitting redundant arguments.\n        # https://staticcheck.dev/docs/checks/#S1019\n        - S1019\n        # Omit redundant nil check in type assertion.\n        # https://staticcheck.dev/docs/checks/#S1020\n        - S1020\n        # Merge variable declaration and assignment.\n        # https://staticcheck.dev/docs/checks/#S1021\n        - S1021\n        # Omit redundant control flow.\n        # https://staticcheck.dev/docs/checks/#S1023\n        - S1023\n        # Replace 'x.Sub(time.Now())' with 'time.Until(x)'.\n        # https://staticcheck.dev/docs/checks/#S1024\n        - S1024\n        # Don't use 'fmt.Sprintf(\"%s\", x)' unnecessarily.\n        # https://staticcheck.dev/docs/checks/#S1025\n        - S1025\n        # Simplify error construction with 'fmt.Errorf'.\n        # https://staticcheck.dev/docs/checks/#S1028\n        - S1028\n        # Range over the string directly.\n        # https://staticcheck.dev/docs/checks/#S1029\n        - S1029\n        # Use 'bytes.Buffer.String' or 'bytes.Buffer.Bytes'.\n        # https://staticcheck.dev/docs/checks/#S1030\n        - S1030\n        # Omit redundant nil check around loop.\n        # https://staticcheck.dev/docs/checks/#S1031\n        - S1031\n        # Use 'sort.Ints(x)', 'sort.Float64s(x)', and 'sort.Strings(x)'.\n        # https://staticcheck.dev/docs/checks/#S1032\n        - S1032\n        # Unnecessary guard around call to \"delete\".\n        # https://staticcheck.dev/docs/checks/#S1033\n        - S1033\n        # Use result of type assertion to simplify cases.\n        # https://staticcheck.dev/docs/checks/#S1034\n        - S1034\n        # Redundant call to 'net/http.CanonicalHeaderKey' in method call on 'net/http.Header'.\n        # https://staticcheck.dev/docs/checks/#S1035\n        - S1035\n        # Unnecessary guard around map access.\n        # https://staticcheck.dev/docs/checks/#S1036\n        - S1036\n        # Elaborate way of sleeping.\n        # https://staticcheck.dev/docs/checks/#S1037\n        - S1037\n        # Unnecessarily complex way of printing formatted string.\n        # https://staticcheck.dev/docs/checks/#S1038\n        - S1038\n        # Unnecessary use of 'fmt.Sprint'.\n        # https://staticcheck.dev/docs/checks/#S1039\n        - S1039\n        # Type assertion to current type.\n        # https://staticcheck.dev/docs/checks/#S1040\n        - S1040\n        # Apply De Morgan's law.\n        # https://staticcheck.dev/docs/checks/#QF1001\n        - QF1001\n        # Convert untagged switch to tagged switch.\n        # https://staticcheck.dev/docs/checks/#QF1002\n        - QF1002\n        # Convert if/else-if chain to tagged switch.\n        # https://staticcheck.dev/docs/checks/#QF1003\n        - QF1003\n        # Use 'strings.ReplaceAll' instead of 'strings.Replace' with 'n == -1'.\n        # https://staticcheck.dev/docs/checks/#QF1004\n        - QF1004\n        # Expand call to 'math.Pow'.\n        # https://staticcheck.dev/docs/checks/#QF1005\n        - QF1005\n        # Lift 'if'+'break' into loop condition.\n        # https://staticcheck.dev/docs/checks/#QF1006\n        - QF1006\n        # Merge conditional assignment into variable declaration.\n        # https://staticcheck.dev/docs/checks/#QF1007\n        - QF1007\n        # Omit embedded fields from selector expression.\n        # https://staticcheck.dev/docs/checks/#QF1008\n        - QF1008\n        # Use 'time.Time.Equal' instead of '==' operator.\n        # https://staticcheck.dev/docs/checks/#QF1009\n        - QF1009\n        # Convert slice of bytes to string when printing it.\n        # https://staticcheck.dev/docs/checks/#QF1010\n        - QF1010\n        # Omit redundant type from variable declaration.\n        # https://staticcheck.dev/docs/checks/#QF1011\n        - QF1011\n        # Use 'fmt.Fprintf(x, ...)' instead of 'x.Write(fmt.Sprintf(...))'.\n        # https://staticcheck.dev/docs/checks/#QF1012\n        - QF1012\n\n    tagalign:\n      # Align and sort can be used together or separately.\n      #\n      # Whether enable align. If true, the struct tags will be aligned.\n      # E.g.:\n      # type FooBar struct {\n      #     Bar    string `json:\"bar\" validate:\"required\"`\n      #     FooFoo int8   `json:\"foo_foo\" validate:\"required\"`\n      # }\n      # will be formatted to:\n      # type FooBar struct {\n      #     Bar    string `json:\"bar\"     validate:\"required\"`\n      #     FooFoo int8   `json:\"foo_foo\" validate:\"required\"`\n      # }\n      # Default: true.\n      align: false\n      # Whether enable tags sort.\n      # If true, the tags will be sorted by name in ascending order.\n      # E.g.: `xml:\"bar\" json:\"bar\" validate:\"required\"` -> `json:\"bar\" validate:\"required\" xml:\"bar\"`.\n      # Default: true\n      sort: false\n      # Specify the order of tags, the other tags will be sorted by name.\n      # This option will be ignored if `sort` is false.\n      # Default: []\n      order:\n        - json\n        - yaml\n        - yml\n        - toml\n        - mapstructure\n        - binding\n        - validate\n      # Whether enable strict style.\n      # In this style, the tags will be sorted and aligned in the dictionary order,\n      # and the tags with the same name will be aligned together.\n      # Note: This option will be ignored if 'align' or 'sort' is false.\n      # Default: false\n      strict: true\n\n    tagliatelle:\n      # Checks the struct tag name case.\n      case:\n        # Defines the association between tag name and case.\n        # Any struct tag name can be used.\n        # Supported string cases:\n        # - `camel`\n        # - `pascal`\n        # - `kebab`\n        # - `snake`\n        # - `upperSnake`\n        # - `goCamel`\n        # - `goPascal`\n        # - `goKebab`\n        # - `goSnake`\n        # - `upper`\n        # - `lower`\n        # - `header`\n        rules:\n          json: camel\n          yaml: camel\n          xml: camel\n          toml: camel\n          bson: camel\n          avro: snake\n          mapstructure: kebab\n          env: upperSnake\n          envconfig: upperSnake\n          whatever: snake\n        # Defines the association between tag name and case.\n        # Important: the `extended-rules` overrides `rules`.\n        # Default: empty\n        extended-rules:\n          json:\n            # Supported string cases:\n            # - `camel`\n            # - `pascal`\n            # - `kebab`\n            # - `snake`\n            # - `upperSnake`\n            # - `goCamel`\n            # - `goPascal`\n            # - `goKebab`\n            # - `goSnake`\n            # - `header`\n            # - `lower`\n            # - `header`\n            #\n            # Required\n            case: camel\n            # Adds 'AMQP', 'DB', 'GID', 'RTP', 'SIP', 'TS' to initialisms,\n            # and removes 'LHS', 'RHS' from initialisms.\n            # Default: false\n            extra-initialisms: true\n            # Defines initialism additions and overrides.\n            # Default: empty\n            initialism-overrides:\n              DB: true # add a new initialism\n              LHS: false # disable a default initialism.\n              # ...\n        # Uses the struct field name to check the name of the struct tag.\n        # Default: false\n        use-field-name: true\n        # The field names to ignore.\n        # Default: []\n        ignored-fields:\n          - Bar\n          - Foo\n        # Overrides the default/root configuration.\n        # Default: []\n        overrides:\n          -\n            # The package path (uses `/` only as a separator).\n            # Required\n            pkg: foo/bar\n            # Default: empty or the same as the default/root configuration.\n            rules:\n              json: snake\n              xml: pascal\n            # Default: empty or the same as the default/root configuration.\n            extended-rules:\n            # Same options as the base `extended-rules`.\n            # Default: false (WARNING: it doesn't follow the default/root configuration)\n            use-field-name: true\n            # The field names to ignore.\n            # Default: [] or the same as the default/root configuration.\n            ignored-fields:\n              - Bar\n              - Foo\n            # Ignore the package (takes precedence over all other configurations).\n            # Default: false\n            ignore: true\n\n    testifylint:\n      # Enable all checkers (https://github.com/Antonboom/testifylint#checkers).\n      # Default: false\n      enable-all: true\n      # Disable checkers by name\n      # (in addition to default\n      #   suite-thelper\n      # ).\n      disable:\n        - blank-import\n        - bool-compare\n        - compares\n        - contains\n        - empty\n        - encoded-compare\n        - equal-values\n        - error-is-as\n        - error-nil\n        - expected-actual\n        - float-compare\n        - formatter\n        - go-require\n        - len\n        - negative-positive\n        - nil-compare\n        - regexp\n        - require-error\n        - suite-broken-parallel\n        - suite-dont-use-pkg\n        - suite-extra-assert-call\n        - suite-method-signature\n        - suite-subtest-run\n        - suite-thelper\n        - useless-assert\n\n      # Disable all checkers (https://github.com/Antonboom/testifylint#checkers).\n      # Default: false\n      disable-all: true\n      # Enable checkers by name\n      # (in addition to default\n      #   blank-import, bool-compare, compares, contains, empty, encoded-compare, equal-values, error-is-as, error-nil,\n      #   expected-actual, go-require, float-compare, formatter, len, negative-positive, nil-compare, regexp, require-error,\n      #   suite-broken-parallel, suite-dont-use-pkg, suite-extra-assert-call, suite-subtest-run, suite-method-signature,\n      #   useless-assert\n      # ).\n      enable:\n        - blank-import\n        - bool-compare\n        - compares\n        - contains\n        - empty\n        - encoded-compare\n        - equal-values\n        - error-is-as\n        - error-nil\n        - expected-actual\n        - float-compare\n        - formatter\n        - go-require\n        - len\n        - negative-positive\n        - nil-compare\n        - regexp\n        - require-error\n        - suite-broken-parallel\n        - suite-dont-use-pkg\n        - suite-extra-assert-call\n        - suite-method-signature\n        - suite-subtest-run\n        - suite-thelper\n        - useless-assert\n\n      bool-compare:\n        # To ignore user defined types (over builtin bool).\n        # Default: false\n        ignore-custom-types: true\n      expected-actual:\n        # Regexp for expected variable name.\n        # Default: (^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\n        pattern: ^expected\n      formatter:\n        # To enable go vet's printf checks.\n        # Default: true\n        check-format-string: false\n        # To require f-assertions (e.g. `assert.Equalf`) if format string is used, even if there are no variable-length\n        # variables, i.e. it requires `require.NoErrorf` for both these cases:\n        # - require.NoErrorf(t, err, \"unexpected error\")\n        # - require.NoErrorf(t, err, \"unexpected error for sid: %v\", sid)\n        # To understand this behavior, please read the\n        # https://github.com/Antonboom/testifylint?tab=readme-ov-file#historical-reference-of-formatter.\n        # Default: false\n        require-f-funcs: true\n        # To require that the first element of msgAndArgs (msg) has a string type.\n        # For example, in such case assertion like `assert.True(t, b, tt.case)` will be considered as invalid.\n        # Default: true\n        require-string-msg: false\n      go-require:\n        # To ignore HTTP handlers (like http.HandlerFunc).\n        # Default: false\n        ignore-http-handlers: true\n      require-error:\n        # Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\n        # Default: \"\"\n        fn-pattern: ^(Errorf?|NoErrorf?)$\n      suite-extra-assert-call:\n        # To require or remove extra Assert() call?\n        # Default: remove\n        mode: require\n\n    testpackage:\n      # Regexp pattern to skip files.\n      # Default: \"(export|internal)_test\\\\.go\"\n      skip-regexp: (export|internal)_test\\.go\n      # List of packages that don't end with _test that tests are allowed to be in.\n      # Default: \"main\"\n      allow-packages:\n        - example\n        - main\n\n    thelper:\n      test:\n        # Check *testing.T is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.T param has name t.\n        # Default: true\n        name: false\n        # Check t.Helper() begins helper function.\n        # Default: true\n        begin: false\n      benchmark:\n        # Check *testing.B is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.B param has name b.\n        # Default: true\n        name: false\n        # Check b.Helper() begins helper function.\n        # Default: true\n        begin: false\n      tb:\n        # Check *testing.TB is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.TB param has name tb.\n        # Default: true\n        name: false\n        # Check tb.Helper() begins helper function.\n        # Default: true\n        begin: false\n      fuzz:\n        # Check *testing.F is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.F param has name f.\n        # Default: true\n        name: false\n        # Check f.Helper() begins helper function.\n        # Default: true\n        begin: false\n\n    usestdlibvars:\n      # Suggest the use of http.MethodXX.\n      # Default: true\n      http-method: false\n      # Suggest the use of http.StatusXX.\n      # Default: true\n      http-status-code: false\n      # Suggest the use of time.Month in time.Date.\n      # Default: false\n      time-date-month: true\n      # Suggest the use of time.Weekday.String().\n      # Default: true\n      time-weekday: true\n      # Suggest the use of time.Month.String().\n      # Default: false\n      time-month: true\n      # Suggest the use of time.Layout.\n      # Default: false\n      time-layout: true\n      # Suggest the use of crypto.Hash.String().\n      # Default: false\n      crypto-hash: true\n      # Suggest the use of rpc.DefaultXXPath.\n      # Default: false\n      default-rpc-path: true\n      # Suggest the use of sql.LevelXX.String().\n      # Default: false\n      sql-isolation-level: true\n      # Suggest the use of tls.SignatureScheme.String().\n      # Default: false\n      tls-signature-scheme: true\n      # Suggest the use of constant.Kind.String().\n      # Default: false\n      constant-kind: true\n\n    usetesting:\n      # Enable/disable `os.CreateTemp(\"\", ...)` detections.\n      # Default: true\n      os-create-temp: false\n\n      # Enable/disable `os.MkdirTemp()` detections.\n      # Default: true\n      os-mkdir-temp: false\n\n      # Enable/disable `os.Setenv()` detections.\n      # Default: true\n      os-setenv: false\n\n      # Enable/disable `os.TempDir()` detections.\n      # Default: false\n      os-temp-dir: true\n\n      # Enable/disable `os.Chdir()` detections.\n      # Disabled if Go < 1.24.\n      # Default: true\n      os-chdir: false\n\n      # Enable/disable `context.Background()` detections.\n      # Disabled if Go < 1.24.\n      # Default: false\n      context-background: true\n\n      # Enable/disable `context.TODO()` detections.\n      # Disabled if Go < 1.24.\n      # Default: false\n      context-todo: true\n\n    unconvert:\n      # Remove conversions that force intermediate rounding.\n      # Default: false\n      fast-math: true\n      # Be more conservative (experimental).\n      # Default: false\n      safe: true\n\n    unparam:\n      # Inspect exported functions.\n      # Set to true if no external program/library imports your code.\n      #\n      # IMPORTANT: If you enable this setting, unparam reports many false positives in text editors:\n      # when run on a subdirectory it cannot find external interfaces.\n      # Most editor integrations invoke golangci-lint on the directory containing the changed file.\n      #\n      # Default: false\n      check-exported: true\n\n    unqueryvet:\n      # Enable SQL builder checking.\n      # Default: true\n      check-sql-builders: false\n      # Enable aliased wildcard detection like `SELECT t.*`.\n      # Default: true\n      check-aliased-wildcard: false\n      # Enable string concatenation analysis.\n      # Default: true\n      check-string-concat: false\n      # Enable format string analysis like `fmt.Sprintf`.\n      # Default: true\n      check-format-strings: false\n      # Enable strings.Builder analysis.\n      # Default: true\n      check-string-builder: false\n      # Enable subquery analysis.\n      # Default: true\n      check-subqueries: false\n      # Detects N+1 Query.\n      # Default: false\n      check-n1: true\n      # Detects SQL injection.\n      # Default: false\n      check-sql-injection: true\n      # Detects transaction leaks.\n      # Default: false\n      check-tx-leaks: true\n      # Regex patterns for acceptable `SELECT *` usage.\n      # Default:\n      # - \"SELECT \\\\* FROM information_schema\\\\..*\"\n      # - \"SELECT \\\\* FROM pg_catalog\\\\..*\"\n      # - \"SELECT COUNT\\\\(\\\\*\\\\)\"\n      # - \"SELECT MAX\\\\(\\\\*\\\\)\"\n      # - \"SELECT MIN\\\\(\\\\*\\\\)\"\n      allowed-patterns:\n        - \"SELECT \\\\* FROM temp_.*\"\n        - \"SELECT \\\\* FROM.*-- migration\"\n      # Allow is a list of SQL patterns to allow (whitelist).\n      # Default: []\n      allow:\n        - foo\n      # Functions to ignore (regex patterns)\n      # Default: []\n      ignored-functions:\n        - \"debug\\\\..*\"\n        - \"test.*\"\n      # SQL builder libraries to check.\n      # Default: all true.\n      sql-builders:\n        squirrel: false\n        gorm: false\n        sqlx: false\n        ent: false\n        pgx: false\n        bun: false\n        sqlboiler: false\n        jet: false\n      # List of user-defined DSL rules.\n      # https://github.com/MirrexOne/unqueryvet?tab=readme-ov-file#custom-rules-dsl\n      # Default: []\n      custom-rules:\n        - id: allow-temp-tables\n          pattern: \"SELECT * FROM $TABLE\"\n          when: \"isTempTable(table)\"\n          action: allow\n        - id: dangerous-delete\n          pattern: \"DELETE FROM $TABLE\"\n          when: \"!has_where\"\n          message: \"DELETE without WHERE clause\"\n\n    unused:\n      # Mark all struct fields that have been written to as used.\n      # Default: true\n      field-writes-are-uses: false\n      # Treat IncDec statement (e.g. `i++` or `i--`) as both read and write operation instead of just write.\n      # Default: false\n      post-statements-are-reads: true\n      # Mark all exported fields as used.\n      # default: true\n      exported-fields-are-used: false\n      # Mark all function parameters as used.\n      # default: true\n      parameters-are-used: false\n      # Mark all local variables as used.\n      # default: true\n      local-variables-are-used: false\n      # Mark all identifiers inside generated files as used.\n      # Default: true\n      generated-is-used: false\n\n    varnamelen:\n      # The longest distance, in source lines, that is being considered a \"small scope\".\n      # Variables used in at most this many lines will be ignored.\n      # Default: 5\n      max-distance: 6\n      # The minimum length of a variable's name that is considered \"long\".\n      # Variable names that are at least this long will be ignored.\n      # Default: 3\n      min-name-length: 2\n      # Check method receivers.\n      # Default: false\n      check-receiver: true\n      # Check named return values.\n      # Default: false\n      check-return: true\n      # Check type parameters.\n      # Default: false\n      check-type-param: true\n      # Ignore \"ok\" variables that hold the bool return value of a type assertion.\n      # Default: false\n      ignore-type-assert-ok: true\n      # Ignore \"ok\" variables that hold the bool return value of a map index.\n      # Default: false\n      ignore-map-index-ok: true\n      # Ignore \"ok\" variables that hold the bool return value of a channel receive.\n      # Default: false\n      ignore-chan-recv-ok: true\n      # Optional list of variable names that should be ignored completely.\n      # Default: []\n      ignore-names:\n        - err\n      # Optional list of variable declarations that should be ignored completely.\n      # Entries must be in one of the following forms (see below for examples):\n      # - for variables, parameters, named return values, method receivers, or type parameters:\n      #   <name> <type>  (<type> can also be a pointer/slice/map/chan/...)\n      # - for constants: const <name>\n      #\n      # Default: []\n      ignore-decls:\n        - c echo.Context\n        - t testing.T\n        - f *foo.Bar\n        - e error\n        - i int\n        - const C\n        - T any\n        - m map[string]int\n\n    whitespace:\n      # Enforces newlines (or comments) after every multi-line if statement.\n      # Default: false\n      multi-if: true\n      # Enforces newlines (or comments) after every multi-line function signature.\n      # Default: false\n      multi-func: true\n\n    wrapcheck:\n      # An array of strings specifying additional substrings of signatures to ignore.\n      # Unlike 'ignore-sigs', this option extends the default set (or the set specified in 'ignore-sigs') without replacing it entirely.\n      # This allows you to add specific signatures to the ignore list\n      # while retaining the defaults or any items in 'ignore-sigs'.\n      # Default: []\n      extra-ignore-sigs:\n        - .CustomError(\n        - .SpecificWrap(\n\n      # An array of strings that specify substrings of signatures to ignore.\n      # If this set, it will override the default set of ignored signatures.\n      # See https://github.com/tomarrell/wrapcheck#configuration for more information.\n      # Default: [\".Errorf(\", \"errors.New(\", \"errors.Unwrap(\", \"errors.Join(\", \".Wrap(\", \".Wrapf(\", \".WithMessage(\", \".WithMessagef(\", \".WithStack(\"]\n      ignore-sigs:\n        - .Errorf(\n        - errors.New(\n        - errors.Unwrap(\n        - errors.Join(\n        - .Wrap(\n        - .Wrapf(\n        - .WithMessage(\n        - .WithMessagef(\n        - .WithStack(\n      # An array of strings that specify regular expressions of signatures to ignore.\n      # Default: []\n      ignore-sig-regexps:\n        - \\.New.*Error\\(\n      # An array of strings that specify globs of packages to ignore.\n      # Default: []\n      ignore-package-globs:\n        - encoding/*\n        - github.com/pkg/*\n      # An array of strings that specify regular expressions of interfaces to ignore.\n      # Default: []\n      ignore-interface-regexps:\n        - ^(?i)c(?-i)ach(ing|e)\n      # Determines whether wrapcheck should report errors returned from inside the package.\n      # Default: false\n      report-internal-errors: true\n\n    wsl:\n      # Do strict checking when assigning from append (x = append(x, y)).\n      # If this is set to true - the append call must append either a variable\n      # assigned, called or used on the line above.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#strict-append\n      # Default: true\n      strict-append: false\n\n      # Allows assignments to be cuddled with variables used in calls on\n      # line above and calls to be cuddled with assignments of variables\n      # used in call on line above.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-assign-and-call\n      # Default: true\n      allow-assign-and-call: false\n\n      # Allows assignments to be cuddled with anything.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-assign-and-anything\n      # Default: false\n      allow-assign-and-anything: true\n\n      # Allows cuddling to assignments even if they span over multiple lines.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-multiline-assign\n      # Default: true\n      allow-multiline-assign: false\n\n      # If the number of lines in a case block is equal to or lager than this number,\n      # the case *must* end white a newline.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#force-case-trailing-whitespace\n      # Default: 0\n      force-case-trailing-whitespace: 1\n\n      # Allow blocks to end with comments.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-trailing-comment\n      # Default: false\n      allow-trailing-comment: true\n\n      # Allow multiple comments in the beginning of a block separated with newline.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-separated-leading-comment\n      # Default: false\n      allow-separated-leading-comment: true\n\n      # Allow multiple var/declaration statements to be cuddled.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-cuddle-declarations\n      # Default: false\n      allow-cuddle-declarations: true\n\n      # A list of call idents that everything can be cuddled with.\n      # Defaults: [ \"Lock\", \"RLock\" ]\n      allow-cuddle-with-calls: [ \"Foo\", \"Bar\" ]\n\n      # AllowCuddleWithRHS is a list of right hand side variables that is allowed\n      # to be cuddled with anything.\n      # Defaults: [ \"Unlock\", \"RUnlock\" ]\n      allow-cuddle-with-rhs: [ \"Foo\", \"Bar\" ]\n\n      # Allow cuddling with any block as long as the variable is used somewhere in\n      # the block.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-cuddle-used-in-block\n      # Default: false\n      allow-cuddle-used-in-block: true\n\n      # Causes an error when an If statement that checks an error variable doesn't\n      # cuddle with the assignment of that variable.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#force-err-cuddling\n      # Default: false\n      force-err-cuddling: true\n\n      # When force-err-cuddling is enabled this is a list of names\n      # used for error variables to check for in the conditional.\n      # Default: [ \"err\" ]\n      error-variable-names: [ \"foo\" ]\n\n      # Causes an error if a short declaration (:=) cuddles with anything other than\n      # another short declaration.\n      # This logic overrides force-err-cuddling among others.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#force-short-decl-cuddling\n      # Default: false\n      force-short-decl-cuddling: true\n\n    wsl_v5:\n      # Allow cuddling a variable if it's used first in the immediate following block,\n      # even if the statement with the block doesn't use the variable.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: true\n      allow-first-in-block: false\n\n      # Same as above,\n      # but allows cuddling if the variable is used anywhere in the following (or nested) block.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: false\n      allow-whole-block: true\n\n      # If a block contains more than this number of lines,\n      # the branch statement needs to be separated by whitespace.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: 2\n      branch-max-lines: 4\n\n      # If set to a non-negative number,\n      # case blocks need to end with whitespace if exceeding this number\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: 0\n      case-max-lines: 2\n\n      # Default checks to use.\n      # Can be `all`, `none`, `default` or empty.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration\n      # Default: \"\"\n      default: all\n\n      # Enabled checks.\n      # Will be additive to any presets.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration\n      # Default: []\n      enable:\n        - assign\n        - branch\n        - decl\n        - defer\n        - expr\n        - for\n        - go\n        - if\n        - inc-dec\n        - label\n        - range\n        - return\n        - select\n        - send\n        - switch\n        - type-switch\n        - append\n        - assign-exclusive\n        - assign-expr\n        - err\n        - leading-whitespace\n        - trailing-whitespace\n        - after-block\n\n      # Disable checks.\n      # Will be subtractive to any preset.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration\n      # Default: []\n      disable:\n        - assign\n        - branch\n        - decl\n        - defer\n        - expr\n        - for\n        - go\n        - if\n        - inc-dec\n        - label\n        - range\n        - return\n        - select\n        - send\n        - switch\n        - type-switch\n        - append\n        - assign-exclusive\n        - assign-expr\n        - err\n        - leading-whitespace\n        - trailing-whitespace\n        - after-block\n\n    # The custom section can be used to define linter plugins to be loaded at runtime.\n    # See README documentation for more info.\n    custom:\n      # Each custom linter should have a unique name.\n      example:\n        # The plugin type.\n        # It can be `goplugin` or `module`.\n        # Default: goplugin\n        type: module\n        # The path to the plugin *.so. Can be absolute or local.\n        # Required for each custom linter.\n        path: /path/to/example.so\n        # The description of the linter.\n        # Optional.\n        description: This is an example usage of a plugin linter.\n        # Intended to point to the repo location of the linter.\n        # Optional.\n        original-url: github.com/golangci/example-linter\n        # Plugins settings/configuration.\n        # Only work with plugin based on `linterdb.PluginConstructor`.\n        # Optional.\n        settings:\n          foo: bar\n\n  # Defines a set of rules to ignore issues.\n  # It does not skip the analysis, and so does not ignore \"typecheck\" errors.\n  exclusions:\n    # Mode of the generated files analysis.\n    #\n    # - `strict`: sources are excluded by strictly following the Go generated file convention.\n    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\.$`\n    #    This line must appear before the first non-comment, non-blank text in the file.\n    #    https://go.dev/s/generatedcode\n    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.\n    # - `disable`: disable the generated files exclusion.\n    #\n    # Default: strict\n    generated: lax\n    # Log a warning if an exclusion rule is unused.\n    # Default: false\n    warn-unused: true\n    # Predefined exclusion rules.\n    # Default: []\n    presets:\n      - comments\n      - std-error-handling\n      - common-false-positives\n      - legacy\n\n    # Excluding configuration per-path, per-linter, per-text and per-source.\n    rules:\n      # Exclude some linters from running on tests files.\n      - path: _test\\.go\n        linters:\n          - gocyclo\n          - errcheck\n          - dupl\n          - gosec\n\n      # Run some linter only for test files by excluding its issues for everything else.\n      - path-except: _test\\.go\n        linters:\n          - forbidigo\n\n      # Exclude known linters from partially hard-vendored code,\n      # which is impossible to exclude via `nolint` comments.\n      # `/` will be replaced by the current OS file path separator to properly work on Windows.\n      - path: internal/hmac/\n        text: \"weak cryptographic primitive\"\n        linters:\n          - gosec\n\n      # Exclude some `staticcheck` messages.\n      - linters:\n          - staticcheck\n        text: \"SA9003:\"\n\n      # Exclude `lll` issues for long lines with `go:generate`.\n      - linters:\n          - lll\n        source: \"^//go:generate \"\n\n    # Which file paths to exclude: they will be analyzed, but issues from them won't be reported.\n    # \"/\" will be replaced by the current OS file path separator to properly work on Windows.\n    # Default: []\n    paths:\n      - \".*\\\\.my\\\\.go$\"\n      - lib/bad.go\n    # Which file paths to not exclude.\n    # Default: []\n    paths-except:\n      - \".*\\\\.my\\\\.go$\"\n      - lib/bad.go\n\nformatters:\n  # Enable specific formatter.\n  # Default: [] (uses standard Go formatting)\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n    - golines\n    - swaggo\n\n  # Formatters settings.\n  settings:\n    gci:\n      # Section configuration to compare against.\n      # Section names are case-insensitive and may contain parameters in ().\n      # The default order of sections is `standard > default > custom > blank > dot > alias > localmodule`.\n      # If `custom-order` is `true`, it follows the order of `sections` option.\n      # Default: [\"standard\", \"default\"]\n      sections:\n        - standard                       # Standard section: captures all standard packages.\n        - default                        # Default section: contains all imports that could not be matched to another section type.\n        - prefix(github.com/org/project) # Custom section: groups all imports with the specified Prefix.\n        - blank                          # Blank section: contains all blank imports. This section is not present unless explicitly enabled.\n        - dot                            # Dot section: contains all dot imports. This section is not present unless explicitly enabled.\n        - alias                          # Alias section: contains all alias imports. This section is not present unless explicitly enabled.\n        - localmodule                    # Local module section: contains all local packages. This section is not present unless explicitly enabled.\n\n      # Checks that no inline comments are present.\n      # Default: false\n      no-inline-comments: true\n\n      # Checks that no prefix comments (comment lines above an import) are present.\n      # Default: false\n      no-prefix-comments: true\n\n      # Enable custom order of sections.\n      # If `true`, make the section order the same as the order of `sections`.\n      # Default: false\n      custom-order: true\n\n      # Drops lexical ordering for custom sections.\n      # Default: false\n      no-lex-order: true\n\n    gofmt:\n      # Simplify code: gofmt with `-s` option.\n      # Default: true\n      simplify: false\n      # Apply the rewrite rules to the source before reformatting.\n      # https://pkg.go.dev/cmd/gofmt\n      # Default: []\n      rewrite-rules:\n        - pattern: 'interface{}'\n          replacement: 'any'\n        - pattern: 'a[b:len(a)]'\n          replacement: 'a[b:]'\n\n    gofumpt:\n      # Module path which contains the source code being formatted.\n      # Default: \"\"\n      module-path: github.com/org/project\n\n      # Choose whether to use the extra rules.\n      # Default: false\n      extra-rules: true\n\n    goimports:\n      # A list of prefixes, which, if set, checks import paths\n      # with the given prefixes are grouped after 3rd-party packages.\n      # Default: []\n      local-prefixes:\n        - github.com/org/project\n\n    golines:\n      # Target maximum line length.\n      # Default: 100\n      max-len: 200\n      # Length of a tabulation.\n      # Default: 4\n      tab-len: 8\n      # Shorten single-line comments.\n      # Default: false\n      shorten-comments: true\n      # Default: true\n      reformat-tags: false\n      # Split chained methods on the dots as opposed to the arguments.\n      # Default: true\n      chain-split-dots: false\n\n  exclusions:\n    # Log a warning if an exclusion path is unused.\n    # Default: false\n    warn-unused: true\n    # Mode of the generated files analysis.\n    #\n    # - `strict`: sources are excluded by strictly following the Go generated file convention.\n    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\.$`\n    #    This line must appear before the first non-comment, non-blank text in the file.\n    #    https://go.dev/s/generatedcode\n    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.\n    # - `disable`: disable the generated files exclusion.\n    #\n    # Default: lax\n    generated: strict\n    # Which file paths to exclude.\n    # This option is ignored when using `--stdin` as the path is unknown.\n    # Default: []\n    paths:\n      - \".*\\\\.my\\\\.go$\"\n      - lib/bad.go\n\nissues:\n  # Maximum issues count per one linter.\n  # Set to 0 to disable.\n  # Default: 50\n  max-issues-per-linter: 0\n\n  # Maximum count of issues with the same text.\n  # Set to 0 to disable.\n  # Default: 3\n  max-same-issues: 0\n\n  # Make issues output unique by line.\n  # Default: true\n  uniq-by-line: false\n\n  # Show only new issues: if there are unstaged changes or untracked files,\n  # only those changes are analyzed, else only changes in HEAD~ are analyzed.\n  # It's a super-useful option for integration of golangci-lint into existing large codebase.\n  # It's not practical to fix all existing issues at the moment of integration:\n  # much better don't allow issues in new code.\n  #\n  # Default: false\n  new: true\n\n  # Show only new issues created after the best common ancestor (merge-base against HEAD).\n  # Default: \"\"\n  new-from-merge-base: main\n\n  # Show only new issues created after git revision `REV`.\n  # Default: \"\"\n  new-from-rev: HEAD\n\n  # Show only new issues created in git patch with set file path.\n  # Default: \"\"\n  new-from-patch: path/to/patch/file\n\n  # Show issues in any part of update files (requires new-from-rev or new-from-patch).\n  # Default: false\n  whole-files: true\n\n  # Apply the fixes detected by the linters and formatters (if it's supported by the linter).\n  # Default: false\n  fix: true\n\n\n# Output configuration options.\noutput:\n  # The formats used to render issues.\n  formats:\n    # Prints issues in a text format with colors, line number, and linter name.\n    # This format is the default format.\n    text:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.txt\n      # Print linter name in the end of issue text.\n      # Default: true\n      print-linter-name: false\n      # Print lines of code with issue.\n      # Default: true\n      print-issued-lines: false\n      # Use colors.\n      # Default: true\n      colors: false\n    # Prints issues in a JSON representation.\n    json:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.json\n    # Prints issues in columns representation separated by tabulations.\n    tab:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.txt\n      # Print linter name in the end of issue text.\n      # Default: true\n      print-linter-name: true\n      # Use colors.\n      # Default: true\n      colors: false\n    # Prints issues in an HTML page.\n    # It uses the Cloudflare CDN (cdnjs) and React.\n    html:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.html\n    # Prints issues in the Checkstyle format.\n    checkstyle:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.xml\n    # Prints issues in the Code Climate format.\n    code-climate:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.json\n    # Prints issues in the JUnit XML format.\n    junit-xml:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.xml\n      # Support extra JUnit XML fields.\n      # Default: false\n      extended: true\n    # Prints issues in the TeamCity format.\n    teamcity:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.txt\n    # Prints issues in the SARIF format.\n    sarif:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.json\n\n  # Add a prefix to the output file references.\n  # This option is ignored when using `output.path-mode: abs` mode.\n  # Default: \"\"\n  path-prefix: \"\"\n\n  # By default, the report are related to the path obtained by `run.relative-path-mode`.\n  # The mode `abs` allows to show absolute file paths instead of relative file paths.\n  # The option `output.path-prefix` is ignored when using `abs` mode.\n  # Default: \"\"\n  path-mode: \"abs\"\n\n  # Order to use when sorting results.\n  # Possible values: `file`, `linter`, and `severity`.\n  #\n  # If the severity values are inside the following list, they are ordered in this order:\n  #   1. error\n  #   2. warning\n  #   3. high\n  #   4. medium\n  #   5. low\n  # Either they are sorted alphabetically.\n  #\n  # Default: [\"linter\", \"file\"]\n  sort-order:\n    - linter\n    - severity\n    - file # filepath, line, and column.\n\n  # Show statistics per linter.\n  # Default: true\n  show-stats: false\n\n\n# Options for analysis running.\nrun:\n  # Timeout for total work, e.g. 30s, 5m, 5m30s.\n  # If the value is lower or equal to 0, the timeout is disabled.\n  # Default: 0 (disabled)\n  timeout: 5m\n\n  # The mode used to evaluate relative paths.\n  # It's used by exclusions, Go plugins, and some linters.\n  # The value can be:\n  # - `gomod`: the paths will be relative to the directory of the `go.mod` file.\n  # - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`).\n  # - `cfg`: the paths will be relative to the configuration file.\n  # - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run.\n  # Default: cfg\n  relative-path-mode: gomod\n\n  # Exit code when at least one issue was found.\n  # Default: 1\n  issues-exit-code: 2\n\n  # Include test files or not.\n  # Default: true\n  tests: false\n\n  # List of build tags, all linters use it.\n  # Default: []\n  build-tags:\n    - mytag\n\n  # If set, we pass it to \"go list -mod={option}\". From \"go help modules\":\n  # If invoked with -mod=readonly, the go command is disallowed from the implicit\n  # automatic updating of go.mod described above. Instead, it fails when any changes\n  # to go.mod are needed. This setting is most useful to check that go.mod does\n  # not need updates, such as in a continuous integration and testing system.\n  # If invoked with -mod=vendor, the go command assumes that the vendor\n  # directory holds the correct copies of dependencies and ignores\n  # the dependency descriptions in go.mod.\n  #\n  # Allowed values: readonly|vendor|mod\n  # Default: \"\"\n  modules-download-mode: readonly\n\n  # Uses version control information during the loading of packages.\n  # Default: false (implies `-buildvcs=false`)\n  enable-build-vcs: true\n\n  # Allow multiple parallel golangci-lint instances running.\n  # If false, golangci-lint acquires file lock on start.\n  # Default: false\n  allow-parallel-runners: true\n\n  # Allow multiple golangci-lint instances running, but serialize them around a lock.\n  # If false, golangci-lint exits with an error if it fails to acquire file lock on start.\n  # Default: false\n  allow-serial-runners: true\n\n  # Define the Go version limit.\n  # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22.\n  go: '1.23'\n\n  # Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously.\n  # Default: 0 (automatically set to match Linux container CPU quota and\n  # fall back to the number of logical CPUs in the machine)\n  concurrency: 4\n\n\nseverity:\n  # Set the default severity for issues.\n  #\n  # If severity rules are defined and the issues do not match or no severity is provided to the rule\n  # this will be the default severity applied.\n  # Severities should match the supported severity names of the selected out format.\n  # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity\n  # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel\n  # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message\n  # - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance\n  #\n  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)\n  #\n  # Default: \"\"\n  default: error\n\n  # When a list of severity rules are provided, severity information will be added to lint issues.\n  # Severity rules have the same filtering capability as exclude rules\n  # except you are allowed to specify one matcher per severity rule.\n  #\n  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)\n  #\n  # Only affects out formats that support setting severity information.\n  #\n  # Default: []\n  rules:\n    - linters:\n        - dupl\n      severity: info\n"
  },
  {
    "path": ".golangci.reference.yml",
    "content": "# This file contains all available configuration options\n# with their default values (in comments).\n#\n# This file is not a configuration example,\n# it contains the exhaustive configuration with explanations of the options.\n\n# Defines the configuration version.\n# The only possible value is \"2\".\nversion: \"2\"\n\nlinters:\n  # Default set of linters.\n  # The value can be:\n  # - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default\n  # - `all`: enables all linters by default.\n  # - `none`: disables all linters by default.\n  # - `fast`: enables only linters considered as \"fast\" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`).\n  # Default: standard\n  default: all\n\n  # Enable specific linter.\n  enable:\n    - arangolint\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - embeddedstructfieldcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funcorder\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godoclint\n    - godot\n    - godox\n    - goheader\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - iotamixing\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - modernize\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - noinlineerr\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unqueryvet\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - wsl_v5\n    - zerologlint\n\n  # Disable specific linters.\n  disable:\n    - arangolint\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - embeddedstructfieldcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funcorder\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godoclint\n    - godot\n    - godox\n    - goheader\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - iotamixing\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - modernize\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - noinlineerr\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unqueryvet\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - wsl_v5\n    - zerologlint\n\n  # All available settings of specific linters.\n  settings:\n    asasalint:\n      # To specify a set of function names to exclude.\n      # The values are merged with the builtin exclusions.\n      # The builtin exclusions can be disabled by setting `use-builtin-exclusions` to `false`.\n      # Default: [\"^(fmt|log|logger|t|)\\.(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$\"]\n      exclude:\n        - Append\n        - \\.Wrapf\n      # To enable/disable the asasalint builtin exclusions of function names.\n      # See the default value of `exclude` to get the builtin exclusions.\n      # Default: true\n      use-builtin-exclusions: false\n\n    bidichk:\n      # The following configurations check for all mentioned invisible Unicode runes.\n      # All runes are enabled by default.\n      left-to-right-embedding: false\n      right-to-left-embedding: false\n      pop-directional-formatting: false\n      left-to-right-override: false\n      right-to-left-override: false\n      left-to-right-isolate: false\n      right-to-left-isolate: false\n      first-strong-isolate: false\n      pop-directional-isolate: false\n\n    copyloopvar:\n      # Check all assigning the loop variable to another variable.\n      # Default: false\n      check-alias: true\n\n    cyclop:\n      # The maximal code complexity to report.\n      # Default: 10\n      max-complexity: 10\n      # The maximal average package complexity.\n      # If it's higher than 0.0 (float) the check is enabled.\n      # Default: 0.0\n      package-average: 0.5\n\n    decorder:\n      # Required order of `type`, `const`, `var` and `func` declarations inside a file.\n      # Default: types before constants before variables before functions.\n      dec-order:\n        - type\n        - const\n        - var\n        - func\n\n      # If true, underscore vars (vars with \"_\" as the name) will be ignored at all checks.\n      # Default: false (underscore vars are not ignored)\n      ignore-underscore-vars: false\n\n      # If true, order of declarations is not checked at all.\n      # Default: true (disabled)\n      disable-dec-order-check: false\n\n      # If true, `init` func can be anywhere in file (does not have to be declared before all other functions).\n      # Default: true (disabled)\n      disable-init-func-first-check: false\n\n      # If true, multiple global `type`, `const` and `var` declarations are allowed.\n      # Default: true (disabled)\n      disable-dec-num-check: false\n\n      # If true, type declarations will be ignored for dec num check.\n      # Default: false (type statements are not ignored)\n      disable-type-dec-num-check: false\n\n      # If true, const declarations will be ignored for dec num check.\n      # Default: false (const statements are not ignored)\n      disable-const-dec-num-check: false\n\n      # If true, var declarations will be ignored for dec num check.\n      # Default: false (var statements are not ignored)\n      disable-var-dec-num-check: false\n\n    depguard:\n      # Rules to apply.\n      #\n      # Variables:\n      # - File Variables\n      #   Use an exclamation mark `!` to negate a variable.\n      #   Example: `!$test` matches any file that is not a go test file.\n      #\n      #   `$all` - matches all go files\n      #   `$test` - matches all go test files\n      #\n      # - Package Variables\n      #\n      #   `$gostd` - matches all of go's standard library (Pulled from `GOROOT`)\n      #\n      # Default (applies if no custom rules are defined): Only allow $gostd in all files.\n      rules:\n        # Name of a rule.\n        main:\n          # Defines package matching behavior. Available modes:\n          # - `original`: allowed if it doesn't match the deny list and either matches the allow list or the allow list is empty.\n          # - `strict`: allowed only if it matches the allow list and either doesn't match the deny list or the allow rule is more specific (longer) than the deny rule.\n          # - `lax`: allowed if it doesn't match the deny list or the allow rule is more specific (longer) than the deny rule.\n          # Default: \"original\"\n          list-mode: lax\n          # List of file globs that will match this list of settings to compare against.\n          # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.\n          # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.\n          # The placeholder '${config-path}' is substituted with a path relative to the configuration file.\n          # Default: $all\n          files:\n            - \"!**/*_a _file.go\"\n          # List of allowed packages.\n          # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).\n          # Default: []\n          allow:\n            - $gostd\n            - github.com/OpenPeeDeeP\n          # List of packages that are not allowed.\n          # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).\n          # Default: []\n          deny:\n            - pkg: \"math/rand$\"\n              desc: use math/rand/v2\n            - pkg: \"github.com/sirupsen/logrus\"\n              desc: not allowed\n            - pkg: \"github.com/pkg/errors\"\n              desc: Should be replaced by standard lib errors package\n\n    dogsled:\n      # Checks assignments with too many blank identifiers.\n      # Default: 2\n      max-blank-identifiers: 3\n\n    dupl:\n      # Tokens count to trigger issue.\n      # Default: 150\n      threshold: 100\n\n    dupword:\n      # Keywords for detecting duplicate words.\n      # If this list is not empty, only the words defined in this list will be detected.\n      # Default: []\n      keywords:\n        - \"the\"\n        - \"and\"\n        - \"a\"\n      # Keywords used to ignore detection.\n      # Default: []\n      ignore:\n        - \"0C0C\"\n      # Checks only comments, skip strings.\n      # Default: false\n      comments-only: true\n\n    embeddedstructfieldcheck:\n      # Checks that there is an empty space between the embedded fields and regular fields.\n      # Default: true\n      empty-line: false\n      # Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\n      # Default: false\n      forbid-mutex: true\n\n    errcheck:\n      # Report about not checking of errors in type assertions: `a := b.(MyStruct)`.\n      # Such cases aren't reported by default.\n      # Default: false\n      check-type-assertions: true\n\n      # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`.\n      # Such cases aren't reported by default.\n      # Default: false\n      check-blank: true\n\n      # To disable the errcheck built-in exclude list.\n      # See `-excludeonly` option in https://github.com/kisielk/errcheck#excluding-functions for details.\n      # Default: false\n      disable-default-exclusions: true\n\n      # List of functions to exclude from checking, where each entry is a single function to exclude.\n      # See https://github.com/kisielk/errcheck#excluding-functions for details.\n      exclude-functions:\n        - io/ioutil.ReadFile\n        - io.Copy(*bytes.Buffer)\n        - io.Copy(os.Stdout)\n\n      # Display function signature instead of selector.\n      # Default: false\n      verbose: true\n\n    errchkjson:\n      # With check-error-free-encoding set to true, errchkjson does warn about errors\n      # from json encoding functions that are safe to be ignored,\n      # because they are not possible to happen.\n      #\n      # if check-error-free-encoding is set to true and errcheck linter is enabled,\n      # it is recommended to add the following exceptions to prevent from false positives:\n      #\n      #     linters:\n      #       settings:\n      #         errcheck:\n      #           exclude-functions:\n      #             - encoding/json.Marshal\n      #             - encoding/json.MarshalIndent\n      #\n      # Default: false\n      check-error-free-encoding: true\n\n      # Issue on struct encoding that doesn't have exported fields.\n      # Default: false\n      report-no-exported: false\n\n    errorlint:\n      # Check whether fmt.Errorf uses the %w verb for formatting errors.\n      # See the https://github.com/polyfloyd/go-errorlint for caveats.\n      # Default: true\n      errorf: false\n      # Permit more than 1 %w verb, valid per Go 1.20 (requires `errorf: true`).\n      # Default: true\n      errorf-multi: false\n      # Check for plain type assertions and type switches.\n      # Default: true\n      asserts: false\n      # Check for plain error comparisons.\n      # Default: true\n      comparison: false\n      # Allowed errors.\n      # Default: []\n      allowed-errors:\n        - err: \"io.EOF\"\n          fun: \"example.com/pkg.Read\"\n      # Allowed error \"wildcards\".\n      # Default: []\n      allowed-errors-wildcard:\n        - err: \"example.com/pkg.ErrMagic\"\n          fun: \"example.com/pkg.Magic\"\n\n    exhaustive:\n      # Program elements to check for exhaustiveness.\n      # Default: [ switch ]\n      check:\n        - switch\n        - map\n      # Presence of \"default\" case in switch statements satisfies exhaustiveness,\n      # even if all enum members are not listed.\n      # Default: false\n      default-signifies-exhaustive: true\n      # Enum members matching the supplied regex do not have to be listed in\n      # switch statements to satisfy exhaustiveness.\n      # Default: \"\"\n      ignore-enum-members: \"Example.+\"\n      # Enum types matching the supplied regex do not have to be listed in\n      # switch statements to satisfy exhaustiveness.\n      # Default: \"\"\n      ignore-enum-types: \"Example.+\"\n      # Consider enums only in package scopes, not in inner scopes.\n      # Default: false\n      package-scope-only: true\n      # Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.\n      # Default: false\n      explicit-exhaustive-switch: true\n      # Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.\n      # Default: false\n      explicit-exhaustive-map: true\n      # Switch statement requires default case even if exhaustive.\n      # Default: false\n      default-case-required: true\n\n    exhaustruct:\n      # List of regular expressions to match type names that should be processed.\n      # Anonymous structs can be matched by '<anonymous>' alias.\n      #\n      # Each regular expression must match the full type name, including package path.\n      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`,\n      # but not `http\\.Cookie`.\n      # Default: []\n      include:\n        - '.+\\.Test'\n        - 'example\\.com/package\\.ExampleStruct[\\d]{1,2}'\n      # List of regular expressions to match type names that should be excluded from processing.\n      # Anonymous structs can be matched by '<anonymous>' alias.\n      # Has precedence over `include`.\n      # Each regular expression must match the full type name, including package path.\n      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`,\n      # but not `http\\.Cookie`.\n      # Default: []\n      exclude:\n        - '.+/cobra\\.Command$'\n      # Allows empty structures, effectively excluding them from the check.\n      # Default: false\n      allow-empty: true\n      # List of regular expressions to match type names that should be allowed to be empty.\n      # Anonymous structs can be matched by '<anonymous>' alias.\n      # Each regular expression must match the full type name, including package path.\n      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`,\n      # but not `http\\.Cookie`.\n      # Default: []\n      allow-empty-rx:\n        - '.*/http\\.Cookie'\n      # Allows empty structures in return statements.\n      # Default: false\n      allow-empty-returns: true\n      # Allows empty structures in variable declarations.\n      # Default: false\n      allow-empty-declarations: true\n\n    fatcontext:\n      # Check for potential fat contexts in struct pointers.\n      # May generate false positives.\n      # Default: false\n      check-struct-pointers: true\n\n    forbidigo:\n      # Forbid the following identifiers (list of regexp).\n      # Default: [\"^(fmt\\\\.Print(|f|ln)|print|println)$\"]\n      forbid:\n        # Built-in bootstrapping functions.\n        - pattern: ^print(ln)?$\n        # Optional message that gets included in error reports.\n        - pattern: ^fmt\\.Print.*$\n          msg: Do not commit print statements.\n        # Alternatively, put messages at the end of the regex, surrounded by `(# )?`.\n        # Escape any special characters. Those messages get included in error reports.\n        - pattern: 'fmt\\.Print.*(# Do not commit print statements\\.)?'\n        # Forbid spew Dump, whether it is called as function or method.\n        # Depends on analyze-types below.\n        - pattern: ^spew\\.(ConfigState\\.)?Dump$\n        # The package name might be ambiguous.\n        # The full import path can be used as additional criteria.\n        # Depends on analyze-types below.\n        - pattern: ^v1.Dump$\n          pkg: ^example.com/pkg/api/v1$\n      # Exclude godoc examples from forbidigo checks.\n      # Default: true\n      exclude-godoc-examples: false\n      # Instead of matching the literal source code,\n      # use type information to replace expressions with strings that contain the package name\n      # and (for methods and fields) the type name.\n      # This makes it possible to handle import renaming and forbid struct fields and methods.\n      # Default: false\n      analyze-types: true\n\n    funcorder:\n      # Checks that constructors are placed after the structure declaration.\n      # Default: true\n      constructor: false\n      # Checks if the exported methods of a structure are placed before the non-exported ones.\n      # Default: true\n      struct-method: false\n      # Checks if the constructors and/or structure methods are sorted alphabetically.\n      # Default: false\n      alphabetical: true\n\n    funlen:\n      # Checks the number of lines in a function.\n      # If lower than 0, disable the check.\n      # Default: 60\n      lines: -1\n      # Checks the number of statements in a function.\n      # If lower than 0, disable the check.\n      # Default: 40\n      statements: -1\n      # Ignore comments when counting lines.\n      # Default: true\n      ignore-comments: false\n\n    ginkgolinter:\n      # Suppress the wrong length assertion warning.\n      # Default: false\n      suppress-len-assertion: true\n\n      # Suppress the wrong nil assertion warning.\n      # Default: false\n      suppress-nil-assertion: true\n\n      # Suppress the wrong error assertion warning.\n      # Default: false\n      suppress-err-assertion: true\n\n      # Suppress the wrong comparison assertion warning.\n      # Default: false\n      suppress-compare-assertion: true\n\n      # Suppress the function all in async assertion warning.\n      # Default: false\n      suppress-async-assertion: true\n\n      # Suppress warning for comparing values from different types, like `int32` and `uint32`.\n      # Default: false\n      suppress-type-compare-assertion: true\n\n      # Trigger warning for ginkgo focus containers like `FDescribe`, `FContext`, `FWhen` or `FIt`.\n      # Default: false\n      forbid-focus-container: true\n\n      # Don't trigger warnings for HaveLen(0)\n      # Default: false\n      allow-havelen-zero: true\n\n      # Force using `Expect` with `To`, `ToNot` or `NotTo`.\n      # Reject using `Expect` with `Should` or `ShouldNot`.\n      # Default: false\n      force-expect-to: true\n\n      # Best effort validation of async intervals (timeout and polling).\n      # Ignored the `suppress-async-assertion` is true.\n      # Default: false\n      validate-async-intervals: true\n\n      # Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\n      # Default: false\n      forbid-spec-pollution: true\n\n      # Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\n      # Default: false\n      force-succeed: true\n\n      # Force adding assertion descriptions to gomega matchers.\n      # Default: false\n      force-assertion-description: true\n\n      # Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\n      # Default: false\n      force-tonot: true\n\n    gochecksumtype:\n      # Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\n      # Default: true\n      default-signifies-exhaustive: false\n      # Include shared interfaces in the exhaustiveness check.\n      # Default: false\n      include-shared-interfaces: true\n\n    gocognit:\n      # Minimal code complexity to report.\n      # Default: 30 (but we recommend 10-20)\n      min-complexity: 10\n\n    goconst:\n      # Minimal length of string constant.\n      # Default: 3\n      min-len: 2\n      # Minimum occurrences of constant string count to trigger issue.\n      # Default: 3\n      min-occurrences: 2\n      # Look for existing constants matching the values.\n      # Default: true\n      match-constant: false\n      # Search also for duplicated numbers.\n      # Default: false\n      numbers: true\n      # Minimum value, only works with `goconst.numbers`.\n      # Default: 3\n      min: 2\n      # Maximum value, only works with `goconst.numbers`.\n      # Default: 3\n      max: 2\n      # Ignore when constant is not used as function argument.\n      # Default: true\n      ignore-calls: false\n      # Exclude strings matching the given regular expression.\n      # Default: \"\"\n      ignore-string-values:\n        - 'foo.+'\n      # Detects constants with identical values.\n      # Default: false\n      find-duplicates: true\n      # Evaluates of constant expressions like Prefix + \"suffix\".\n      # Default: false\n      eval-const-expressions: true\n\n    gocritic:\n      # Disable all checks.\n      # Default: false\n      disable-all: true\n      # Which checks should be enabled in addition to default checks; can't be combined with 'disabled-checks'.\n      # By default, list of stable checks is used (https://go-critic.com/overview#checks-overview):\n      #   appendAssign, argOrder, assignOp, badCall, badCond, captLocal, caseOrder, codegenComment, commentFormatting,\n      #   defaultCaseOrder, deprecatedComment, dupArg, dupBranchBody, dupCase, dupSubExpr, elseif, exitAfterDefer,\n      #   flagDeref, flagName, ifElseChain, mapKey, newDeref, offBy1, regexpMust, singleCaseSwitch, sloppyLen,\n      #   sloppyTypeAssert, switchTrue, typeSwitchVar, underef, unlambda, unslice, valSwap, wrapperFunc\n      # To see which checks are enabled run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic`.\n      enabled-checks:\n        # Detects suspicious append result assignments.\n        # https://go-critic.com/overview.html#appendassign\n        - appendAssign\n        # Detects `append` chains to the same slice that can be done in a single `append` call.\n        # https://go-critic.com/overview.html#appendcombine\n        - appendCombine\n        # Detects suspicious arguments order.\n        # https://go-critic.com/overview.html#argorder\n        - argOrder\n        # Detects assignments that can be simplified by using assignment operators.\n        # https://go-critic.com/overview.html#assignop\n        - assignOp\n        # Detects suspicious function calls.\n        # https://go-critic.com/overview.html#badcall\n        - badCall\n        # Detects suspicious condition expressions.\n        # https://go-critic.com/overview.html#badcond\n        - badCond\n        # Detects suspicious mutex lock/unlock operations.\n        # https://go-critic.com/overview.html#badlock\n        - badLock\n        # Detects suspicious regexp patterns.\n        # https://go-critic.com/overview.html#badregexp\n        - badRegexp\n        # Detects bad usage of sort package.\n        # https://go-critic.com/overview.html#badsorting\n        - badSorting\n        # Detects bad usage of sync.OnceFunc.\n        # https://go-critic.com/overview.html#badsynconcefunc\n        - badSyncOnceFunc\n        # Detects bool expressions that can be simplified.\n        # https://go-critic.com/overview.html#boolexprsimplify\n        - boolExprSimplify\n        # Detects when predeclared identifiers are shadowed in assignments.\n        # https://go-critic.com/overview.html#builtinshadow\n        - builtinShadow\n        # Detects top-level declarations that shadow the predeclared identifiers.\n        # https://go-critic.com/overview.html#builtinshadowdecl\n        - builtinShadowDecl\n        # Detects capitalized names for local variables.\n        # https://go-critic.com/overview.html#captlocal\n        - captLocal\n        # Detects erroneous case order inside switch statements.\n        # https://go-critic.com/overview.html#caseorder\n        - caseOrder\n        # Detects malformed 'code generated' file comments.\n        # https://go-critic.com/overview.html#codegencomment\n        - codegenComment\n        # Detects comments with non-idiomatic formatting.\n        # https://go-critic.com/overview.html#commentformatting\n        - commentFormatting\n        # Detects commented-out code inside function bodies.\n        # https://go-critic.com/overview.html#commentedoutcode\n        - commentedOutCode\n        # Detects commented-out imports.\n        # https://go-critic.com/overview.html#commentedoutimport\n        - commentedOutImport\n        # Detects when default case in switch isn't on 1st or last position.\n        # https://go-critic.com/overview.html#defaultcaseorder\n        - defaultCaseOrder\n        # Detects loops inside functions that use defer.\n        # https://go-critic.com/overview.html#deferinloop\n        - deferInLoop\n        # Detects deferred function literals that can be simplified.\n        # https://go-critic.com/overview.html#deferunlambda\n        - deferUnlambda\n        # Detects malformed 'deprecated' doc-comments.\n        # https://go-critic.com/overview.html#deprecatedcomment\n        - deprecatedComment\n        # Detects comments that silence go lint complaints about doc-comment.\n        # https://go-critic.com/overview.html#docstub\n        - docStub\n        # Detects suspicious duplicated arguments.\n        # https://go-critic.com/overview.html#duparg\n        - dupArg\n        # Detects duplicated branch bodies inside conditional statements.\n        # https://go-critic.com/overview.html#dupbranchbody\n        - dupBranchBody\n        # Detects duplicated case clauses inside switch or select statements.\n        # https://go-critic.com/overview.html#dupcase\n        - dupCase\n        # Detects multiple imports of the same package under different aliases.\n        # https://go-critic.com/overview.html#dupimport\n        - dupImport\n        # Detects duplicated option function arguments in variadic function calls.\n        # https://go-critic.com/overview.html#dupoption\n        - dupOption\n        # Detects suspicious duplicated sub-expressions.\n        # https://go-critic.com/overview.html#dupsubexpr\n        - dupSubExpr\n        # Detects suspicious formatting strings usage.\n        # https://go-critic.com/overview.html#dynamicfmtstring\n        - dynamicFmtString\n        # Detects else with nested if statement that can be replaced with else-if.\n        # https://go-critic.com/overview.html#elseif\n        - elseif\n        # Detects suspicious empty declarations blocks.\n        # https://go-critic.com/overview.html#emptydecl\n        - emptyDecl\n        # Detects fallthrough that can be avoided by using multi case values.\n        # https://go-critic.com/overview.html#emptyfallthrough\n        - emptyFallthrough\n        # Detects empty string checks that can be written more idiomatically.\n        # https://go-critic.com/overview.html#emptystringtest\n        - emptyStringTest\n        # Detects unoptimal strings/bytes case-insensitive comparison.\n        # https://go-critic.com/overview.html#equalfold\n        - equalFold\n        # Detects unwanted dependencies on the evaluation order.\n        # https://go-critic.com/overview.html#evalorder\n        - evalOrder\n        # Detects calls to exit/fatal inside functions that use defer.\n        # https://go-critic.com/overview.html#exitafterdefer\n        - exitAfterDefer\n        # Detects exposed methods from sync.Mutex and sync.RWMutex.\n        # https://go-critic.com/overview.html#exposedsyncmutex\n        - exposedSyncMutex\n        # Detects suspicious reassignment of error from another package.\n        # https://go-critic.com/overview.html#externalerrorreassign\n        - externalErrorReassign\n        # Detects problems in filepath.Join() function calls.\n        # https://go-critic.com/overview.html#filepathjoin\n        - filepathJoin\n        # Detects immediate dereferencing of `flag` package pointers.\n        # https://go-critic.com/overview.html#flagderef\n        - flagDeref\n        # Detects suspicious flag names.\n        # https://go-critic.com/overview.html#flagname\n        - flagName\n        # Detects hex literals that have mixed case letter digits.\n        # https://go-critic.com/overview.html#hexliteral\n        - hexLiteral\n        # Detects nil usages in http.NewRequest calls, suggesting http.NoBody as an alternative.\n        # https://go-critic.com/overview.html#httpnobody\n        - httpNoBody\n        # Detects params that incur excessive amount of copying.\n        # https://go-critic.com/overview.html#hugeparam\n        - hugeParam\n        # Detects repeated if-else statements and suggests to replace them with switch statement.\n        # https://go-critic.com/overview.html#ifelsechain\n        - ifElseChain\n        # Detects when imported package names shadowed in the assignments.\n        # https://go-critic.com/overview.html#importshadow\n        - importShadow\n        # Detects strings.Index calls that may cause unwanted allocs.\n        # https://go-critic.com/overview.html#indexalloc\n        - indexAlloc\n        # Detects non-assignment statements inside if/switch init clause.\n        # https://go-critic.com/overview.html#initclause\n        - initClause\n        # Detects suspicious map literal keys.\n        # https://go-critic.com/overview.html#mapkey\n        - mapKey\n        # Detects method expression call that can be replaced with a method call.\n        # https://go-critic.com/overview.html#methodexprcall\n        - methodExprCall\n        # Finds where nesting level could be reduced.\n        # https://go-critic.com/overview.html#nestingreduce\n        - nestingReduce\n        # Detects immediate dereferencing of `new` expressions.\n        # https://go-critic.com/overview.html#newderef\n        - newDeref\n        # Detects return statements those results evaluate to nil.\n        # https://go-critic.com/overview.html#nilvalreturn\n        - nilValReturn\n        # Detects old-style octal literals.\n        # https://go-critic.com/overview.html#octalliteral\n        - octalLiteral\n        # Detects various off-by-one kind of errors.\n        # https://go-critic.com/overview.html#offby1\n        - offBy1\n        # Detects if function parameters could be combined by type and suggest the way to do it.\n        # https://go-critic.com/overview.html#paramtypecombine\n        - paramTypeCombine\n        # Detects expressions like []rune(s)[0] that may cause unwanted rune slice allocation.\n        # https://go-critic.com/overview.html#preferdecoderune\n        - preferDecodeRune\n        # Detects concatenation with os.PathSeparator which can be replaced with filepath.Join.\n        # https://go-critic.com/overview.html#preferfilepathjoin\n        - preferFilepathJoin\n        # Detects fmt.Sprint(f/ln) calls which can be replaced with fmt.Fprint(f/ln).\n        # https://go-critic.com/overview.html#preferfprint\n        - preferFprint\n        # Detects w.Write or io.WriteString calls which can be replaced with w.WriteString.\n        # https://go-critic.com/overview.html#preferstringwriter\n        - preferStringWriter\n        # Detects WriteRune calls with rune literal argument that is single byte and reports to use WriteByte instead.\n        # https://go-critic.com/overview.html#preferwritebyte\n        - preferWriteByte\n        # Detects input and output parameters that have a type of pointer to referential type.\n        # https://go-critic.com/overview.html#ptrtorefparam\n        - ptrToRefParam\n        # Detects append all its data while range it.\n        # https://go-critic.com/overview.html#rangeappendall\n        - rangeAppendAll\n        # Detects expensive copies of `for` loop range expressions.\n        # https://go-critic.com/overview.html#rangeexprcopy\n        - rangeExprCopy\n        # Detects loops that copy big objects during each iteration.\n        # https://go-critic.com/overview.html#rangevalcopy\n        - rangeValCopy\n        # Detects redundant fmt.Sprint calls.\n        # https://go-critic.com/overview.html#redundantsprint\n        - redundantSprint\n        # Detects `regexp.Compile*` that can be replaced with `regexp.MustCompile*`.\n        # https://go-critic.com/overview.html#regexpmust\n        - regexpMust\n        # Detects suspicious regexp patterns.\n        # https://go-critic.com/overview.html#regexppattern\n        - regexpPattern\n        # Detects regexp patterns that can be simplified.\n        # https://go-critic.com/overview.html#regexpsimplify\n        - regexpSimplify\n        # Detects suspicious http.Error call without following return.\n        # https://go-critic.com/overview.html#returnafterhttperror\n        - returnAfterHttpError\n        # Runs user-defined rules using ruleguard linter.\n        # https://go-critic.com/overview.html#ruleguard\n        - ruleguard\n        # Detects switch statements that could be better written as if statement.\n        # https://go-critic.com/overview.html#singlecaseswitch\n        - singleCaseSwitch\n        # Detects slice clear loops, suggests an idiom that is recognized by the Go compiler.\n        # https://go-critic.com/overview.html#sliceclear\n        - sliceClear\n        # Detects usage of `len` when result is obvious or doesn't make sense.\n        # https://go-critic.com/overview.html#sloppylen\n        - sloppyLen\n        # Detects suspicious/confusing re-assignments.\n        # https://go-critic.com/overview.html#sloppyreassign\n        - sloppyReassign\n        # Detects redundant type assertions.\n        # https://go-critic.com/overview.html#sloppytypeassert\n        - sloppyTypeAssert\n        # Detects suspicious sort.Slice calls.\n        # https://go-critic.com/overview.html#sortslice\n        - sortSlice\n        # Detects \"%s\" formatting directives that can be replaced with %q.\n        # https://go-critic.com/overview.html#sprintfquotedstring\n        - sprintfQuotedString\n        # Detects issue in Query() and Exec() calls.\n        # https://go-critic.com/overview.html#sqlquery\n        - sqlQuery\n        # Detects string concat operations that can be simplified.\n        # https://go-critic.com/overview.html#stringconcatsimplify\n        - stringConcatSimplify\n        # Detects redundant conversions between string and []byte.\n        # https://go-critic.com/overview.html#stringxbytes\n        - stringXbytes\n        # Detects strings.Compare usage.\n        # https://go-critic.com/overview.html#stringscompare\n        - stringsCompare\n        # Detects switch-over-bool statements that use explicit `true` tag value.\n        # https://go-critic.com/overview.html#switchtrue\n        - switchTrue\n        # Detects sync.Map load+delete operations that can be replaced with LoadAndDelete.\n        # https://go-critic.com/overview.html#syncmaploadanddelete\n        - syncMapLoadAndDelete\n        # Detects manual conversion to milli- or microseconds.\n        # https://go-critic.com/overview.html#timeexprsimplify\n        - timeExprSimplify\n        # Detects TODO comments without detail/assignee.\n        # https://go-critic.com/overview.html#todocommentwithoutdetail\n        - todoCommentWithoutDetail\n        # Detects function with too many results.\n        # https://go-critic.com/overview.html#toomanyresultschecker\n        - tooManyResultsChecker\n        # Detects potential truncation issues when comparing ints of different sizes.\n        # https://go-critic.com/overview.html#truncatecmp\n        - truncateCmp\n        # Detects repeated type assertions and suggests to replace them with type switch statement.\n        # https://go-critic.com/overview.html#typeassertchain\n        - typeAssertChain\n        # Detects method declarations preceding the type definition itself.\n        # https://go-critic.com/overview.html#typedeffirst\n        - typeDefFirst\n        # Detects type switches that can benefit from type guard clause with variable.\n        # https://go-critic.com/overview.html#typeswitchvar\n        - typeSwitchVar\n        # Detects unneeded parenthesis inside type expressions and suggests to remove them.\n        # https://go-critic.com/overview.html#typeunparen\n        - typeUnparen\n        # Detects unchecked errors in if statements.\n        # https://go-critic.com/overview.html#uncheckedinlineerr\n        - uncheckedInlineErr\n        # Detects dereference expressions that can be omitted.\n        # https://go-critic.com/overview.html#underef\n        - underef\n        # Detects redundant statement labels.\n        # https://go-critic.com/overview.html#unlabelstmt\n        - unlabelStmt\n        # Detects function literals that can be simplified.\n        # https://go-critic.com/overview.html#unlambda\n        - unlambda\n        # Detects unnamed results that may benefit from names.\n        # https://go-critic.com/overview.html#unnamedresult\n        - unnamedResult\n        # Detects unnecessary braced statement blocks.\n        # https://go-critic.com/overview.html#unnecessaryblock\n        - unnecessaryBlock\n        # Detects redundantly deferred calls.\n        # https://go-critic.com/overview.html#unnecessarydefer\n        - unnecessaryDefer\n        # Detects slice expressions that can be simplified to sliced expression itself.\n        # https://go-critic.com/overview.html#unslice\n        - unslice\n        # Detects value swapping code that are not using parallel assignment.\n        # https://go-critic.com/overview.html#valswap\n        - valSwap\n        # Detects conditions that are unsafe due to not being exhaustive.\n        # https://go-critic.com/overview.html#weakcond\n        - weakCond\n        # Ensures that `//nolint` comments include an explanation.\n        # https://go-critic.com/overview.html#whynolint\n        - whyNoLint\n        # Detects function calls that can be replaced with convenience wrappers.\n        # https://go-critic.com/overview.html#wrapperfunc\n        - wrapperFunc\n        # Detects Yoda style expressions and suggests to replace them.\n        # https://go-critic.com/overview.html#yodastyleexpr\n        - yodaStyleExpr\n        # Detects bytes.Repeat with 0 value.\n        # https://go-critic.com/overview.html#zerobyterepeat\n        - zeroByteRepeat\n\n      # Enable all checks.\n      # Default: false\n      enable-all: true\n      # Which checks should be disabled; can't be combined with 'enabled-checks'.\n      # Default: []\n      disabled-checks:\n        - appendAssign\n        - appendCombine\n        - argOrder\n        - assignOp\n        - badCall\n        - badCond\n        - badLock\n        - badRegexp\n        - badSorting\n        - badSyncOnceFunc\n        - boolExprSimplify\n        - builtinShadow\n        - builtinShadowDecl\n        - captLocal\n        - caseOrder\n        - codegenComment\n        - commentFormatting\n        - commentedOutCode\n        - commentedOutImport\n        - defaultCaseOrder\n        - deferInLoop\n        - deferUnlambda\n        - deprecatedComment\n        - docStub\n        - dupArg\n        - dupBranchBody\n        - dupCase\n        - dupImport\n        - dupSubExpr\n        - dynamicFmtString\n        - elseif\n        - emptyDecl\n        - emptyFallthrough\n        - emptyStringTest\n        - equalFold\n        - evalOrder\n        - exitAfterDefer\n        - exposedSyncMutex\n        - externalErrorReassign\n        - filepathJoin\n        - flagDeref\n        - flagName\n        - hexLiteral\n        - httpNoBody\n        - hugeParam\n        - ifElseChain\n        - importShadow\n        - indexAlloc\n        - initClause\n        - mapKey\n        - methodExprCall\n        - nestingReduce\n        - newDeref\n        - nilValReturn\n        - octalLiteral\n        - offBy1\n        - paramTypeCombine\n        - preferDecodeRune\n        - preferFilepathJoin\n        - preferFprint\n        - preferStringWriter\n        - preferWriteByte\n        - ptrToRefParam\n        - rangeAppendAll\n        - rangeExprCopy\n        - rangeValCopy\n        - redundantSprint\n        - regexpMust\n        - regexpPattern\n        - regexpSimplify\n        - returnAfterHttpError\n        - ruleguard\n        - singleCaseSwitch\n        - sliceClear\n        - sloppyLen\n        - sloppyReassign\n        - sloppyTypeAssert\n        - sortSlice\n        - sprintfQuotedString\n        - sqlQuery\n        - stringConcatSimplify\n        - stringXbytes\n        - stringsCompare\n        - switchTrue\n        - syncMapLoadAndDelete\n        - timeExprSimplify\n        - todoCommentWithoutDetail\n        - tooManyResultsChecker\n        - truncateCmp\n        - typeAssertChain\n        - typeDefFirst\n        - typeSwitchVar\n        - typeUnparen\n        - uncheckedInlineErr\n        - underef\n        - unlabelStmt\n        - unlambda\n        - unnamedResult\n        - unnecessaryBlock\n        - unnecessaryDefer\n        - unslice\n        - valSwap\n        - weakCond\n        - whyNoLint\n        - wrapperFunc\n        - yodaStyleExpr\n\n      # Enable multiple checks by tags in addition to default checks.\n      # Run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic` to see all tags and checks.\n      # See https://github.com/go-critic/go-critic#usage -> section \"Tags\".\n      # Default: []\n      enabled-tags:\n        - diagnostic\n        - style\n        - performance\n        - experimental\n        - opinionated\n      disabled-tags:\n        - diagnostic\n        - style\n        - performance\n        - experimental\n        - opinionated\n\n      # Settings passed to gocritic.\n      # The settings key is the name of a supported gocritic checker.\n      # The list of supported checkers can be found at https://go-critic.com/overview.\n      settings:\n        # Must be valid enabled check name.\n        captLocal:\n          # Whether to restrict checker to params only.\n          # Default: true\n          paramsOnly: false\n        commentedOutCode:\n          # Min length of the comment that triggers a warning.\n          # Default: 15\n          minLength: 50\n        elseif:\n          # Whether to skip balanced if-else pairs.\n          # Default: true\n          skipBalanced: false\n        hugeParam:\n          # Size in bytes that makes the warning trigger.\n          # Default: 80\n          sizeThreshold: 70\n        ifElseChain:\n          # Min number of if-else blocks that makes the warning trigger.\n          # Default: 2\n          minThreshold: 4\n        nestingReduce:\n          # Min number of statements inside a branch to trigger a warning.\n          # Default: 5\n          bodyWidth: 4\n        rangeExprCopy:\n          # Size in bytes that makes the warning trigger.\n          # Default: 512\n          sizeThreshold: 516\n          # Whether to check test functions\n          # Default: true\n          skipTestFuncs: false\n        rangeValCopy:\n          # Size in bytes that makes the warning trigger.\n          # Default: 128\n          sizeThreshold: 32\n          # Whether to check test functions.\n          # Default: true\n          skipTestFuncs: false\n        ruleguard:\n          # Enable debug to identify which 'Where' condition was rejected.\n          # The value of the parameter is the name of a function in a ruleguard file.\n          #\n          # When a rule is evaluated:\n          # If:\n          #   The Match() clause is accepted; and\n          #   One of the conditions in the Where() clause is rejected,\n          # Then:\n          #   ruleguard prints the specific Where() condition that was rejected.\n          #\n          # The option is passed to the ruleguard 'debug-group' argument.\n          # Default: \"\"\n          debug: 'emptyDecl'\n          # Determines the behavior when an error occurs while parsing ruleguard files.\n          # If flag is not set, log error and skip rule files that contain an error.\n          # If flag is set, the value must be a comma-separated list of error conditions.\n          # - 'all':    fail on all errors.\n          # - 'import': ruleguard rule imports a package that cannot be found.\n          # - 'dsl':    gorule file does not comply with the ruleguard DSL.\n          # Default: \"\"\n          failOn: dsl,import\n          # Comma-separated list of file paths containing ruleguard rules.\n          # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.\n          # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.\n          # The placeholder '${config-path}' is substituted with a path relative to the configuration file.\n          # Glob patterns such as 'rules-*.go' may be specified.\n          # Default: \"\"\n          rules: '${base-path}/ruleguard/rules-*.go,${base-path}/myrule1.go'\n          # Comma-separated list of enabled groups or skip empty to enable everything.\n          # Tags can be defined with # character prefix.\n          # Default: \"<all>\"\n          enable: \"myGroupName,#myTagName\"\n          # Comma-separated list of disabled groups or skip empty to enable everything.\n          # Tags can be defined with # character prefix.\n          # Default: \"\"\n          disable: \"myGroupName,#myTagName\"\n        tooManyResultsChecker:\n          # Maximum number of results.\n          # Default: 5\n          maxResults: 10\n        truncateCmp:\n          # Whether to skip int/uint/uintptr types.\n          # Default: true\n          skipArchDependent: false\n        underef:\n          # Whether to skip (*x).method() calls where x is a pointer receiver.\n          # Default: true\n          skipRecvDeref: false\n        unnamedResult:\n          # Whether to check exported functions.\n          # Default: false\n          checkExported: true\n\n    gocyclo:\n      # Minimal code complexity to report.\n      # Default: 30 (but we recommend 10-20)\n      min-complexity: 10\n\n    godoclint:\n      # Default set of rules to enable.\n      # Possible values are: `basic`, `all` or `none`.\n      # Default: `basic` (enables `pkg-doc`, `single-pkg-doc`, `start-with-name`, and `deprecated`)\n      default: all\n\n      # List of rules to enable in addition to the default set.\n      # Default: empty\n      enable:\n        # Check proper package-level godoc, if any.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#pkg-doc\n        - pkg-doc\n        # Assert at most one godoc per package.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#single-pkg-doc\n        - single-pkg-doc\n        # Require all packages to have a godoc.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-pkg-doc\n        - require-pkg-doc\n        # Assert symbol godocs start with the symbol name.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#start-with-name\n        - start-with-name\n        # Require godoc for all public symbols.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-doc\n        - require-doc\n        # Assert correct formatting of deprecation notes.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#deprecated\n        - deprecated\n        # Assert maximum line length for godocs.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#max-len\n        - max-len\n        # Assert no unused link in godocs.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#no-unused-link\n        - no-unused-link\n        # Require proper doc links to standard library declarations where applicable.\n        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-stdlib-doclink\n        - require-stdlib-doclink\n\n      # List of rules to disable.\n      # Default: empty\n      disable:\n        - pkg-doc\n        - single-pkg-doc\n        - require-pkg-doc\n        - start-with-name\n        - require-doc\n        - deprecated\n        - max-len\n        - no-unused-link\n        - require-stdlib-doclink\n\n      # A map for fine-tuning individual rules.\n      # All subkeys are optional.\n      options:\n        max-len:\n          # Maximum line length for godocs, not including the `//`, `/*` or `*/` tokens.\n          # Default: 77\n          length: 127\n\n        require-doc:\n          # Ignore exported (public) symbols when applying the `require-doc` rule.\n          # Default: false\n          ignore-exported: true\n\n          # Ignore unexported (private) symbols when applying the `require-doc` rule.\n          # Default: true\n          ignore-unexported: false\n\n        start-with-name:\n          # Include unexported symbols when applying the `start-with-name` rule.\n          # Default: false\n          include-unexported: true\n\n    godot:\n      # Comments to be checked: `declarations`, `toplevel`, `noinline` or `all`.\n      # Default: declarations\n      scope: toplevel\n      # List of regexps for excluding particular comment lines from check.\n      # Default: []\n      exclude:\n        # Exclude todo and fixme comments.\n        - \"^fixme:\"\n        - \"^todo:\"\n      # Check that each sentence ends with a period.\n      # Default: true\n      period: false\n      # Check that each sentence starts with a capital letter.\n      # Default: false\n      capital: true\n\n    godox:\n      # Report any comments starting with keywords, this is useful for TODO or FIXME comments that\n      # might be left in the code accidentally and should be resolved before merging.\n      # Default: [\"TODO\", \"BUG\", \"FIXME\"]\n      keywords:\n        - NOTE\n        - OPTIMIZE # marks code that should be optimized before merging\n        - HACK # marks hack-around that should be removed before merging\n\n    goheader:\n      # Supports two types 'const` and `regexp`.\n      # Values can be used recursively.\n      # Default: {}\n      values:\n        const:\n          # Define here const type values in format k:v.\n          # For example:\n          COMPANY: MY COMPANY\n        regexp:\n          # Define here regexp type values.\n          # for example:\n          AUTHOR: .*@mycompany\\.com\n      # The template used for checking.\n      # Put here copyright header template for source code files.\n      # Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.\n      # Default: \"\"\n      template: |-\n        {{ AUTHOR }} {{ COMPANY }} {{ YEAR }}\n        SPDX-License-Identifier: Apache-2.0\n\n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at:\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n        Unless required by applicable law or agreed to in writing, software\n        distributed under the License is distributed on an \"AS IS\" BASIS,\n        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n        See the License for the specific language governing permissions and\n        limitations under the License.\n      # As alternative of directive 'template', you may put the path to file with the template source.\n      # Useful if you need to load the template from a specific file.\n      # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.\n      # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.\n      # The placeholder '${config-path}' is substituted with a path relative to the configuration file.\n      # Default: \"\"\n      template-path: /path/to/my/template.tmpl\n\n    gomoddirectives:\n      # Allow local `replace` directives.\n      # Default: false\n      replace-local: true\n      # List of allowed `replace` directives.\n      # Default: []\n      replace-allow-list:\n        - launchpad.net/gocheck\n      # Allow to not explain why the version has been retracted in the `retract` directives.\n      # Default: false\n      retract-allow-no-explanation: true\n      # Forbid the use of the `exclude` directives.\n      # Default: false\n      exclude-forbidden: true\n      # Forbid the use of the `ignore` directives (>= go1.25).\n      # Default: false\n      ignore-forbidden: true\n      # Forbid the use of the `toolchain` directive.\n      # Default: false\n      toolchain-forbidden: true\n      # Defines a pattern to validate `toolchain` directive.\n      # Default: '' (no match)\n      toolchain-pattern: 'go1\\.23\\.\\d+$'\n      # Forbid the use of the `tool` directives.\n      # Default: false\n      tool-forbidden: true\n      # Forbid the use of the `godebug` directive.\n      # Default: false\n      go-debug-forbidden: true\n      # Defines a pattern to validate `go` minimum version directive.\n      # Default: '' (no match)\n      go-version-pattern: '\\d\\.\\d+(\\.0)?'\n      # Check the validity of the module path.\n      # Default: false\n      check-module-path: true\n\n    gomodguard:\n      allowed:\n        # List of allowed modules.\n        # Default: []\n        modules:\n          - gopkg.in/yaml.v2\n        # List of allowed module domains.\n        # Default: []\n        domains:\n          - golang.org\n      blocked:\n        # List of blocked modules.\n        # Default: []\n        modules:\n          # Blocked module.\n          - github.com/uudashr/go-module:\n              # Recommended modules that should be used instead. (Optional)\n              recommendations:\n                - golang.org/x/mod\n              # Reason why the recommended module should be used. (Optional)\n              reason: \"`mod` is the official go.mod parser library.\"\n        # List of blocked module version constraints.\n        # Default: []\n        versions:\n          # Blocked module with version constraint.\n          - github.com/mitchellh/go-homedir:\n              # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons.\n              version: \"< 1.1.0\"\n              # Reason why the version constraint exists. (Optional)\n              reason: \"testing if blocked version constraint works.\"\n        # Set to true to raise lint issues for packages that are loaded from a local path via replace directive.\n        # Default: false\n        local-replace-directives: false\n\n    gosec:\n      # To select a subset of rules to run.\n      # Available rules: https://github.com/securego/gosec#available-rules\n      # Default: [] - means include all rules\n      includes:\n        - G101 # Look for hardcoded credentials\n        - G102 # Bind to all interfaces\n        - G103 # Audit the use of unsafe block\n        - G104 # Audit errors not checked\n        - G106 # Audit the use of ssh.InsecureIgnoreHostKey function\n        - G107 # Url provided to HTTP request as taint input\n        - G108 # Profiling endpoint is automatically exposed\n        - G109 # Converting strconv.Atoi result to int32/int16\n        - G110 # Detect io.Copy instead of io.CopyN when decompression\n        - G111 # Detect http.Dir('/') as a potential risk\n        - G112 # Detect ReadHeaderTimeout not configured as a potential risk\n        - G113 # HTTP request smuggling via conflicting headers or bare LF in body parsing\n        - G114 # Use of net/http serve function that has no support for setting timeouts\n        - G115 # Type conversion which leads to integer overflow\n        - G116 # Detect Trojan Source attacks using bidirectional Unicode characters\n        - G117 # Potential exposure of secrets via JSON/YAML/XML/TOML marshaling\n        - G118 # Context propagation failure leading to goroutine/resource leaks\n        - G119 # Unsafe redirect policy may propagate sensitive headers\n        - G120 # Unbounded form parsing in HTTP handlers can cause memory exhaustion\n        - G121 # Unsafe CrossOriginProtection bypass patterns\n        - G122 # Filesystem TOCTOU race risk in filepath.Walk/WalkDir callbacks\n        - G123 # TLS resumption may bypass VerifyPeerCertificate when VerifyConnection is unset\n        - G201 # SQL query construction using format string\n        - G202 # SQL query construction using string concatenation\n        - G203 # Use of unescaped data in HTML templates\n        - G204 # Audit use of command execution\n        - G301 # Poor file permissions used when creating a directory\n        - G302 # Poor file permissions used when creation file or using chmod\n        - G303 # Creating tempfile using a predictable path\n        - G304 # File path provided as taint input\n        - G305 # File path traversal when extracting zip archive\n        - G306 # Poor file permissions used when writing to a file\n        - G307 # Poor file permissions used when creating a file with os.Create\n        - G401 # Detect the usage of MD5 or SHA1\n        - G402 # Look for bad TLS connection settings\n        - G403 # Ensure minimum RSA key length of 2048 bits\n        - G404 # Insecure random number source (rand)\n        - G405 # Detect the usage of DES or RC4\n        - G406 # Detect the usage of deprecated MD4 or RIPEMD160\n        - G408 # Stateful misuse of ssh.PublicKeyCallback leading to auth bypass\n        - G501 # Import blocklist: crypto/md5\n        - G502 # Import blocklist: crypto/des\n        - G503 # Import blocklist: crypto/rc4\n        - G504 # Import blocklist: net/http/cgi\n        - G505 # Import blocklist: crypto/sha1\n        - G506 # Import blocklist: golang.org/x/crypto/md4\n        - G507 # Import blocklist: golang.org/x/crypto/ripemd160\n        - G601 # Implicit memory aliasing in RangeStmt\n        - G602 # Possible slice bounds out of range\n        - G701 # SQL injection via taint analysis\n        - G702 # Command injection via taint analysis\n        - G703 # Path traversal via taint analysis\n        - G704 # SSRF via taint analysis\n        - G705 # XSS via taint analysis\n        - G706 # Log injection via taint analysis\n        - G707 # SMTP command/header injection via taint analysis\n\n      # To specify a set of rules to explicitly exclude.\n      # Available rules: https://github.com/securego/gosec#available-rules\n      # Default: []\n      excludes:\n        - G101 # Look for hardcoded credentials\n        - G102 # Bind to all interfaces\n        - G103 # Audit the use of unsafe block\n        - G104 # Audit errors not checked\n        - G106 # Audit the use of ssh.InsecureIgnoreHostKey function\n        - G107 # Url provided to HTTP request as taint input\n        - G108 # Profiling endpoint is automatically exposed\n        - G109 # Converting strconv.Atoi result to int32/int16\n        - G110 # Detect io.Copy instead of io.CopyN when decompression\n        - G111 # Detect http.Dir('/') as a potential risk\n        - G112 # Detect ReadHeaderTimeout not configured as a potential risk\n        - G114 # Use of net/http serve function that has no support for setting timeouts\n        - G115 # Type conversion which leads to integer overflow\n        - G116 # Detect Trojan Source attacks using bidirectional Unicode characters\n        - G201 # SQL query construction using format string\n        - G202 # SQL query construction using string concatenation\n        - G203 # Use of unescaped data in HTML templates\n        - G204 # Audit use of command execution\n        - G301 # Poor file permissions used when creating a directory\n        - G302 # Poor file permissions used when creation file or using chmod\n        - G303 # Creating tempfile using a predictable path\n        - G304 # File path provided as taint input\n        - G305 # File path traversal when extracting zip archive\n        - G306 # Poor file permissions used when writing to a file\n        - G307 # Poor file permissions used when creating a file with os.Create\n        - G401 # Detect the usage of MD5 or SHA1\n        - G402 # Look for bad TLS connection settings\n        - G403 # Ensure minimum RSA key length of 2048 bits\n        - G404 # Insecure random number source (rand)\n        - G405 # Detect the usage of DES or RC4\n        - G406 # Detect the usage of deprecated MD4 or RIPEMD160\n        - G501 # Import blocklist: crypto/md5\n        - G502 # Import blocklist: crypto/des\n        - G503 # Import blocklist: crypto/rc4\n        - G504 # Import blocklist: net/http/cgi\n        - G505 # Import blocklist: crypto/sha1\n        - G506 # Import blocklist: golang.org/x/crypto/md4\n        - G507 # Import blocklist: golang.org/x/crypto/ripemd160\n        - G601 # Implicit memory aliasing in RangeStmt\n        - G602 # Possible slice bounds out of range\n\n      # Filter out the issues with a lower severity than the given value.\n      # Valid options are: low, medium, high.\n      # Default: low\n      severity: medium\n\n      # Filter out the issues with a lower confidence than the given value.\n      # Valid options are: low, medium, high.\n      # Default: low\n      confidence: medium\n\n      # Concurrency value.\n      # Default: the number of logical CPUs usable by the current process.\n      concurrency: 12\n\n      # To specify the configuration of rules.\n      config:\n        # Globals are applicable to all rules.\n        global:\n          # If true, ignore #nosec in comments (and an alternative as well).\n          # Default: false\n          nosec: true\n          # Add an alternative comment prefix to #nosec (both will work at the same time).\n          # Default: \"\"\n          \"#nosec\": \"#my-custom-nosec\"\n          # Define whether nosec issues are counted as finding or not.\n          # Default: false\n          show-ignored: true\n          # Audit mode enables addition checks that for normal code analysis might be too nosy.\n          # Default: false\n          audit: true\n        G101:\n          # Regexp pattern for variables and constants to find.\n          # Default: \"(?i)passwd|pass|password|pwd|secret|token|pw|apiKey|bearer|cred\"\n          pattern: \"(?i)example\"\n          # If true, complain about all cases (even with low entropy).\n          # Default: false\n          ignore_entropy: false\n          # Maximum allowed entropy of the string.\n          # Default: \"80.0\"\n          entropy_threshold: \"80.0\"\n          # Maximum allowed value of entropy/string length.\n          # Is taken into account if entropy >= entropy_threshold/2.\n          # Default: \"3.0\"\n          per_char_threshold: \"3.0\"\n          # Calculate entropy for first N chars of the string.\n          # Default: \"16\"\n          truncate: \"32\"\n        # Additional functions to ignore while checking unhandled errors.\n        # Following functions always ignored:\n        #   bytes.Buffer:\n        #     - Write\n        #     - WriteByte\n        #     - WriteRune\n        #     - WriteString\n        #   fmt:\n        #     - Print\n        #     - Printf\n        #     - Println\n        #     - Fprint\n        #     - Fprintf\n        #     - Fprintln\n        #   strings.Builder:\n        #     - Write\n        #     - WriteByte\n        #     - WriteRune\n        #     - WriteString\n        #   io.PipeWriter:\n        #     - CloseWithError\n        #   hash.Hash:\n        #     - Write\n        #   os:\n        #     - Unsetenv\n        # Default: {}\n        G104:\n          fmt:\n            - Fscanf\n        G111:\n          # Regexp pattern to find potential directory traversal.\n          # Default: \"http\\\\.Dir\\\\(\\\"\\\\/\\\"\\\\)|http\\\\.Dir\\\\('\\\\/'\\\\)\"\n          pattern: \"custom\\\\.Dir\\\\(\\\\)\"\n        # Maximum allowed permissions mode for os.Mkdir and os.MkdirAll.\n        # Default: \"0750\"\n        G301: \"0750\"\n        # Maximum allowed permissions mode for os.OpenFile and os.Chmod.\n        # Default: \"0600\"\n        G302: \"0600\"\n        # Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile.\n        # Default: \"0600\"\n        G306: \"0600\"\n\n    gosmopolitan:\n      # Allow and ignore `time.Local` usages.\n      #\n      # Default: false\n      allow-time-local: true\n      # List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".\n      # String literals inside call-like expressions to, or struct literals of those names,\n      # are exempt from the writing system check.\n      #\n      # Default: []\n      escape-hatches:\n        - 'github.com/nicksnyder/go-i18n/v2/i18n.Message'\n        - 'example.com/your/project/i18n/markers.Raw'\n        - 'example.com/your/project/i18n/markers.OK'\n        - 'example.com/your/project/i18n/markers.TODO'\n        - 'command-line-arguments.Simple'\n      # List of Unicode scripts to watch for any usage in string literals.\n      # https://pkg.go.dev/unicode#pkg-variables\n      #\n      # Default: [\"Han\"]\n      watch-for-scripts:\n        - Devanagari\n        - Han\n        - Hangul\n        - Hiragana\n        - Katakana\n\n    govet:\n      # Disable all analyzers.\n      # Default: false\n      disable-all: true\n      # Enable analyzers by name.\n      # (In addition to default:\n      #   appends, asmdecl, assign, atomic, bools, buildtag, cgocall, composites, copylocks, defers, directive, errorsas,\n      #   framepointer, httpresponse, ifaceassert, loopclosure, lostcancel, nilfunc, printf, shift, sigchanyzer, slog,\n      #   stdmethods, stringintconv, structtag, testinggoroutine, tests, timeformat, unmarshal, unreachable, unsafeptr,\n      #   unusedresult\n      # ).\n      # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.\n      # Default: []\n      enable:\n        # Check for missing values after append.\n        - appends\n        # Report mismatches between assembly files and Go declarations.\n        - asmdecl\n        # Check for useless assignments.\n        - assign\n        # Check for common mistakes using the sync/atomic package.\n        - atomic\n        # Check for non-64-bits-aligned arguments to sync/atomic functions.\n        - atomicalign\n        # Check for common mistakes involving boolean operators.\n        - bools\n        # Check //go:build and // +build directives.\n        - buildtag\n        # Detect some violations of the cgo pointer passing rules.\n        - cgocall\n        # Check for unkeyed composite literals.\n        - composites\n        # Check for locks erroneously passed by value.\n        - copylocks\n        # Check for calls of reflect.DeepEqual on error values.\n        - deepequalerrors\n        # Report common mistakes in defer statements.\n        - defers\n        # Check Go toolchain directives such as //go:debug.\n        - directive\n        # Report passing non-pointer or non-error values to errors.As.\n        - errorsas\n        # Find structs that would use less memory if their fields were sorted.\n        - fieldalignment\n        # Find calls to a particular function.\n        - findcall\n        # Report assembly that clobbers the frame pointer before saving it.\n        - framepointer\n        # Check format of addresses passed to net.Dial.\n        - hostport\n        # Report using Go 1.22 enhanced ServeMux patterns in older Go versions.\n        - httpmux\n        # Check for mistakes using HTTP responses.\n        - httpresponse\n        # Detect impossible interface-to-interface type assertions.\n        - ifaceassert\n        # Check references to loop variables from within nested functions.\n        - loopclosure\n        # Check cancel func returned by context.WithCancel is called.\n        - lostcancel\n        # Check for useless comparisons between functions and nil.\n        - nilfunc\n        # Check for redundant or impossible nil comparisons.\n        - nilness\n        # Check consistency of Printf format strings and arguments.\n        - printf\n        # Check for comparing reflect.Value values with == or reflect.DeepEqual.\n        - reflectvaluecompare\n        # Check for possible unintended shadowing of variables.\n        - shadow\n        # Check for shifts that equal or exceed the width of the integer.\n        - shift\n        # Check for unbuffered channel of os.Signal.\n        - sigchanyzer\n        # Check for invalid structured logging calls.\n        - slog\n        # Check the argument type of sort.Slice.\n        - sortslice\n        # Check signature of methods of well-known interfaces.\n        - stdmethods\n        # Report uses of too-new standard library symbols.\n        - stdversion\n        # Check for string(int) conversions.\n        - stringintconv\n        # Check that struct field tags conform to reflect.StructTag.Get.\n        - structtag\n        # Report calls to (*testing.T).Fatal from goroutines started by a test.\n        - testinggoroutine\n        # Check for common mistaken usages of tests and examples.\n        - tests\n        # Check for calls of (time.Time).Format or time.Parse with 2006-02-01.\n        - timeformat\n        # Report passing non-pointer or non-interface values to unmarshal.\n        - unmarshal\n        # Check for unreachable code.\n        - unreachable\n        # Check for invalid conversions of uintptr to unsafe.Pointer.\n        - unsafeptr\n        # Check for unused results of calls to some functions.\n        - unusedresult\n        # Checks for unused writes.\n        - unusedwrite\n        # Check for misuses of sync.WaitGroup.\n        - waitgroup\n\n      # Enable all analyzers.\n      # Default: false\n      enable-all: true\n      # Disable analyzers by name.\n      # (In addition to default\n      #   atomicalign, deepequalerrors, fieldalignment, findcall, nilness, reflectvaluecompare, shadow, sortslice,\n      #   timeformat, unusedwrite\n      # ).\n      # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.\n      # Default: []\n      disable:\n        - appends\n        - asmdecl\n        - assign\n        - atomic\n        - atomicalign\n        - bools\n        - buildtag\n        - cgocall\n        - composites\n        - copylocks\n        - deepequalerrors\n        - defers\n        - directive\n        - errorsas\n        - fieldalignment\n        - findcall\n        - framepointer\n        - hostport\n        - httpmux\n        - httpresponse\n        - ifaceassert\n        - loopclosure\n        - lostcancel\n        - nilfunc\n        - nilness\n        - printf\n        - reflectvaluecompare\n        - shadow\n        - shift\n        - sigchanyzer\n        - slog\n        - sortslice\n        - stdmethods\n        - stdversion\n        - stringintconv\n        - structtag\n        - testinggoroutine\n        - tests\n        - timeformat\n        - unmarshal\n        - unreachable\n        - unsafeptr\n        - unusedresult\n        - unusedwrite\n        - waitgroup\n\n      # Settings per analyzer.\n      settings:\n        # Analyzer name, run `go tool vet help` to see all analyzers.\n        printf:\n          # Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`).\n          # Default: []\n          funcs:\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Infof\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Warnf\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Errorf\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Fatalf\n        shadow:\n          # Whether to be strict about shadowing; can be noisy.\n          # Default: false\n          strict: true\n        unusedresult:\n          # Comma-separated list of functions whose results must be used.\n          # (In addition to default:\n          #   context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue, errors.New, fmt.Errorf,\n          #   fmt.Sprint, fmt.Sprintf, sort.Reverse\n          # ).\n          # Default: []\n          funcs:\n            - pkg.MyFunc\n          # Comma-separated list of names of methods of type func() string whose results must be used.\n          # (In addition to default Error,String).\n          # Default: []\n          stringmethods:\n            - MyMethod\n\n    grouper:\n      # Require the use of a single global 'const' declaration only.\n      # Default: false\n      const-require-single-const: true\n      # Require the use of grouped global 'const' declarations.\n      # Default: false\n      const-require-grouping: true\n\n      # Require the use of a single 'import' declaration only.\n      # Default: false\n      import-require-single-import: true\n      # Require the use of grouped 'import' declarations.\n      # Default: false\n      import-require-grouping: true\n\n      # Require the use of a single global 'type' declaration only.\n      # Default: false\n      type-require-single-type: true\n      # Require the use of grouped global 'type' declarations.\n      # Default: false\n      type-require-grouping: true\n\n      # Require the use of a single global 'var' declaration only.\n      # Default: false\n      var-require-single-var: true\n      # Require the use of grouped global 'var' declarations.\n      # Default: false\n      var-require-grouping: true\n\n    iface:\n      # List of analyzers.\n      # Default: [\"identical\"]\n      enable:\n        - identical # Identifies interfaces in the same package that have identical method sets.\n        - unused # Identifies interfaces that are not used anywhere in the same package where the interface is defined.\n        - opaque # Identifies functions that return interfaces, but the actual returned value is always a single concrete implementation.\n        - unexported # Identifies interfaces that are not exported but are used in exported functions or methods.\n      settings:\n        unused:\n          # List of packages path to exclude from the check.\n          # Default: []\n          exclude:\n            - github.com/example/log\n\n    importas:\n      # Do not allow unaliased imports of aliased packages.\n      # Default: false\n      no-unaliased: true\n      # Do not allow non-required aliases.\n      # Default: false\n      no-extra-aliases: true\n      # List of aliases\n      # Default: []\n      alias:\n        # Using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package.\n        - pkg: knative.dev/serving/pkg/apis/serving/v1\n          alias: servingv1\n        # Using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package.\n        - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1\n          alias: autoscalingv1alpha1\n        # You can specify the package path by regular expression,\n        # and alias by regular expression expansion syntax like below.\n        # See https://github.com/julz/importas#use-regular-expression for details.\n        - pkg: knative.dev/serving/pkg/apis/(\\w+)/(v[\\w\\d]+)\n          alias: $1$2\n        # An explicit empty alias can be used to ensure no aliases are used for a package.\n        # This can be useful if `no-extra-aliases: true` doesn't fit your need.\n        # Multiple packages can use an empty alias.\n        - pkg: errors\n          alias: \"\"\n\n    inamedparam:\n      # Skips check for interface methods with only a single parameter.\n      # Default: false\n      skip-single-param: true\n\n    ineffassign:\n      # Check escaping variables of type error, may cause false positives.\n      # Default: false\n      check-escaping-errors: true\n\n    interfacebloat:\n      # The maximum number of methods allowed for an interface.\n      # Default: 10\n      max: 5\n\n    iotamixing:\n      # Whether to report individual consts rather than just the const block.\n      # Default: false\n      report-individual: true\n\n    ireturn:\n      # List of interfaces to allow.\n      # Lists of the keywords and regular expressions matched to interface or package names can be used.\n      # `allow` and `reject` settings cannot be used at the same time.\n      #\n      # Keywords:\n      # - `empty` for `interface{}`\n      # - `error` for errors\n      # - `stdlib` for standard library\n      # - `anon` for anonymous interfaces\n      # - `generic` for generic interfaces added in go 1.18\n      #\n      # Default: [anon, error, empty, stdlib]\n      allow:\n        - anon\n        # You can specify idiomatic endings for interface\n        - (or|er)$\n\n      # List of interfaces to reject.\n      # Lists of the keywords and regular expressions matched to interface or package names can be used.\n      # `allow` and `reject` settings cannot be used at the same time.\n      #\n      # Keywords:\n      # - `empty` for `interface{}`\n      # - `error` for errors\n      # - `stdlib` for standard library\n      # - `anon` for anonymous interfaces\n      # - `generic` for generic interfaces added in go 1.18\n      #\n      # Default: []\n      reject:\n        - github.com\\/user\\/package\\/v4\\.Type\n\n    lll:\n      # Max line length, lines longer will be reported.\n      # '\\t' is counted as 1 character by default, and can be changed with the tab-width option.\n      # Default: 120.\n      line-length: 120\n      # Tab width in spaces.\n      # Default: 1\n      tab-width: 1\n\n    loggercheck:\n      # Allow check for the github.com/go-kit/log library.\n      # Default: true\n      kitlog: false\n      # Allow check for the k8s.io/klog/v2 library.\n      # Default: true\n      klog: false\n      # Allow check for the github.com/go-logr/logr library.\n      # Default: true\n      logr: false\n      # Allow check for the log/slog library.\n      # Default: true\n      slog: false\n      # Allow check for the \"sugar logger\" from go.uber.org/zap library.\n      # Default: true\n      zap: false\n      # Require all logging keys to be inlined constant strings.\n      # Default: false\n      require-string-key: true\n      # Require printf-like format specifier (%s, %d for example) not present.\n      # Default: false\n      no-printf-like: true\n      # List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\n      # For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt\n      # Default: empty\n      rules:\n        - k8s.io/klog/v2.InfoS   # package level exported functions\n        - (github.com/go-logr/logr.Logger).Error  # \"Methods\"\n        - (*go.uber.org/zap.SugaredLogger).With  # Also \"Methods\", but with a pointer receiver\n\n    maintidx:\n      # Show functions with maintainability index lower than N.\n      # A high index indicates better maintainability (it's kind of the opposite of complexity).\n      # Default: 20\n      under: 100\n\n    makezero:\n      # Allow only slices initialized with a length of zero.\n      # Default: false\n      always: true\n\n    misspell:\n      # Correct spellings using locale preferences for US or UK.\n      # Setting locale to US will correct the British spelling of 'colour' to 'color'.\n      # Default is to use a neutral variety of English.\n      locale: US\n      # Typos to ignore.\n      # Should be in lower case.\n      # Default: []\n      ignore-rules:\n        - someword\n      # Extra word corrections.\n      # `typo` and `correction` should only contain letters.\n      # The words are case-insensitive.\n      # Default: []\n      extra-words:\n        - typo: \"iff\"\n          correction: \"if\"\n        - typo: \"cancelation\"\n          correction: \"cancellation\"\n      # Mode of the analysis:\n      # - default: checks all the file content.\n      # - restricted: checks only comments.\n      # Default: \"\"\n      mode: restricted\n\n    mnd:\n      # List of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\n      # Default: [\"argument\", \"case\", \"condition\", \"operation\", \"return\", \"assign\"]\n      checks:\n        - argument\n        - case\n        - condition\n        - operation\n        - return\n        - assign\n      # List of numbers to exclude from analysis.\n      # The numbers should be written as string.\n      # Values always ignored: \"1\", \"1.0\", \"0\" and \"0.0\".\n      # Default: []\n      ignored-numbers:\n        - '0666'\n        - '0755'\n        - '42'\n      # List of file patterns to exclude from analysis.\n      # Values always ignored: `.+_test.go`.\n      # Default: []\n      ignored-files:\n        - 'magic1_.+\\.go$'\n      # List of function patterns to exclude from analysis.\n      # Following functions are always ignored: `time.Date`,\n      # `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`,\n      # `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`.\n      # Default: []\n      ignored-functions:\n        - '^math\\.'\n        - '^http\\.StatusText$'\n\n    modernize:\n      # List of analyzers to disable.\n      # By default, all analyzers are enabled.\n      disable:\n        # Replace interface{} with any.\n        - any\n        # Replace []byte(fmt.Sprintf) with fmt.Appendf.\n        - fmtappendf\n        # Remove redundant re-declaration of loop variables.\n        - forvar\n        # Replace explicit loops over maps with calls to maps package.\n        - mapsloop\n        # Replace if/else statements with calls to min or max.\n        - minmax\n        # Simplify code by using go1.26's new(expr).\n        - newexpr\n        # Suggest replacing omitempty with omitzero for struct fields.\n        - omitzero\n        # Remove obsolete //+build comments.\n        - plusbuild\n        # Replace 3-clause for loops with for-range over integers.\n        - rangeint\n        # Replace reflect.TypeOf(x) with TypeFor[T]().\n        - reflecttypefor\n        # Replace loops with slices.Contains or slices.ContainsFunc.\n        - slicescontains\n        # Replace sort.Slice with slices.Sort for basic types.\n        - slicessort\n        # Use iterators instead of Len/At-style APIs.\n        - stditerators\n        # Replace strings.Index etc. with strings.Cut.\n        - stringscut\n        # Replace HasPrefix/TrimPrefix with CutPrefix.\n        - stringscutprefix\n        # Replace ranging over Split/Fields with SplitSeq/FieldsSeq.\n        - stringsseq\n        # Replace += with strings.Builder.\n        - stringsbuilder\n        # Replace context.WithCancel with t.Context in tests.\n        - testingcontext\n        # Replace unsafe pointer arithmetic with function calls.\n        - unsafefuncs\n        # Replace wg.Add(1)/go/wg.Done() with wg.Go.\n        - waitgroup\n\n    musttag:\n      # A set of custom functions to check in addition to the builtin ones.\n      # Default: json, xml, gopkg.in/yaml.v3, BurntSushi/toml, mitchellh/mapstructure, jmoiron/sqlx\n      functions:\n        # The full name of the function, including the package.\n        - name: github.com/hashicorp/hcl/v2/hclsimple.DecodeFile\n          # The struct tag whose presence should be ensured.\n          tag: hcl\n          # The position of the argument to check.\n          arg-pos: 2\n\n    nakedret:\n      # Make an issue if func has more lines of code than this setting, and it has naked returns.\n      # Default: 30\n      max-func-lines: 31\n\n    nestif:\n      # Minimal complexity of if statements to report.\n      # Default: 5\n      min-complexity: 4\n\n    nilnil:\n      # To check functions with only two return values (`return nil, nil`).\n      # If disabled then returns like `return nil, nil, ..., nil` are supported.\n      # Default: true\n      only-two: false\n      # In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\n      # E.g, `return clone, fh.indexer.Update(clone)` will be considered as invalid.\n      # Default: false\n      detect-opposite: true\n      # List of return types to check.\n      # Default: [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n      checked-types:\n        - chan\n        - func\n        - iface\n        - map\n        - ptr\n        - uintptr\n        - unsafeptr\n\n    nlreturn:\n      # Size of the block (including return statement that is still \"OK\"),\n      # so no return split required.\n      # Default: 1\n      block-size: 2\n\n    nolintlint:\n      # Disable to ensure that all nolint directives actually have an effect.\n      # Default: false\n      allow-unused: true\n      # Exclude following linters from requiring an explanation.\n      # Default: []\n      allow-no-explanation: [ ]\n      # Enable to require an explanation of nonzero length after each nolint directive.\n      # Default: false\n      require-explanation: true\n      # Enable to require nolint directives to mention the specific linter being suppressed.\n      # Default: false\n      require-specific: true\n\n    nonamedreturns:\n      # Report named error if it is assigned inside defer.\n      # Default: false\n      report-error-in-defer: true\n\n    paralleltest:\n      # Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\n      # Default: false\n      ignore-missing: true\n      # Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are\n      # still required to have `t.Parallel`, but subtests are allowed to skip it.\n      # Default: false\n      ignore-missing-subtests: true\n\n    perfsprint:\n      # Enable/disable optimization of integer formatting.\n      # Default: true\n      integer-format: false\n      # Optimizes even if it requires an int or uint type cast.\n      # Default: true\n      int-conversion: false\n      # Enable/disable optimization of error formatting.\n      # Default: true\n      error-format: false\n      # Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\n      # Default: false\n      err-error: true\n      # Optimizes `fmt.Errorf`.\n      # Default: true\n      errorf: false\n      # Enable/disable optimization of string formatting.\n      # Default: true\n      string-format: false\n      # Optimizes `fmt.Sprintf` with only one argument.\n      # Default: true\n      sprintf1: false\n      # Optimizes into strings concatenation.\n      # Default: true\n      strconcat: false\n      # Enable/disable optimization of bool formatting.\n      # Default: true\n      bool-format: false\n      # Enable/disable optimization of hex formatting.\n      # Default: true\n      hex-format: false\n      # Enable/disable optimization of concat loop.\n      # Default: true\n      concat-loop: false\n      # Optimization of `concat-loop` even with other operations.\n      # Default: false\n      loop-other-ops: true\n\n    prealloc:\n      # IMPORTANT: we don't recommend using this linter before doing performance profiling.\n      # For most programs usage of prealloc will be a premature optimization.\n\n      # Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\n      # Default: true\n      simple: false\n      # Report pre-allocation suggestions on range loops.\n      # Default: true\n      range-loops: false\n      # Report pre-allocation suggestions on for loops.\n      # Default: false\n      for-loops: true\n\n    predeclared:\n      # List of predeclared identifiers to not report on.\n      # Default: []\n      ignore:\n        - new\n        - int\n      # Include method names and field names in checks.\n      # Default: false\n      qualified-name: true\n\n    promlinter:\n      # Promlinter cannot infer all metrics name in static analysis.\n      # Enable strict mode will also include the errors caused by failing to parse the args.\n      # Default: false\n      strict: true\n      # Please refer to https://github.com/yeya24/promlinter#usage for detailed usage.\n      # Default: []\n      disabled-linters:\n        # Help detects issues related to the help text for a metric.\n        - Help\n        # MetricUnits detects issues with metric unit names.\n        - MetricUnits\n        # Counter detects issues specific to counters, as well as patterns that should only be used with counters.\n        - Counter\n        # HistogramSummaryReserved detects when other types of metrics use names or labels reserved for use by histograms and/or summaries.\n        - HistogramSummaryReserved\n        # MetricTypeInName detects when metric types are included in the metric name.\n        - MetricTypeInName\n        # ReservedChars detects colons in metric names.\n        - ReservedChars\n        # CamelCase detects metric names and label names written in camelCase.\n        - CamelCase\n        # UnitAbbreviations detects abbreviated units in the metric name.\n        - UnitAbbreviations\n\n    protogetter:\n      # Skip files generated by specified generators from the checking.\n      # Checks only the file's initial comment, which must follow the format: \"// Code generated by <generator-name>\".\n      # Files generated by protoc-gen-go, protoc-gen-go-grpc, and protoc-gen-grpc-gateway are always excluded automatically.\n      # Default: []\n      skip-generated-by: [\"protoc-gen-go-my-own-generator\"]\n      # Skip files matching the specified glob pattern from the checking.\n      # Default: []\n      skip-files:\n        - \"*.pb.go\"\n        - \"*/vendor/*\"\n        - \"/full/path/to/file.go\"\n      # Skip any generated files from the checking.\n      # Default: false\n      skip-any-generated: true\n      # Skip first argument of append function.\n      # Default: false\n      replace-first-arg-in-append: true\n\n    reassign:\n      # Patterns for global variable names that are checked for reassignment.\n      # See https://github.com/curioswitch/go-reassign#usage\n      # Default: [\"EOF\", \"Err.*\"]\n      patterns:\n        - \".*\"\n\n    recvcheck:\n      # Disables the built-in method exclusions:\n      # - `MarshalText`\n      # - `MarshalJSON`\n      # - `MarshalYAML`\n      # - `MarshalXML`\n      # - `MarshalBinary`\n      # - `GobEncode`\n      # Default: false\n      disable-builtin: true\n      # User-defined method exclusions.\n      # The format is `struct_name.method_name` (ex: `Foo.MethodName`).\n      # A wildcard `*` can use as a struct name (ex: `*.MethodName`).\n      # Default: []\n      exclusions:\n        - \"*.Value\"\n\n    revive:\n      # Maximum number of open files at the same time.\n      # See https://github.com/mgechev/revive#command-line-flags\n      # Defaults to unlimited.\n      max-open-files: 2048\n\n      # Sets the default severity.\n      # See https://github.com/mgechev/revive#configuration\n      # Default: warning\n      severity: error\n\n      # Enable all available rules.\n      # Default: false\n      enable-all-rules: true\n\n      # By default, the default rules are enabled,\n      # but if you explicitly define or configure a rule, the default rules will be disabled.\n      # This option, when set to `true`, allows you to avoid explicitly redefining default rules when adding a rule.\n      # Default: false\n      enable-default-rules: true\n\n      # Enable validation of comment directives.\n      # See https://github.com/mgechev/revive#comment-directives\n      directives:\n        - name: specify-disable-reason\n          severity: error\n\n      # Sets the default failure confidence.\n      # This means that linting errors with less than 0.8 confidence will be ignored.\n      # Default: 0.8\n      confidence: 0.1\n      # Revive handles the default rules in a way that can be unexpected:\n      # - If there are no explicit rules, the default rules are used.\n      # - If there is at least one explicit rule, the default rules are not used, unless `enable-default-rules` is `true`.\n      # Run `GL_DEBUG=revive golangci-lint run --enable-only=revive` to see default, all available rules, and enabled rules.\n      rules:\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#add-constant\n        - name: add-constant\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - max-lit-count: \"3\"\n              allow-strs: '\"\"'\n              allow-ints: \"0,1,2\"\n              allow-floats: \"0.0,0.,1.0,1.,2.0,2.\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#argument-limit\n        - name: argument-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 4 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#atomic\n        - name: atomic\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#banned-characters\n        - name: banned-characters\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ \"Ω\",\"Σ\",\"σ\", \"7\" ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bare-return\n        - name: bare-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#blank-imports\n        - name: blank-imports\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bool-literal-in-expr\n        - name: bool-literal-in-expr\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#call-to-gc\n        - name: call-to-gc\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cognitive-complexity\n        - name: cognitive-complexity\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 7 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comment-spacings\n        - name: comment-spacings\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - mypragma\n            - otherpragma\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comments-density\n        - name: comments-density\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 15 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-naming\n        - name: confusing-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-results\n        - name: confusing-results\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#constant-logical-expr\n        - name: constant-logical-expr\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-as-argument\n        - name: context-as-argument\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allow-types-before: \"*testing.T,*github.com/user/repo/testing.Harness\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-keys-type\n        - name: context-keys-type\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cyclomatic\n        - name: cyclomatic\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#datarace\n        - name: datarace\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#deep-exit\n        - name: deep-exit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#defer\n        - name: defer\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"call-chain\"\n            - \"loop\"\n            - \"method-call\"\n            - \"recover\"\n            - \"immediate-recover\"\n            - \"return\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#dot-imports\n        - name: dot-imports\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allowed-packages: [\"github.com/onsi/ginkgo/v2\", \"github.com/onsi/gomega\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#duplicated-imports\n        - name: duplicated-imports\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#early-return\n        - name: early-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"preserve-scope\"\n            - \"allow-jump\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-block\n        - name: empty-block\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-lines\n        - name: empty-lines\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-map-style\n        - name: enforce-map-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"make\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-repeated-arg-type-style\n        - name: enforce-repeated-arg-type-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"short\"\n            # Or this parameter:\n            - func-arg-style: \"full\"\n              func-ret-val-style: \"short\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-slice-style\n        - name: enforce-slice-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"make\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-switch-style\n        - name: enforce-switch-style\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ \"allowNoDefault\" ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#epoch-naming\n        - name: epoch-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-naming\n        - name: error-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-return\n        - name: error-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-strings\n        - name: error-strings\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"xerrors.New\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#errorf\n        - name: errorf\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#exported\n        - name: exported\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"check-private-receivers\"\n            - \"disable-stuttering-check\"\n            - \"say-repetitive-instead-of-stutters\"\n            - \"check-public-interface\"\n            - \"disable-checks-on-constants\"\n            - \"disable-checks-on-functions\"\n            - \"disable-checks-on-methods\"\n            - \"disable-checks-on-types\"\n            - \"disable-checks-on-variables\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-header\n        - name: file-header\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - This is the text that must appear at the top of source files.\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-length-limit\n        - name: file-length-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - max: 100\n              skip-comments: true\n              skip-blank-lines: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#filename-format\n        - name: filename-format\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"^[_a-z][_a-z0-9]*\\\\.go$\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#flag-parameter\n        - name: flag-parameter\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#forbidden-call-in-wg-go\n        - name: forbidden-call-in-wg-go\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-length\n        - name: function-length\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 10, 0 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-result-limit\n        - name: function-result-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#get-return\n        - name: get-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-branches\n        - name: identical-branches\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-branches\n        - name: identical-ifelseif-branches\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-conditions\n        - name: identical-ifelseif-conditions\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-branches\n        - name: identical-switch-branches\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-conditions\n        - name: identical-switch-conditions\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#if-return\n        - name: if-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-alias-naming\n        - name: import-alias-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"^[a-z][a-z0-9]{0,}$\"\n            # Or this parameter:\n            - allow-regex: \"^[a-z][a-z0-9]{0,}$\"\n              deny-regex: '^v\\d+$'\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-shadowing\n        - name: import-shadowing\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#imports-blocklist\n        - name: imports-blocklist\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"crypto/md5\"\n            - \"crypto/sha1\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#increment-decrement\n        - name: increment-decrement\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#indent-error-flow\n        - name: indent-error-flow\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"preserve-scope\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#inefficient-map-lookup\n        - name: inefficient-map-lookup\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#line-length-limit\n        - name: line-length-limit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 80 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-control-nesting\n        - name: max-control-nesting\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-public-structs\n        - name: max-public-structs\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments: [ 3 ]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-parameter\n        - name: modifies-parameter\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-value-receiver\n        - name: modifies-value-receiver\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#nested-structs\n        - name: nested-structs\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#optimize-operands-order\n        - name: optimize-operands-order\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-comments\n        - name: package-comments\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-directory-mismatch\n        - name: package-directory-mismatch\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - ignore-directories: [\"testcases\", \"testinfo\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-naming\n        - name: package-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - skip-convention-name-check: true\n              convention-name-check-regex: \"^[a-z][a-zA-Z0-9]*$\"\n              skip-top-level-check: true\n              skip-default-bad-name-check: true\n              check-extra-bad-name: true\n              user-defined-bad-names:\n                - foo\n                - bar\n              skip-collision-with-common-std: true\n              check-collision-with-all-std: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range\n        - name: range\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-address\n        - name: range-val-address\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-in-closure\n        - name: range-val-in-closure\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#receiver-naming\n        - name: receiver-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - max-length: 2\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redefines-builtin-id\n        - name: redefines-builtin-id\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-build-tag\n        - name: redundant-build-tag\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-import-alias\n        - name: redundant-import-alias\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-test-main-exit\n        - name: redundant-test-main-exit\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-format\n        - name: string-format\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - - 'core.WriteError[1].Message'\n              - '/^([^A-Z]|$)/'\n              - must not start with a capital letter\n            - - 'fmt.Errorf[0]'\n              - '/(^|[^\\.!?])$/'\n              - must not end in punctuation\n            - - panic\n              - '/^[^\\n]*$/'\n              - must not contain line breaks\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-of-int\n        - name: string-of-int\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#struct-tag\n        - name: struct-tag\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"!validate\"\n            - \"json,inline\"\n            - \"bson,outline,gnu\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#superfluous-else\n        - name: superfluous-else\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"preserve-scope\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-date\n        - name: time-date\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-equal\n        - name: time-equal\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-naming\n        - name: time-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unchecked-type-assertion\n        - name: unchecked-type-assertion\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - accept-ignored-assertion-result: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unconditional-recursion\n        - name: unconditional-recursion\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-naming\n        - name: unexported-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-return\n        - name: unexported-return\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unhandled-error\n        - name: unhandled-error\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - \"^fmt.Printf\"\n            - \"myFunction\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-format\n        - name: unnecessary-format\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-if\n        - name: unnecessary-if\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-stmt\n        - name: unnecessary-stmt\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unreachable-code\n        - name: unreachable-code\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-slices-sort\n        - name: use-slices-sort\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unsecure-url-scheme\n        - name: unsecure-url-scheme\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-parameter\n        - name: unused-parameter\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allow-regex: \"^_\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-receiver\n        - name: unused-receiver\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - allow-regex: \"^_\"\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-any\n        - name: use-any\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-errors-new\n        - name: use-errors-new\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-fmt-print\n        - name: use-fmt-print\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-slices-sort\n        - name: use-slices-sort\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-waitgroup-go\n        - name: use-waitgroup-go\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-break\n        - name: useless-break\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-fallthrough\n        - name: useless-fallthrough\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-declaration\n        - name: var-declaration\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-naming\n        - name: var-naming\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n          arguments:\n            - [ \"ID\" ] # AllowList\n            - [ \"VM\" ] # DenyList\n            - - skip-initialism-name-checks: true\n                upper-case-const: true\n        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#waitgroup-by-value\n        - name: waitgroup-by-value\n          severity: warning\n          disabled: false\n          exclude: [\"\"]\n\n    rowserrcheck:\n      # database/sql is always checked.\n      # Default: []\n      packages:\n        - github.com/jmoiron/sqlx\n\n    sloglint:\n      # Enforce not mixing key-value pairs and attributes.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-mixed-arguments\n      # Default: true\n      no-mixed-args: false\n      # Enforce using key-value pairs only (overrides no-mixed-args, incompatible with attr-only).\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-value-pairs-only\n      # Default: false\n      kv-only: true\n      # Enforce using attributes only (overrides no-mixed-args, incompatible with kv-only).\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#attributes-only\n      # Default: false\n      attr-only: true\n      # Enforce not using global loggers.\n      # Values:\n      # - \"\": disabled\n      # - \"all\": report all global loggers\n      # - \"default\": report only the default slog logger\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global\n      # Default: \"\"\n      no-global: \"all\"\n      # Enforce using methods that accept a context.\n      # Values:\n      # - \"\": disabled\n      # - \"all\": report all contextless calls\n      # - \"scope\": report only if a context exists in the scope of the outermost function\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only\n      # Default: \"\"\n      context: \"all\"\n      # Enforce using static values for log messages.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#static-messages\n      # Default: false\n      static-msg: true\n      # Enforce message style.\n      # Values: lowercased, capitalized\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#message-style\n      # Default: \"\"\n      msg-style: capitalized\n      # Enforce using constants instead of raw keys.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-raw-keys\n      # Default: false\n      no-raw-keys: true\n      # Enforce key naming convention.\n      # Values: snake, kebab, camel, pascal\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-naming-convention\n      # Default: \"\"\n      key-naming-case: snake\n      # Enforce not using specific keys.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#forbidden-keys\n      # Default: []\n      forbidden-keys:\n        - time\n        - level\n        - msg\n        - source\n        - foo\n      # Enforce putting arguments on separate lines.\n      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#arguments-on-separate-lines\n      # Default: false\n      args-on-sep-lines: true\n\n    spancheck:\n      # Checks to enable.\n      # Options include:\n      # - `end`: check that `span.End()` is called\n      # - `record-error`: check that `span.RecordError(err)` is called when an error is returned\n      # - `set-status`: check that `span.SetStatus(codes.Error, msg)` is called when an error is returned\n      # Default: [\"end\"]\n      checks:\n        - end\n        - record-error\n        - set-status\n      # A list of regexes for function signatures that silence `record-error` and `set-status` reports\n      # if found in the call path to a returned error.\n      # https://github.com/jjti/go-spancheck#ignore-check-signatures\n      # Default: []\n      ignore-check-signatures:\n        - \"telemetry.RecordError\"\n      # A list of regexes for additional function signatures that create spans.\n      # This is useful if you have a utility method to create spans.\n      # Each entry should be of the form `<regex>:<telemetry-type>`, where `telemetry-type` can be `opentelemetry` or `opencensus`.\n      # https://github.com/jjti/go-spancheck#extra-start-span-signatures\n      # Default: []\n      extra-start-span-signatures:\n        - \"github.com/user/repo/telemetry/trace.Start:opentelemetry\"\n\n    staticcheck:\n      # https://staticcheck.dev/docs/configuration/options/#dot_import_whitelist\n      # Default: [\"github.com/mmcloughlin/avo/build\", \"github.com/mmcloughlin/avo/operand\", \"github.com/mmcloughlin/avo/reg\"]\n      dot-import-whitelist:\n        - fmt\n      # https://staticcheck.dev/docs/configuration/options/#initialisms\n      # Default: [\"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\"]\n      initialisms: [ \"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\" ]\n      # https://staticcheck.dev/docs/configuration/options/#http_status_code_whitelist\n      # Default: [\"200\", \"400\", \"404\", \"500\"]\n      http-status-code-whitelist: [ \"200\", \"400\", \"404\", \"500\" ]\n      # SAxxxx checks in https://staticcheck.dev/docs/configuration/options/#checks\n      # Example (to disable some checks): [ \"all\", \"-SA1000\", \"-SA1001\"]\n      # Run `GL_DEBUG=staticcheck golangci-lint run --enable=staticcheck` to see all available checks and enabled by config checks.\n      # Default: [\"all\", \"-ST1000\", \"-ST1003\", \"-ST1016\", \"-ST1020\", \"-ST1021\", \"-ST1022\"]\n      checks:\n        # Invalid regular expression.\n        # https://staticcheck.dev/docs/checks/#SA1000\n        - SA1000\n        # Invalid template.\n        # https://staticcheck.dev/docs/checks/#SA1001\n        - SA1001\n        # Invalid format in 'time.Parse'.\n        # https://staticcheck.dev/docs/checks/#SA1002\n        - SA1002\n        # Unsupported argument to functions in 'encoding/binary'.\n        # https://staticcheck.dev/docs/checks/#SA1003\n        - SA1003\n        # Suspiciously small untyped constant in 'time.Sleep'.\n        # https://staticcheck.dev/docs/checks/#SA1004\n        - SA1004\n        # Invalid first argument to 'exec.Command'.\n        # https://staticcheck.dev/docs/checks/#SA1005\n        - SA1005\n        # 'Printf' with dynamic first argument and no further arguments.\n        # https://staticcheck.dev/docs/checks/#SA1006\n        - SA1006\n        # Invalid URL in 'net/url.Parse'.\n        # https://staticcheck.dev/docs/checks/#SA1007\n        - SA1007\n        # Non-canonical key in 'http.Header' map.\n        # https://staticcheck.dev/docs/checks/#SA1008\n        - SA1008\n        # '(*regexp.Regexp).FindAll' called with 'n == 0', which will always return zero results.\n        # https://staticcheck.dev/docs/checks/#SA1010\n        - SA1010\n        # Various methods in the \"strings\" package expect valid UTF-8, but invalid input is provided.\n        # https://staticcheck.dev/docs/checks/#SA1011\n        - SA1011\n        # A nil 'context.Context' is being passed to a function, consider using 'context.TODO' instead.\n        # https://staticcheck.dev/docs/checks/#SA1012\n        - SA1012\n        # 'io.Seeker.Seek' is being called with the whence constant as the first argument, but it should be the second.\n        # https://staticcheck.dev/docs/checks/#SA1013\n        - SA1013\n        # Non-pointer value passed to 'Unmarshal' or 'Decode'.\n        # https://staticcheck.dev/docs/checks/#SA1014\n        - SA1014\n        # Using 'time.Tick' in a way that will leak. Consider using 'time.NewTicker', and only use 'time.Tick' in tests, commands and endless functions.\n        # https://staticcheck.dev/docs/checks/#SA1015\n        - SA1015\n        # Trapping a signal that cannot be trapped.\n        # https://staticcheck.dev/docs/checks/#SA1016\n        - SA1016\n        # Channels used with 'os/signal.Notify' should be buffered.\n        # https://staticcheck.dev/docs/checks/#SA1017\n        - SA1017\n        # 'strings.Replace' called with 'n == 0', which does nothing.\n        # https://staticcheck.dev/docs/checks/#SA1018\n        - SA1018\n        # Using a deprecated function, variable, constant or field.\n        # https://staticcheck.dev/docs/checks/#SA1019\n        - SA1019\n        # Using an invalid host:port pair with a 'net.Listen'-related function.\n        # https://staticcheck.dev/docs/checks/#SA1020\n        - SA1020\n        # Using 'bytes.Equal' to compare two 'net.IP'.\n        # https://staticcheck.dev/docs/checks/#SA1021\n        - SA1021\n        # Modifying the buffer in an 'io.Writer' implementation.\n        # https://staticcheck.dev/docs/checks/#SA1023\n        - SA1023\n        # A string cutset contains duplicate characters.\n        # https://staticcheck.dev/docs/checks/#SA1024\n        - SA1024\n        # It is not possible to use '(*time.Timer).Reset''s return value correctly.\n        # https://staticcheck.dev/docs/checks/#SA1025\n        - SA1025\n        # Cannot marshal channels or functions.\n        # https://staticcheck.dev/docs/checks/#SA1026\n        - SA1026\n        # Atomic access to 64-bit variable must be 64-bit aligned.\n        # https://staticcheck.dev/docs/checks/#SA1027\n        - SA1027\n        # 'sort.Slice' can only be used on slices.\n        # https://staticcheck.dev/docs/checks/#SA1028\n        - SA1028\n        # Inappropriate key in call to 'context.WithValue'.\n        # https://staticcheck.dev/docs/checks/#SA1029\n        - SA1029\n        # Invalid argument in call to a 'strconv' function.\n        # https://staticcheck.dev/docs/checks/#SA1030\n        - SA1030\n        # Overlapping byte slices passed to an encoder.\n        # https://staticcheck.dev/docs/checks/#SA1031\n        - SA1031\n        # Wrong order of arguments to 'errors.Is'.\n        # https://staticcheck.dev/docs/checks/#SA1032\n        - SA1032\n        # 'sync.WaitGroup.Add' called inside the goroutine, leading to a race condition.\n        # https://staticcheck.dev/docs/checks/#SA2000\n        - SA2000\n        # Empty critical section, did you mean to defer the unlock?.\n        # https://staticcheck.dev/docs/checks/#SA2001\n        - SA2001\n        # Called 'testing.T.FailNow' or 'SkipNow' in a goroutine, which isn't allowed.\n        # https://staticcheck.dev/docs/checks/#SA2002\n        - SA2002\n        # Deferred 'Lock' right after locking, likely meant to defer 'Unlock' instead.\n        # https://staticcheck.dev/docs/checks/#SA2003\n        - SA2003\n        # 'TestMain' doesn't call 'os.Exit', hiding test failures.\n        # https://staticcheck.dev/docs/checks/#SA3000\n        - SA3000\n        # Assigning to 'b.N' in benchmarks distorts the results.\n        # https://staticcheck.dev/docs/checks/#SA3001\n        - SA3001\n        # Binary operator has identical expressions on both sides.\n        # https://staticcheck.dev/docs/checks/#SA4000\n        - SA4000\n        # '&*x' gets simplified to 'x', it does not copy 'x'.\n        # https://staticcheck.dev/docs/checks/#SA4001\n        - SA4001\n        # Comparing unsigned values against negative values is pointless.\n        # https://staticcheck.dev/docs/checks/#SA4003\n        - SA4003\n        # The loop exits unconditionally after one iteration.\n        # https://staticcheck.dev/docs/checks/#SA4004\n        - SA4004\n        # Field assignment that will never be observed. Did you mean to use a pointer receiver?.\n        # https://staticcheck.dev/docs/checks/#SA4005\n        - SA4005\n        # A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?.\n        # https://staticcheck.dev/docs/checks/#SA4006\n        - SA4006\n        # The variable in the loop condition never changes, are you incrementing the wrong variable?.\n        # https://staticcheck.dev/docs/checks/#SA4008\n        - SA4008\n        # A function argument is overwritten before its first use.\n        # https://staticcheck.dev/docs/checks/#SA4009\n        - SA4009\n        # The result of 'append' will never be observed anywhere.\n        # https://staticcheck.dev/docs/checks/#SA4010\n        - SA4010\n        # Break statement with no effect. Did you mean to break out of an outer loop?.\n        # https://staticcheck.dev/docs/checks/#SA4011\n        - SA4011\n        # Comparing a value against NaN even though no value is equal to NaN.\n        # https://staticcheck.dev/docs/checks/#SA4012\n        - SA4012\n        # Negating a boolean twice ('!!b') is the same as writing 'b'. This is either redundant, or a typo.\n        # https://staticcheck.dev/docs/checks/#SA4013\n        - SA4013\n        # An if/else if chain has repeated conditions and no side-effects; if the condition didn't match the first time, it won't match the second time, either.\n        # https://staticcheck.dev/docs/checks/#SA4014\n        - SA4014\n        # Calling functions like 'math.Ceil' on floats converted from integers doesn't do anything useful.\n        # https://staticcheck.dev/docs/checks/#SA4015\n        - SA4015\n        # Certain bitwise operations, such as 'x ^ 0', do not do anything useful.\n        # https://staticcheck.dev/docs/checks/#SA4016\n        - SA4016\n        # Discarding the return values of a function without side effects, making the call pointless.\n        # https://staticcheck.dev/docs/checks/#SA4017\n        - SA4017\n        # Self-assignment of variables.\n        # https://staticcheck.dev/docs/checks/#SA4018\n        - SA4018\n        # Multiple, identical build constraints in the same file.\n        # https://staticcheck.dev/docs/checks/#SA4019\n        - SA4019\n        # Unreachable case clause in a type switch.\n        # https://staticcheck.dev/docs/checks/#SA4020\n        - SA4020\n        # \"x = append(y)\" is equivalent to \"x = y\".\n        # https://staticcheck.dev/docs/checks/#SA4021\n        - SA4021\n        # Comparing the address of a variable against nil.\n        # https://staticcheck.dev/docs/checks/#SA4022\n        - SA4022\n        # Impossible comparison of interface value with untyped nil.\n        # https://staticcheck.dev/docs/checks/#SA4023\n        - SA4023\n        # Checking for impossible return value from a builtin function.\n        # https://staticcheck.dev/docs/checks/#SA4024\n        - SA4024\n        # Integer division of literals that results in zero.\n        # https://staticcheck.dev/docs/checks/#SA4025\n        - SA4025\n        # Go constants cannot express negative zero.\n        # https://staticcheck.dev/docs/checks/#SA4026\n        - SA4026\n        # '(*net/url.URL).Query' returns a copy, modifying it doesn't change the URL.\n        # https://staticcheck.dev/docs/checks/#SA4027\n        - SA4027\n        # 'x % 1' is always zero.\n        # https://staticcheck.dev/docs/checks/#SA4028\n        - SA4028\n        # Ineffective attempt at sorting slice.\n        # https://staticcheck.dev/docs/checks/#SA4029\n        - SA4029\n        # Ineffective attempt at generating random number.\n        # https://staticcheck.dev/docs/checks/#SA4030\n        - SA4030\n        # Checking never-nil value against nil.\n        # https://staticcheck.dev/docs/checks/#SA4031\n        - SA4031\n        # Comparing 'runtime.GOOS' or 'runtime.GOARCH' against impossible value.\n        # https://staticcheck.dev/docs/checks/#SA4032\n        - SA4032\n        # Assignment to nil map.\n        # https://staticcheck.dev/docs/checks/#SA5000\n        - SA5000\n        # Deferring 'Close' before checking for a possible error.\n        # https://staticcheck.dev/docs/checks/#SA5001\n        - SA5001\n        # The empty for loop (\"for {}\") spins and can block the scheduler.\n        # https://staticcheck.dev/docs/checks/#SA5002\n        - SA5002\n        # Defers in infinite loops will never execute.\n        # https://staticcheck.dev/docs/checks/#SA5003\n        - SA5003\n        # \"for { select { ...\" with an empty default branch spins.\n        # https://staticcheck.dev/docs/checks/#SA5004\n        - SA5004\n        # The finalizer references the finalized object, preventing garbage collection.\n        # https://staticcheck.dev/docs/checks/#SA5005\n        - SA5005\n        # Infinite recursive call.\n        # https://staticcheck.dev/docs/checks/#SA5007\n        - SA5007\n        # Invalid struct tag.\n        # https://staticcheck.dev/docs/checks/#SA5008\n        - SA5008\n        # Invalid Printf call.\n        # https://staticcheck.dev/docs/checks/#SA5009\n        - SA5009\n        # Impossible type assertion.\n        # https://staticcheck.dev/docs/checks/#SA5010\n        - SA5010\n        # Possible nil pointer dereference.\n        # https://staticcheck.dev/docs/checks/#SA5011\n        - SA5011\n        # Passing odd-sized slice to function expecting even size.\n        # https://staticcheck.dev/docs/checks/#SA5012\n        - SA5012\n        # Using 'regexp.Match' or related in a loop, should use 'regexp.Compile'.\n        # https://staticcheck.dev/docs/checks/#SA6000\n        - SA6000\n        # Missing an optimization opportunity when indexing maps by byte slices.\n        # https://staticcheck.dev/docs/checks/#SA6001\n        - SA6001\n        # Storing non-pointer values in 'sync.Pool' allocates memory.\n        # https://staticcheck.dev/docs/checks/#SA6002\n        - SA6002\n        # Converting a string to a slice of runes before ranging over it.\n        # https://staticcheck.dev/docs/checks/#SA6003\n        - SA6003\n        # Inefficient string comparison with 'strings.ToLower' or 'strings.ToUpper'.\n        # https://staticcheck.dev/docs/checks/#SA6005\n        - SA6005\n        # Using io.WriteString to write '[]byte'.\n        # https://staticcheck.dev/docs/checks/#SA6006\n        - SA6006\n        # Defers in range loops may not run when you expect them to.\n        # https://staticcheck.dev/docs/checks/#SA9001\n        - SA9001\n        # Using a non-octal 'os.FileMode' that looks like it was meant to be in octal.\n        # https://staticcheck.dev/docs/checks/#SA9002\n        - SA9002\n        # Empty body in an if or else branch.\n        # https://staticcheck.dev/docs/checks/#SA9003\n        - SA9003\n        # Only the first constant has an explicit type.\n        # https://staticcheck.dev/docs/checks/#SA9004\n        - SA9004\n        # Trying to marshal a struct with no public fields nor custom marshaling.\n        # https://staticcheck.dev/docs/checks/#SA9005\n        - SA9005\n        # Dubious bit shifting of a fixed size integer value.\n        # https://staticcheck.dev/docs/checks/#SA9006\n        - SA9006\n        # Deleting a directory that shouldn't be deleted.\n        # https://staticcheck.dev/docs/checks/#SA9007\n        - SA9007\n        # 'else' branch of a type assertion is probably not reading the right value.\n        # https://staticcheck.dev/docs/checks/#SA9008\n        - SA9008\n        # Ineffectual Go compiler directive.\n        # https://staticcheck.dev/docs/checks/#SA9009\n        - SA9009\n        # Incorrect or missing package comment.\n        # https://staticcheck.dev/docs/checks/#ST1000\n        - ST1000\n        # Dot imports are discouraged.\n        # https://staticcheck.dev/docs/checks/#ST1001\n        - ST1001\n        # Poorly chosen identifier.\n        # https://staticcheck.dev/docs/checks/#ST1003\n        - ST1003\n        # Incorrectly formatted error string.\n        # https://staticcheck.dev/docs/checks/#ST1005\n        - ST1005\n        # Poorly chosen receiver name.\n        # https://staticcheck.dev/docs/checks/#ST1006\n        - ST1006\n        # A function's error value should be its last return value.\n        # https://staticcheck.dev/docs/checks/#ST1008\n        - ST1008\n        # Poorly chosen name for variable of type 'time.Duration'.\n        # https://staticcheck.dev/docs/checks/#ST1011\n        - ST1011\n        # Poorly chosen name for error variable.\n        # https://staticcheck.dev/docs/checks/#ST1012\n        - ST1012\n        # Should use constants for HTTP error codes, not magic numbers.\n        # https://staticcheck.dev/docs/checks/#ST1013\n        - ST1013\n        # A switch's default case should be the first or last case.\n        # https://staticcheck.dev/docs/checks/#ST1015\n        - ST1015\n        # Use consistent method receiver names.\n        # https://staticcheck.dev/docs/checks/#ST1016\n        - ST1016\n        # Don't use Yoda conditions.\n        # https://staticcheck.dev/docs/checks/#ST1017\n        - ST1017\n        # Avoid zero-width and control characters in string literals.\n        # https://staticcheck.dev/docs/checks/#ST1018\n        - ST1018\n        # Importing the same package multiple times.\n        # https://staticcheck.dev/docs/checks/#ST1019\n        - ST1019\n        # The documentation of an exported function should start with the function's name.\n        # https://staticcheck.dev/docs/checks/#ST1020\n        - ST1020\n        # The documentation of an exported type should start with type's name.\n        # https://staticcheck.dev/docs/checks/#ST1021\n        - ST1021\n        # The documentation of an exported variable or constant should start with variable's name.\n        # https://staticcheck.dev/docs/checks/#ST1022\n        - ST1022\n        # Redundant type in variable declaration.\n        # https://staticcheck.dev/docs/checks/#ST1023\n        - ST1023\n        # Use plain channel send or receive instead of single-case select.\n        # https://staticcheck.dev/docs/checks/#S1000\n        - S1000\n        # Replace for loop with call to copy.\n        # https://staticcheck.dev/docs/checks/#S1001\n        - S1001\n        # Omit comparison with boolean constant.\n        # https://staticcheck.dev/docs/checks/#S1002\n        - S1002\n        # Replace call to 'strings.Index' with 'strings.Contains'.\n        # https://staticcheck.dev/docs/checks/#S1003\n        - S1003\n        # Replace call to 'bytes.Compare' with 'bytes.Equal'.\n        # https://staticcheck.dev/docs/checks/#S1004\n        - S1004\n        # Drop unnecessary use of the blank identifier.\n        # https://staticcheck.dev/docs/checks/#S1005\n        - S1005\n        # Use \"for { ... }\" for infinite loops.\n        # https://staticcheck.dev/docs/checks/#S1006\n        - S1006\n        # Simplify regular expression by using raw string literal.\n        # https://staticcheck.dev/docs/checks/#S1007\n        - S1007\n        # Simplify returning boolean expression.\n        # https://staticcheck.dev/docs/checks/#S1008\n        - S1008\n        # Omit redundant nil check on slices, maps, and channels.\n        # https://staticcheck.dev/docs/checks/#S1009\n        - S1009\n        # Omit default slice index.\n        # https://staticcheck.dev/docs/checks/#S1010\n        - S1010\n        # Use a single 'append' to concatenate two slices.\n        # https://staticcheck.dev/docs/checks/#S1011\n        - S1011\n        # Replace 'time.Now().Sub(x)' with 'time.Since(x)'.\n        # https://staticcheck.dev/docs/checks/#S1012\n        - S1012\n        # Use a type conversion instead of manually copying struct fields.\n        # https://staticcheck.dev/docs/checks/#S1016\n        - S1016\n        # Replace manual trimming with 'strings.TrimPrefix'.\n        # https://staticcheck.dev/docs/checks/#S1017\n        - S1017\n        # Use \"copy\" for sliding elements.\n        # https://staticcheck.dev/docs/checks/#S1018\n        - S1018\n        # Simplify \"make\" call by omitting redundant arguments.\n        # https://staticcheck.dev/docs/checks/#S1019\n        - S1019\n        # Omit redundant nil check in type assertion.\n        # https://staticcheck.dev/docs/checks/#S1020\n        - S1020\n        # Merge variable declaration and assignment.\n        # https://staticcheck.dev/docs/checks/#S1021\n        - S1021\n        # Omit redundant control flow.\n        # https://staticcheck.dev/docs/checks/#S1023\n        - S1023\n        # Replace 'x.Sub(time.Now())' with 'time.Until(x)'.\n        # https://staticcheck.dev/docs/checks/#S1024\n        - S1024\n        # Don't use 'fmt.Sprintf(\"%s\", x)' unnecessarily.\n        # https://staticcheck.dev/docs/checks/#S1025\n        - S1025\n        # Simplify error construction with 'fmt.Errorf'.\n        # https://staticcheck.dev/docs/checks/#S1028\n        - S1028\n        # Range over the string directly.\n        # https://staticcheck.dev/docs/checks/#S1029\n        - S1029\n        # Use 'bytes.Buffer.String' or 'bytes.Buffer.Bytes'.\n        # https://staticcheck.dev/docs/checks/#S1030\n        - S1030\n        # Omit redundant nil check around loop.\n        # https://staticcheck.dev/docs/checks/#S1031\n        - S1031\n        # Use 'sort.Ints(x)', 'sort.Float64s(x)', and 'sort.Strings(x)'.\n        # https://staticcheck.dev/docs/checks/#S1032\n        - S1032\n        # Unnecessary guard around call to \"delete\".\n        # https://staticcheck.dev/docs/checks/#S1033\n        - S1033\n        # Use result of type assertion to simplify cases.\n        # https://staticcheck.dev/docs/checks/#S1034\n        - S1034\n        # Redundant call to 'net/http.CanonicalHeaderKey' in method call on 'net/http.Header'.\n        # https://staticcheck.dev/docs/checks/#S1035\n        - S1035\n        # Unnecessary guard around map access.\n        # https://staticcheck.dev/docs/checks/#S1036\n        - S1036\n        # Elaborate way of sleeping.\n        # https://staticcheck.dev/docs/checks/#S1037\n        - S1037\n        # Unnecessarily complex way of printing formatted string.\n        # https://staticcheck.dev/docs/checks/#S1038\n        - S1038\n        # Unnecessary use of 'fmt.Sprint'.\n        # https://staticcheck.dev/docs/checks/#S1039\n        - S1039\n        # Type assertion to current type.\n        # https://staticcheck.dev/docs/checks/#S1040\n        - S1040\n        # Apply De Morgan's law.\n        # https://staticcheck.dev/docs/checks/#QF1001\n        - QF1001\n        # Convert untagged switch to tagged switch.\n        # https://staticcheck.dev/docs/checks/#QF1002\n        - QF1002\n        # Convert if/else-if chain to tagged switch.\n        # https://staticcheck.dev/docs/checks/#QF1003\n        - QF1003\n        # Use 'strings.ReplaceAll' instead of 'strings.Replace' with 'n == -1'.\n        # https://staticcheck.dev/docs/checks/#QF1004\n        - QF1004\n        # Expand call to 'math.Pow'.\n        # https://staticcheck.dev/docs/checks/#QF1005\n        - QF1005\n        # Lift 'if'+'break' into loop condition.\n        # https://staticcheck.dev/docs/checks/#QF1006\n        - QF1006\n        # Merge conditional assignment into variable declaration.\n        # https://staticcheck.dev/docs/checks/#QF1007\n        - QF1007\n        # Omit embedded fields from selector expression.\n        # https://staticcheck.dev/docs/checks/#QF1008\n        - QF1008\n        # Use 'time.Time.Equal' instead of '==' operator.\n        # https://staticcheck.dev/docs/checks/#QF1009\n        - QF1009\n        # Convert slice of bytes to string when printing it.\n        # https://staticcheck.dev/docs/checks/#QF1010\n        - QF1010\n        # Omit redundant type from variable declaration.\n        # https://staticcheck.dev/docs/checks/#QF1011\n        - QF1011\n        # Use 'fmt.Fprintf(x, ...)' instead of 'x.Write(fmt.Sprintf(...))'.\n        # https://staticcheck.dev/docs/checks/#QF1012\n        - QF1012\n\n    tagalign:\n      # Align and sort can be used together or separately.\n      #\n      # Whether enable align. If true, the struct tags will be aligned.\n      # E.g.:\n      # type FooBar struct {\n      #     Bar    string `json:\"bar\" validate:\"required\"`\n      #     FooFoo int8   `json:\"foo_foo\" validate:\"required\"`\n      # }\n      # will be formatted to:\n      # type FooBar struct {\n      #     Bar    string `json:\"bar\"     validate:\"required\"`\n      #     FooFoo int8   `json:\"foo_foo\" validate:\"required\"`\n      # }\n      # Default: true.\n      align: false\n      # Whether enable tags sort.\n      # If true, the tags will be sorted by name in ascending order.\n      # E.g.: `xml:\"bar\" json:\"bar\" validate:\"required\"` -> `json:\"bar\" validate:\"required\" xml:\"bar\"`.\n      # Default: true\n      sort: false\n      # Specify the order of tags, the other tags will be sorted by name.\n      # This option will be ignored if `sort` is false.\n      # Default: []\n      order:\n        - json\n        - yaml\n        - yml\n        - toml\n        - mapstructure\n        - binding\n        - validate\n      # Whether enable strict style.\n      # In this style, the tags will be sorted and aligned in the dictionary order,\n      # and the tags with the same name will be aligned together.\n      # Note: This option will be ignored if 'align' or 'sort' is false.\n      # Default: false\n      strict: true\n\n    tagliatelle:\n      # Checks the struct tag name case.\n      case:\n        # Defines the association between tag name and case.\n        # Any struct tag name can be used.\n        # Supported string cases:\n        # - `camel`\n        # - `pascal`\n        # - `kebab`\n        # - `snake`\n        # - `upperSnake`\n        # - `goCamel`\n        # - `goPascal`\n        # - `goKebab`\n        # - `goSnake`\n        # - `upper`\n        # - `lower`\n        # - `header`\n        rules:\n          json: camel\n          yaml: camel\n          xml: camel\n          toml: camel\n          bson: camel\n          avro: snake\n          mapstructure: kebab\n          env: upperSnake\n          envconfig: upperSnake\n          whatever: snake\n        # Defines the association between tag name and case.\n        # Important: the `extended-rules` overrides `rules`.\n        # Default: empty\n        extended-rules:\n          json:\n            # Supported string cases:\n            # - `camel`\n            # - `pascal`\n            # - `kebab`\n            # - `snake`\n            # - `upperSnake`\n            # - `goCamel`\n            # - `goPascal`\n            # - `goKebab`\n            # - `goSnake`\n            # - `header`\n            # - `lower`\n            # - `header`\n            #\n            # Required\n            case: camel\n            # Adds 'AMQP', 'DB', 'GID', 'RTP', 'SIP', 'TS' to initialisms,\n            # and removes 'LHS', 'RHS' from initialisms.\n            # Default: false\n            extra-initialisms: true\n            # Defines initialism additions and overrides.\n            # Default: empty\n            initialism-overrides:\n              DB: true # add a new initialism\n              LHS: false # disable a default initialism.\n              # ...\n        # Uses the struct field name to check the name of the struct tag.\n        # Default: false\n        use-field-name: true\n        # The field names to ignore.\n        # Default: []\n        ignored-fields:\n          - Bar\n          - Foo\n        # Overrides the default/root configuration.\n        # Default: []\n        overrides:\n          -\n            # The package path (uses `/` only as a separator).\n            # Required\n            pkg: foo/bar\n            # Default: empty or the same as the default/root configuration.\n            rules:\n              json: snake\n              xml: pascal\n            # Default: empty or the same as the default/root configuration.\n            extended-rules:\n            # Same options as the base `extended-rules`.\n            # Default: false (WARNING: it doesn't follow the default/root configuration)\n            use-field-name: true\n            # The field names to ignore.\n            # Default: [] or the same as the default/root configuration.\n            ignored-fields:\n              - Bar\n              - Foo\n            # Ignore the package (takes precedence over all other configurations).\n            # Default: false\n            ignore: true\n\n    testifylint:\n      # Enable all checkers (https://github.com/Antonboom/testifylint#checkers).\n      # Default: false\n      enable-all: true\n      # Disable checkers by name\n      # (in addition to default\n      #   suite-thelper\n      # ).\n      disable:\n        - blank-import\n        - bool-compare\n        - compares\n        - contains\n        - empty\n        - encoded-compare\n        - equal-values\n        - error-is-as\n        - error-nil\n        - expected-actual\n        - float-compare\n        - formatter\n        - go-require\n        - len\n        - negative-positive\n        - nil-compare\n        - regexp\n        - require-error\n        - suite-broken-parallel\n        - suite-dont-use-pkg\n        - suite-extra-assert-call\n        - suite-method-signature\n        - suite-subtest-run\n        - suite-thelper\n        - useless-assert\n\n      # Disable all checkers (https://github.com/Antonboom/testifylint#checkers).\n      # Default: false\n      disable-all: true\n      # Enable checkers by name\n      # (in addition to default\n      #   blank-import, bool-compare, compares, contains, empty, encoded-compare, equal-values, error-is-as, error-nil,\n      #   expected-actual, go-require, float-compare, formatter, len, negative-positive, nil-compare, regexp, require-error,\n      #   suite-broken-parallel, suite-dont-use-pkg, suite-extra-assert-call, suite-subtest-run, suite-method-signature,\n      #   useless-assert\n      # ).\n      enable:\n        - blank-import\n        - bool-compare\n        - compares\n        - contains\n        - empty\n        - encoded-compare\n        - equal-values\n        - error-is-as\n        - error-nil\n        - expected-actual\n        - float-compare\n        - formatter\n        - go-require\n        - len\n        - negative-positive\n        - nil-compare\n        - regexp\n        - require-error\n        - suite-broken-parallel\n        - suite-dont-use-pkg\n        - suite-extra-assert-call\n        - suite-method-signature\n        - suite-subtest-run\n        - suite-thelper\n        - useless-assert\n\n      bool-compare:\n        # To ignore user defined types (over builtin bool).\n        # Default: false\n        ignore-custom-types: true\n      expected-actual:\n        # Regexp for expected variable name.\n        # Default: (^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\n        pattern: ^expected\n      formatter:\n        # To enable go vet's printf checks.\n        # Default: true\n        check-format-string: false\n        # To require f-assertions (e.g. `assert.Equalf`) if format string is used, even if there are no variable-length\n        # variables, i.e. it requires `require.NoErrorf` for both these cases:\n        # - require.NoErrorf(t, err, \"unexpected error\")\n        # - require.NoErrorf(t, err, \"unexpected error for sid: %v\", sid)\n        # To understand this behavior, please read the\n        # https://github.com/Antonboom/testifylint?tab=readme-ov-file#historical-reference-of-formatter.\n        # Default: false\n        require-f-funcs: true\n        # To require that the first element of msgAndArgs (msg) has a string type.\n        # For example, in such case assertion like `assert.True(t, b, tt.case)` will be considered as invalid.\n        # Default: true\n        require-string-msg: false\n      go-require:\n        # To ignore HTTP handlers (like http.HandlerFunc).\n        # Default: false\n        ignore-http-handlers: true\n      require-error:\n        # Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\n        # Default: \"\"\n        fn-pattern: ^(Errorf?|NoErrorf?)$\n      suite-extra-assert-call:\n        # To require or remove extra Assert() call?\n        # Default: remove\n        mode: require\n\n    testpackage:\n      # Regexp pattern to skip files.\n      # Default: \"(export|internal)_test\\\\.go\"\n      skip-regexp: (export|internal)_test\\.go\n      # List of packages that don't end with _test that tests are allowed to be in.\n      # Default: \"main\"\n      allow-packages:\n        - example\n        - main\n\n    thelper:\n      test:\n        # Check *testing.T is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.T param has name t.\n        # Default: true\n        name: false\n        # Check t.Helper() begins helper function.\n        # Default: true\n        begin: false\n      benchmark:\n        # Check *testing.B is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.B param has name b.\n        # Default: true\n        name: false\n        # Check b.Helper() begins helper function.\n        # Default: true\n        begin: false\n      tb:\n        # Check *testing.TB is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.TB param has name tb.\n        # Default: true\n        name: false\n        # Check tb.Helper() begins helper function.\n        # Default: true\n        begin: false\n      fuzz:\n        # Check *testing.F is first param (or after context.Context) of helper function.\n        # Default: true\n        first: false\n        # Check *testing.F param has name f.\n        # Default: true\n        name: false\n        # Check f.Helper() begins helper function.\n        # Default: true\n        begin: false\n\n    usestdlibvars:\n      # Suggest the use of http.MethodXX.\n      # Default: true\n      http-method: false\n      # Suggest the use of http.StatusXX.\n      # Default: true\n      http-status-code: false\n      # Suggest the use of time.Month in time.Date.\n      # Default: false\n      time-date-month: true\n      # Suggest the use of time.Weekday.String().\n      # Default: true\n      time-weekday: true\n      # Suggest the use of time.Month.String().\n      # Default: false\n      time-month: true\n      # Suggest the use of time.Layout.\n      # Default: false\n      time-layout: true\n      # Suggest the use of crypto.Hash.String().\n      # Default: false\n      crypto-hash: true\n      # Suggest the use of rpc.DefaultXXPath.\n      # Default: false\n      default-rpc-path: true\n      # Suggest the use of sql.LevelXX.String().\n      # Default: false\n      sql-isolation-level: true\n      # Suggest the use of tls.SignatureScheme.String().\n      # Default: false\n      tls-signature-scheme: true\n      # Suggest the use of constant.Kind.String().\n      # Default: false\n      constant-kind: true\n\n    usetesting:\n      # Enable/disable `os.CreateTemp(\"\", ...)` detections.\n      # Default: true\n      os-create-temp: false\n\n      # Enable/disable `os.MkdirTemp()` detections.\n      # Default: true\n      os-mkdir-temp: false\n\n      # Enable/disable `os.Setenv()` detections.\n      # Default: true\n      os-setenv: false\n\n      # Enable/disable `os.TempDir()` detections.\n      # Default: false\n      os-temp-dir: true\n\n      # Enable/disable `os.Chdir()` detections.\n      # Disabled if Go < 1.24.\n      # Default: true\n      os-chdir: false\n\n      # Enable/disable `context.Background()` detections.\n      # Disabled if Go < 1.24.\n      # Default: false\n      context-background: true\n\n      # Enable/disable `context.TODO()` detections.\n      # Disabled if Go < 1.24.\n      # Default: false\n      context-todo: true\n\n    unconvert:\n      # Remove conversions that force intermediate rounding.\n      # Default: false\n      fast-math: true\n      # Be more conservative (experimental).\n      # Default: false\n      safe: true\n\n    unparam:\n      # Inspect exported functions.\n      # Set to true if no external program/library imports your code.\n      #\n      # IMPORTANT: If you enable this setting, unparam reports many false positives in text editors:\n      # when run on a subdirectory it cannot find external interfaces.\n      # Most editor integrations invoke golangci-lint on the directory containing the changed file.\n      #\n      # Default: false\n      check-exported: true\n\n    unqueryvet:\n      # Enable SQL builder checking.\n      # Default: true\n      check-sql-builders: false\n      # Enable aliased wildcard detection like `SELECT t.*`.\n      # Default: true\n      check-aliased-wildcard: false\n      # Enable string concatenation analysis.\n      # Default: true\n      check-string-concat: false\n      # Enable format string analysis like `fmt.Sprintf`.\n      # Default: true\n      check-format-strings: false\n      # Enable strings.Builder analysis.\n      # Default: true\n      check-string-builder: false\n      # Enable subquery analysis.\n      # Default: true\n      check-subqueries: false\n      # Detects N+1 Query.\n      # Default: false\n      check-n1: true\n      # Detects SQL injection.\n      # Default: false\n      check-sql-injection: true\n      # Detects transaction leaks.\n      # Default: false\n      check-tx-leaks: true\n      # Regex patterns for acceptable `SELECT *` usage.\n      # Default:\n      # - \"SELECT \\\\* FROM information_schema\\\\..*\"\n      # - \"SELECT \\\\* FROM pg_catalog\\\\..*\"\n      # - \"SELECT COUNT\\\\(\\\\*\\\\)\"\n      # - \"SELECT MAX\\\\(\\\\*\\\\)\"\n      # - \"SELECT MIN\\\\(\\\\*\\\\)\"\n      allowed-patterns:\n        - \"SELECT \\\\* FROM temp_.*\"\n        - \"SELECT \\\\* FROM.*-- migration\"\n      # Allow is a list of SQL patterns to allow (whitelist).\n      # Default: []\n      allow:\n        - foo\n      # Functions to ignore (regex patterns)\n      # Default: []\n      ignored-functions:\n        - \"debug\\\\..*\"\n        - \"test.*\"\n      # SQL builder libraries to check.\n      # Default: all true.\n      sql-builders:\n        squirrel: false\n        gorm: false\n        sqlx: false\n        ent: false\n        pgx: false\n        bun: false\n        sqlboiler: false\n        jet: false\n      # List of user-defined DSL rules.\n      # https://github.com/MirrexOne/unqueryvet?tab=readme-ov-file#custom-rules-dsl\n      # Default: []\n      custom-rules:\n        - id: allow-temp-tables\n          pattern: \"SELECT * FROM $TABLE\"\n          when: \"isTempTable(table)\"\n          action: allow\n        - id: dangerous-delete\n          pattern: \"DELETE FROM $TABLE\"\n          when: \"!has_where\"\n          message: \"DELETE without WHERE clause\"\n\n    unused:\n      # Mark all struct fields that have been written to as used.\n      # Default: true\n      field-writes-are-uses: false\n      # Treat IncDec statement (e.g. `i++` or `i--`) as both read and write operation instead of just write.\n      # Default: false\n      post-statements-are-reads: true\n      # Mark all exported fields as used.\n      # default: true\n      exported-fields-are-used: false\n      # Mark all function parameters as used.\n      # default: true\n      parameters-are-used: false\n      # Mark all local variables as used.\n      # default: true\n      local-variables-are-used: false\n      # Mark all identifiers inside generated files as used.\n      # Default: true\n      generated-is-used: false\n\n    varnamelen:\n      # The longest distance, in source lines, that is being considered a \"small scope\".\n      # Variables used in at most this many lines will be ignored.\n      # Default: 5\n      max-distance: 6\n      # The minimum length of a variable's name that is considered \"long\".\n      # Variable names that are at least this long will be ignored.\n      # Default: 3\n      min-name-length: 2\n      # Check method receivers.\n      # Default: false\n      check-receiver: true\n      # Check named return values.\n      # Default: false\n      check-return: true\n      # Check type parameters.\n      # Default: false\n      check-type-param: true\n      # Ignore \"ok\" variables that hold the bool return value of a type assertion.\n      # Default: false\n      ignore-type-assert-ok: true\n      # Ignore \"ok\" variables that hold the bool return value of a map index.\n      # Default: false\n      ignore-map-index-ok: true\n      # Ignore \"ok\" variables that hold the bool return value of a channel receive.\n      # Default: false\n      ignore-chan-recv-ok: true\n      # Optional list of variable names that should be ignored completely.\n      # Default: []\n      ignore-names:\n        - err\n      # Optional list of variable declarations that should be ignored completely.\n      # Entries must be in one of the following forms (see below for examples):\n      # - for variables, parameters, named return values, method receivers, or type parameters:\n      #   <name> <type>  (<type> can also be a pointer/slice/map/chan/...)\n      # - for constants: const <name>\n      #\n      # Default: []\n      ignore-decls:\n        - c echo.Context\n        - t testing.T\n        - f *foo.Bar\n        - e error\n        - i int\n        - const C\n        - T any\n        - m map[string]int\n\n    whitespace:\n      # Enforces newlines (or comments) after every multi-line if statement.\n      # Default: false\n      multi-if: true\n      # Enforces newlines (or comments) after every multi-line function signature.\n      # Default: false\n      multi-func: true\n\n    wrapcheck:\n      # An array of strings specifying additional substrings of signatures to ignore.\n      # Unlike 'ignore-sigs', this option extends the default set (or the set specified in 'ignore-sigs') without replacing it entirely.\n      # This allows you to add specific signatures to the ignore list\n      # while retaining the defaults or any items in 'ignore-sigs'.\n      # Default: []\n      extra-ignore-sigs:\n        - .CustomError(\n        - .SpecificWrap(\n\n      # An array of strings that specify substrings of signatures to ignore.\n      # If this set, it will override the default set of ignored signatures.\n      # See https://github.com/tomarrell/wrapcheck#configuration for more information.\n      # Default: [\".Errorf(\", \"errors.New(\", \"errors.Unwrap(\", \"errors.Join(\", \".Wrap(\", \".Wrapf(\", \".WithMessage(\", \".WithMessagef(\", \".WithStack(\"]\n      ignore-sigs:\n        - .Errorf(\n        - errors.New(\n        - errors.Unwrap(\n        - errors.Join(\n        - .Wrap(\n        - .Wrapf(\n        - .WithMessage(\n        - .WithMessagef(\n        - .WithStack(\n      # An array of strings that specify regular expressions of signatures to ignore.\n      # Default: []\n      ignore-sig-regexps:\n        - \\.New.*Error\\(\n      # An array of strings that specify globs of packages to ignore.\n      # Default: []\n      ignore-package-globs:\n        - encoding/*\n        - github.com/pkg/*\n      # An array of strings that specify regular expressions of interfaces to ignore.\n      # Default: []\n      ignore-interface-regexps:\n        - ^(?i)c(?-i)ach(ing|e)\n      # Determines whether wrapcheck should report errors returned from inside the package.\n      # Default: false\n      report-internal-errors: true\n\n    wsl:\n      # Do strict checking when assigning from append (x = append(x, y)).\n      # If this is set to true - the append call must append either a variable\n      # assigned, called or used on the line above.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#strict-append\n      # Default: true\n      strict-append: false\n\n      # Allows assignments to be cuddled with variables used in calls on\n      # line above and calls to be cuddled with assignments of variables\n      # used in call on line above.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-assign-and-call\n      # Default: true\n      allow-assign-and-call: false\n\n      # Allows assignments to be cuddled with anything.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-assign-and-anything\n      # Default: false\n      allow-assign-and-anything: true\n\n      # Allows cuddling to assignments even if they span over multiple lines.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-multiline-assign\n      # Default: true\n      allow-multiline-assign: false\n\n      # If the number of lines in a case block is equal to or lager than this number,\n      # the case *must* end white a newline.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#force-case-trailing-whitespace\n      # Default: 0\n      force-case-trailing-whitespace: 1\n\n      # Allow blocks to end with comments.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-trailing-comment\n      # Default: false\n      allow-trailing-comment: true\n\n      # Allow multiple comments in the beginning of a block separated with newline.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-separated-leading-comment\n      # Default: false\n      allow-separated-leading-comment: true\n\n      # Allow multiple var/declaration statements to be cuddled.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-cuddle-declarations\n      # Default: false\n      allow-cuddle-declarations: true\n\n      # A list of call idents that everything can be cuddled with.\n      # Defaults: [ \"Lock\", \"RLock\" ]\n      allow-cuddle-with-calls: [ \"Foo\", \"Bar\" ]\n\n      # AllowCuddleWithRHS is a list of right hand side variables that is allowed\n      # to be cuddled with anything.\n      # Defaults: [ \"Unlock\", \"RUnlock\" ]\n      allow-cuddle-with-rhs: [ \"Foo\", \"Bar\" ]\n\n      # Allow cuddling with any block as long as the variable is used somewhere in\n      # the block.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#allow-cuddle-used-in-block\n      # Default: false\n      allow-cuddle-used-in-block: true\n\n      # Causes an error when an If statement that checks an error variable doesn't\n      # cuddle with the assignment of that variable.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#force-err-cuddling\n      # Default: false\n      force-err-cuddling: true\n\n      # When force-err-cuddling is enabled this is a list of names\n      # used for error variables to check for in the conditional.\n      # Default: [ \"err\" ]\n      error-variable-names: [ \"foo\" ]\n\n      # Causes an error if a short declaration (:=) cuddles with anything other than\n      # another short declaration.\n      # This logic overrides force-err-cuddling among others.\n      # https://github.com/bombsimon/wsl/blob/HEAD/doc/configuration.md#force-short-decl-cuddling\n      # Default: false\n      force-short-decl-cuddling: true\n\n    wsl_v5:\n      # Allow cuddling a variable if it's used first in the immediate following block,\n      # even if the statement with the block doesn't use the variable.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: true\n      allow-first-in-block: false\n\n      # Same as above,\n      # but allows cuddling if the variable is used anywhere in the following (or nested) block.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: false\n      allow-whole-block: true\n\n      # If a block contains more than this number of lines,\n      # the branch statement needs to be separated by whitespace.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: 2\n      branch-max-lines: 4\n\n      # If set to a non-negative number,\n      # case blocks need to end with whitespace if exceeding this number\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration\n      # Default: 0\n      case-max-lines: 2\n\n      # Default checks to use.\n      # Can be `all`, `none`, `default` or empty.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration\n      # Default: \"\"\n      default: all\n\n      # Enabled checks.\n      # Will be additive to any presets.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration\n      # Default: []\n      enable:\n        - assign\n        - branch\n        - decl\n        - defer\n        - expr\n        - for\n        - go\n        - if\n        - inc-dec\n        - label\n        - range\n        - return\n        - select\n        - send\n        - switch\n        - type-switch\n        - append\n        - assign-exclusive\n        - assign-expr\n        - err\n        - leading-whitespace\n        - trailing-whitespace\n        - after-block\n\n      # Disable checks.\n      # Will be subtractive to any preset.\n      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration\n      # Default: []\n      disable:\n        - assign\n        - branch\n        - decl\n        - defer\n        - expr\n        - for\n        - go\n        - if\n        - inc-dec\n        - label\n        - range\n        - return\n        - select\n        - send\n        - switch\n        - type-switch\n        - append\n        - assign-exclusive\n        - assign-expr\n        - err\n        - leading-whitespace\n        - trailing-whitespace\n        - after-block\n\n    # The custom section can be used to define linter plugins to be loaded at runtime.\n    # See README documentation for more info.\n    custom:\n      # Each custom linter should have a unique name.\n      example:\n        # The plugin type.\n        # It can be `goplugin` or `module`.\n        # Default: goplugin\n        type: module\n        # The path to the plugin *.so. Can be absolute or local.\n        # Required for each custom linter.\n        path: /path/to/example.so\n        # The description of the linter.\n        # Optional.\n        description: This is an example usage of a plugin linter.\n        # Intended to point to the repo location of the linter.\n        # Optional.\n        original-url: github.com/golangci/example-linter\n        # Plugins settings/configuration.\n        # Only work with plugin based on `linterdb.PluginConstructor`.\n        # Optional.\n        settings:\n          foo: bar\n\n  # Defines a set of rules to ignore issues.\n  # It does not skip the analysis, and so does not ignore \"typecheck\" errors.\n  exclusions:\n    # Mode of the generated files analysis.\n    #\n    # - `strict`: sources are excluded by strictly following the Go generated file convention.\n    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\.$`\n    #    This line must appear before the first non-comment, non-blank text in the file.\n    #    https://go.dev/s/generatedcode\n    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.\n    # - `disable`: disable the generated files exclusion.\n    #\n    # Default: strict\n    generated: lax\n    # Log a warning if an exclusion rule is unused.\n    # Default: false\n    warn-unused: true\n    # Predefined exclusion rules.\n    # Default: []\n    presets:\n      - comments\n      - std-error-handling\n      - common-false-positives\n      - legacy\n\n    # Excluding configuration per-path, per-linter, per-text and per-source.\n    rules:\n      # Exclude some linters from running on tests files.\n      - path: _test\\.go\n        linters:\n          - gocyclo\n          - errcheck\n          - dupl\n          - gosec\n\n      # Run some linter only for test files by excluding its issues for everything else.\n      - path-except: _test\\.go\n        linters:\n          - forbidigo\n\n      # Exclude known linters from partially hard-vendored code,\n      # which is impossible to exclude via `nolint` comments.\n      # `/` will be replaced by the current OS file path separator to properly work on Windows.\n      - path: internal/hmac/\n        text: \"weak cryptographic primitive\"\n        linters:\n          - gosec\n\n      # Exclude some `staticcheck` messages.\n      - linters:\n          - staticcheck\n        text: \"SA9003:\"\n\n      # Exclude `lll` issues for long lines with `go:generate`.\n      - linters:\n          - lll\n        source: \"^//go:generate \"\n\n    # Which file paths to exclude: they will be analyzed, but issues from them won't be reported.\n    # \"/\" will be replaced by the current OS file path separator to properly work on Windows.\n    # Default: []\n    paths:\n      - \".*\\\\.my\\\\.go$\"\n      - lib/bad.go\n    # Which file paths to not exclude.\n    # Default: []\n    paths-except:\n      - \".*\\\\.my\\\\.go$\"\n      - lib/bad.go\n\nformatters:\n  # Enable specific formatter.\n  # Default: [] (uses standard Go formatting)\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n    - golines\n    - swaggo\n\n  # Formatters settings.\n  settings:\n    gci:\n      # Section configuration to compare against.\n      # Section names are case-insensitive and may contain parameters in ().\n      # The default order of sections is `standard > default > custom > blank > dot > alias > localmodule`.\n      # If `custom-order` is `true`, it follows the order of `sections` option.\n      # Default: [\"standard\", \"default\"]\n      sections:\n        - standard                       # Standard section: captures all standard packages.\n        - default                        # Default section: contains all imports that could not be matched to another section type.\n        - prefix(github.com/org/project) # Custom section: groups all imports with the specified Prefix.\n        - blank                          # Blank section: contains all blank imports. This section is not present unless explicitly enabled.\n        - dot                            # Dot section: contains all dot imports. This section is not present unless explicitly enabled.\n        - alias                          # Alias section: contains all alias imports. This section is not present unless explicitly enabled.\n        - localmodule                    # Local module section: contains all local packages. This section is not present unless explicitly enabled.\n\n      # Checks that no inline comments are present.\n      # Default: false\n      no-inline-comments: true\n\n      # Checks that no prefix comments (comment lines above an import) are present.\n      # Default: false\n      no-prefix-comments: true\n\n      # Enable custom order of sections.\n      # If `true`, make the section order the same as the order of `sections`.\n      # Default: false\n      custom-order: true\n\n      # Drops lexical ordering for custom sections.\n      # Default: false\n      no-lex-order: true\n\n    gofmt:\n      # Simplify code: gofmt with `-s` option.\n      # Default: true\n      simplify: false\n      # Apply the rewrite rules to the source before reformatting.\n      # https://pkg.go.dev/cmd/gofmt\n      # Default: []\n      rewrite-rules:\n        - pattern: 'interface{}'\n          replacement: 'any'\n        - pattern: 'a[b:len(a)]'\n          replacement: 'a[b:]'\n\n    gofumpt:\n      # Module path which contains the source code being formatted.\n      # Default: \"\"\n      module-path: github.com/org/project\n\n      # Choose whether to use the extra rules.\n      # Default: false\n      extra-rules: true\n\n    goimports:\n      # A list of prefixes, which, if set, checks import paths\n      # with the given prefixes are grouped after 3rd-party packages.\n      # Default: []\n      local-prefixes:\n        - github.com/org/project\n\n    golines:\n      # Target maximum line length.\n      # Default: 100\n      max-len: 200\n      # Length of a tabulation.\n      # Default: 4\n      tab-len: 8\n      # Shorten single-line comments.\n      # Default: false\n      shorten-comments: true\n      # Default: true\n      reformat-tags: false\n      # Split chained methods on the dots as opposed to the arguments.\n      # Default: true\n      chain-split-dots: false\n\n  exclusions:\n    # Log a warning if an exclusion path is unused.\n    # Default: false\n    warn-unused: true\n    # Mode of the generated files analysis.\n    #\n    # - `strict`: sources are excluded by strictly following the Go generated file convention.\n    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\.$`\n    #    This line must appear before the first non-comment, non-blank text in the file.\n    #    https://go.dev/s/generatedcode\n    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.\n    # - `disable`: disable the generated files exclusion.\n    #\n    # Default: lax\n    generated: strict\n    # Which file paths to exclude.\n    # This option is ignored when using `--stdin` as the path is unknown.\n    # Default: []\n    paths:\n      - \".*\\\\.my\\\\.go$\"\n      - lib/bad.go\n\nissues:\n  # Maximum issues count per one linter.\n  # Set to 0 to disable.\n  # Default: 50\n  max-issues-per-linter: 0\n\n  # Maximum count of issues with the same text.\n  # Set to 0 to disable.\n  # Default: 3\n  max-same-issues: 0\n\n  # Make issues output unique by line.\n  # Default: true\n  uniq-by-line: false\n\n  # Show only new issues: if there are unstaged changes or untracked files,\n  # only those changes are analyzed, else only changes in HEAD~ are analyzed.\n  # It's a super-useful option for integration of golangci-lint into existing large codebase.\n  # It's not practical to fix all existing issues at the moment of integration:\n  # much better don't allow issues in new code.\n  #\n  # Default: false\n  new: true\n\n  # Show only new issues created after the best common ancestor (merge-base against HEAD).\n  # Default: \"\"\n  new-from-merge-base: main\n\n  # Show only new issues created after git revision `REV`.\n  # Default: \"\"\n  new-from-rev: HEAD\n\n  # Show only new issues created in git patch with set file path.\n  # Default: \"\"\n  new-from-patch: path/to/patch/file\n\n  # Show issues in any part of update files (requires new-from-rev or new-from-patch).\n  # Default: false\n  whole-files: true\n\n  # Apply the fixes detected by the linters and formatters (if it's supported by the linter).\n  # Default: false\n  fix: true\n\n\n# Output configuration options.\noutput:\n  # The formats used to render issues.\n  formats:\n    # Prints issues in a text format with colors, line number, and linter name.\n    # This format is the default format.\n    text:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.txt\n      # Print linter name in the end of issue text.\n      # Default: true\n      print-linter-name: false\n      # Print lines of code with issue.\n      # Default: true\n      print-issued-lines: false\n      # Use colors.\n      # Default: true\n      colors: false\n    # Prints issues in a JSON representation.\n    json:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.json\n    # Prints issues in columns representation separated by tabulations.\n    tab:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.txt\n      # Print linter name in the end of issue text.\n      # Default: true\n      print-linter-name: true\n      # Use colors.\n      # Default: true\n      colors: false\n    # Prints issues in an HTML page.\n    # It uses the Cloudflare CDN (cdnjs) and React.\n    html:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.html\n    # Prints issues in the Checkstyle format.\n    checkstyle:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.xml\n    # Prints issues in the Code Climate format.\n    code-climate:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.json\n    # Prints issues in the JUnit XML format.\n    junit-xml:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.xml\n      # Support extra JUnit XML fields.\n      # Default: false\n      extended: true\n    # Prints issues in the TeamCity format.\n    teamcity:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.txt\n    # Prints issues in the SARIF format.\n    sarif:\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\n      # Default: stdout\n      path: ./path/to/output.json\n\n  # Add a prefix to the output file references.\n  # This option is ignored when using `output.path-mode: abs` mode.\n  # Default: \"\"\n  path-prefix: \"\"\n\n  # By default, the report are related to the path obtained by `run.relative-path-mode`.\n  # The mode `abs` allows to show absolute file paths instead of relative file paths.\n  # The option `output.path-prefix` is ignored when using `abs` mode.\n  # Default: \"\"\n  path-mode: \"abs\"\n\n  # Order to use when sorting results.\n  # Possible values: `file`, `linter`, and `severity`.\n  #\n  # If the severity values are inside the following list, they are ordered in this order:\n  #   1. error\n  #   2. warning\n  #   3. high\n  #   4. medium\n  #   5. low\n  # Either they are sorted alphabetically.\n  #\n  # Default: [\"linter\", \"file\"]\n  sort-order:\n    - linter\n    - severity\n    - file # filepath, line, and column.\n\n  # Show statistics per linter.\n  # Default: true\n  show-stats: false\n\n\n# Options for analysis running.\nrun:\n  # Timeout for total work, e.g. 30s, 5m, 5m30s.\n  # If the value is lower or equal to 0, the timeout is disabled.\n  # Default: 0 (disabled)\n  timeout: 5m\n\n  # The mode used to evaluate relative paths.\n  # It's used by exclusions, Go plugins, and some linters.\n  # The value can be:\n  # - `gomod`: the paths will be relative to the directory of the `go.mod` file.\n  # - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`).\n  # - `cfg`: the paths will be relative to the configuration file.\n  # - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run.\n  # Default: cfg\n  relative-path-mode: gomod\n\n  # Exit code when at least one issue was found.\n  # Default: 1\n  issues-exit-code: 2\n\n  # Include test files or not.\n  # Default: true\n  tests: false\n\n  # List of build tags, all linters use it.\n  # Default: []\n  build-tags:\n    - mytag\n\n  # If set, we pass it to \"go list -mod={option}\". From \"go help modules\":\n  # If invoked with -mod=readonly, the go command is disallowed from the implicit\n  # automatic updating of go.mod described above. Instead, it fails when any changes\n  # to go.mod are needed. This setting is most useful to check that go.mod does\n  # not need updates, such as in a continuous integration and testing system.\n  # If invoked with -mod=vendor, the go command assumes that the vendor\n  # directory holds the correct copies of dependencies and ignores\n  # the dependency descriptions in go.mod.\n  #\n  # Allowed values: readonly|vendor|mod\n  # Default: \"\"\n  modules-download-mode: readonly\n\n  # Uses version control information during the loading of packages.\n  # Default: false (implies `-buildvcs=false`)\n  enable-build-vcs: true\n\n  # Allow multiple parallel golangci-lint instances running.\n  # If false, golangci-lint acquires file lock on start.\n  # Default: false\n  allow-parallel-runners: true\n\n  # Allow multiple golangci-lint instances running, but serialize them around a lock.\n  # If false, golangci-lint exits with an error if it fails to acquire file lock on start.\n  # Default: false\n  allow-serial-runners: true\n\n  # Define the Go version limit.\n  # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22.\n  go: '1.23'\n\n  # Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously.\n  # Default: 0 (automatically set to match Linux container CPU quota and\n  # fall back to the number of logical CPUs in the machine)\n  concurrency: 4\n\n\nseverity:\n  # Set the default severity for issues.\n  #\n  # If severity rules are defined and the issues do not match or no severity is provided to the rule\n  # this will be the default severity applied.\n  # Severities should match the supported severity names of the selected out format.\n  # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity\n  # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel\n  # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message\n  # - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance\n  #\n  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)\n  #\n  # Default: \"\"\n  default: error\n\n  # When a list of severity rules are provided, severity information will be added to lint issues.\n  # Severity rules have the same filtering capability as exclude rules\n  # except you are allowed to specify one matcher per severity rule.\n  #\n  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)\n  #\n  # Only affects out formats that support setting severity information.\n  #\n  # Default: []\n  rules:\n    - linters:\n        - dupl\n      severity: info\n"
  },
  {
    "path": ".golangci.yml",
    "content": "# This configuration file is not a recommendation.\n#\n# We intentionally use a limited set of linters.\n# This configuration file is used with different version of golangci-lint to avoid regressions:\n# the linters can change between version,\n# their configuration may be not compatible or their reports can be different,\n# and this can break some of our tests.\n# Also, some linters are not relevant for the project (e.g. linters related to SQL).\n#\n# We have specific constraints, so we use a specific configuration.\n#\n# See the file `.golangci.reference.yml` to have a list of all available configuration options.\n\nversion: \"2\"\n\nlinters:\n  default: none\n  # This list of linters is not a recommendation (same thing for all this configuration file).\n  # We intentionally use a limited set of linters.\n  # See the comment on top of this file.\n  enable:\n    - bodyclose\n    - copyloopvar\n    - depguard\n    - dogsled\n    - dupl\n    - errcheck\n    - errorlint\n    - funlen\n    - gocheckcompilerdirectives\n    - gochecknoinits\n    - goconst\n    - gocritic\n    - gocyclo\n    - godox\n    - mnd\n    - goprintffuncname\n    - gosec\n    - govet\n    - intrange\n    - ineffassign\n    - lll\n    - misspell\n    - nakedret\n    - noctx\n    - nolintlint\n    - revive\n    - staticcheck\n    - testifylint\n    - unconvert\n    - unparam\n    - unused\n    - whitespace\n\n  settings:\n    depguard:\n      rules:\n        logger:\n          deny:\n            # logging is allowed only by logutils.Log,\n            - pkg: \"github.com/sirupsen/logrus\"\n              desc: logging is allowed only by logutils.Log.\n            - pkg: \"github.com/pkg/errors\"\n              desc: Should be replaced by standard lib errors package.\n            - pkg: \"github.com/instana/testify\"\n              desc: It's a fork of github.com/stretchr/testify.\n          files:\n            # logrus is allowed to use only in logutils package.\n            - \"!**/pkg/logutils/**.go\"\n    dupl:\n      threshold: 100\n    funlen:\n      lines: -1 # the number of lines (code + empty lines) is not a right metric and leads to code without empty line or one-liner.\n      statements: 50\n    goconst:\n      min-len: 2\n      min-occurrences: 3\n    gocritic:\n      enabled-tags:\n        - diagnostic\n        - experimental\n        - opinionated\n        - performance\n        - style\n      disabled-checks:\n        - dupImport # https://github.com/go-critic/go-critic/issues/845\n        - ifElseChain\n        - octalLiteral\n        - whyNoLint\n    gocyclo:\n      min-complexity: 15\n    godox:\n      keywords:\n        - FIXME\n    mnd:\n      # don't include the \"operation\" and \"assign\"\n      checks:\n        - argument\n        - case\n        - condition\n        - return\n      ignored-numbers:\n        - '0'\n        - '1'\n        - '2'\n        - '3'\n      ignored-functions:\n        - strings.SplitN\n    govet:\n      settings:\n        printf:\n          funcs:\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Infof\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Warnf\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Errorf\n            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Fatalf\n      enable:\n        - nilness\n        - shadow\n    errorlint:\n      asserts: false\n    lll:\n      line-length: 140\n    misspell:\n      locale: US\n      ignore-rules:\n        - \"importas\" # linter name\n    nolintlint:\n      allow-unused: false # report any unused nolint directives\n      require-explanation: true # require an explanation for nolint directives\n      require-specific: true # require nolint directives to be specific about which linter is being skipped\n    revive:\n      rules:\n        - name: indent-error-flow\n        - name: unexported-return\n          disabled: true\n        - name: unused-parameter\n        - name: unused-receiver\n\n  exclusions:\n    presets:\n      - comments\n      - std-error-handling\n      - common-false-positives\n      - legacy\n    paths:\n      - test/testdata_etc # test files\n      - internal/go # extracted from Go code\n      - internal/x # extracted from x/tools code\n      - pkg/goformatters/gci/internal # extracted from gci code\n      - pkg/goanalysis/runner_checker.go # extracted from x/tools code\n    rules:\n      - path: (.+)_test\\.go\n        linters:\n          - dupl\n          - mnd\n          - lll\n\n      # Based on existing code, the modifications should be limited to make maintenance easier.\n      - path: pkg/golinters/unused/unused.go\n        linters: [gocritic]\n        text: \"rangeValCopy: each iteration copies 160 bytes \\\\(consider pointers or indexing\\\\)\"\n\n      # Related to the result of computation but divided multiple times by 1024.\n      - path: test/bench/bench_test.go\n        linters: [gosec]\n        text: \"G115: integer overflow conversion uint64 -> int\"\n\n      # The files created during the tests don't need to be secured.\n      - path: scripts/website/expand_templates/linters_test.go\n        linters: [gosec]\n        text: \"G306: Expect WriteFile permissions to be 0600 or less\"\n\n      # For compatibility with previous versions.\n      # Also, those reports are not relevant.\n      - linters: [gosec]\n        text: \"(G704: SSRF via taint analysis|G703: Path traversal via taint analysis|G702: Command injection via taint analysis|G115: integer overflow conversion uintptr)\"\n\n      # Related to migration command.\n      - path: pkg/commands/internal/migrate/two/\n        linters:\n          - lll\n\n      # Related to migration command.\n      - path: pkg/commands/internal/migrate/\n        linters:\n          - gocritic\n        text: \"hugeParam:\"\n\n      # The codes are close but this is not duplication.\n      - path: pkg/commands/(formatters|linters).go\n        linters:\n          - dupl\n\n      # Deprecated linters\n      - path: pkg/lint/lintersdb/builder_linter.go\n        text: \"SA1019: wsl.NewV4 is deprecated: use NewV5 instead.\"\n        linters:\n          - staticcheck\n      - path: pkg/golinters/wsl/wsl.go\n        text: \"SA1019: config.WSLv4Settings is deprecated: use WSLv5Settings instead.\"\n        linters:\n          - staticcheck\n\nformatters:\n  enable:\n    - gofmt\n    - goimports\n  settings:\n    gofmt:\n      rewrite-rules:\n        - pattern: 'interface{}'\n          replacement: 'any'\n    goimports:\n      local-prefixes:\n        - github.com/golangci/golangci-lint/v2\n  exclusions:\n    paths:\n      - test/testdata_etc # test files\n      - internal/go # extracted from Go code\n      - internal/x # extracted from x/tools code\n      - pkg/goformatters/gci/internal # extracted from gci code\n      - pkg/goanalysis/runner_checker.go # extracted from x/tools code\n"
  },
  {
    "path": ".goreleaser.yml",
    "content": "version: 2\n\nproject_name: golangci-lint\n\nbuilds:\n  - binary: golangci-lint\n    main: ./cmd/golangci-lint/\n    flags:\n      - -trimpath\n    ldflags: -s -w -X main.version={{.Version}} -X main.commit={{.ShortCommit}} -X main.date={{.Date}}\n    env:\n      - CGO_ENABLED=0\n    goos:\n      - darwin\n      - windows\n      - linux\n      - freebsd\n      - netbsd\n      - illumos\n    goarch:\n      - amd64\n      - arm64\n      - arm\n      - 386\n      - ppc64le\n      - s390x\n      - mips64\n      - mips64le\n      - riscv64\n      - loong64\n    goarm:\n      - 6\n      - 7\n    gomips:\n      - hardfloat\n    ignore:\n      - goos: darwin\n        goarch: 386\n      # Deprecated in go1.25, Removed in go1.26\n      # https://go.dev/doc/go1.25#windows\n      - goos: windows\n        goarch: arm\n\narchives:\n  - formats: [ 'tar.gz' ]\n    wrap_in_directory: true\n    format_overrides:\n      - goos: windows\n        formats: [ 'zip' ]\n    name_template: '{{ .ProjectName }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'\n    files:\n      - LICENSE\n      - README.md\n\nsnapshot:\n  version_template: SNAPSHOT-{{ .Commit }}\n\nchecksum:\n  disable: false\n  name_template: '{{ .ProjectName }}-{{ .Version }}-checksums.txt'\n\nchangelog:\n  sort: asc\n  filters:\n    exclude:\n      - '(?i)^docs?:'\n      - '(?i)^docs\\([^:]+\\):'\n      - '(?i)^docs\\[[^:]+\\]:'\n      - '^tests?:'\n      - '(?i)^dev:'\n      - '(?i)^chore:'\n      - '^build\\(deps\\): bump .* in /docs \\(#\\d+\\)'\n      - '^build\\(deps\\): bump .* in /\\.github/peril \\(#\\d+\\)'\n      - '^build\\(deps\\): bump .* in /scripts/gen_github_action_config \\(#\\d+\\)'\n      - Merge pull request\n      - Merge branch\n\nrelease:\n  skip_upload: false\n  github:\n    owner: golangci\n    name: golangci-lint\n  header: |\n    `golangci-lint` is a free and open-source project built by volunteers.\n\n    If you value it, consider supporting us, the [maintainers](https://donate.golangci.org) and [linter authors](https://golangci-lint.run/docs/product/thanks/).\n\n    We appreciate it! :heart:\n\n    For key updates, see the [changelog](https://golangci-lint.run/docs/product/changelog/#{{ .Major }}{{ .Minor }}{{ .Patch }}).\n\nsource:\n  enabled: true\n  name_template: '{{ .ProjectName }}-{{ .Version }}-source'\n\nbrews:\n  - description: Fast linters runner for Go.\n    homepage: https://golangci.com\n    skip_upload: false\n    repository:\n      owner: golangci\n      name: homebrew-tap\n    commit_author:\n      name: golangci-releaser\n      email: 65486276+golangci-releaser@users.noreply.github.com\n    directory: Formula\n    install: |\n      bin.install \"golangci-lint\"\n      output = Utils.popen_read(\"#{bin}/golangci-lint completion bash\")\n      (bash_completion/\"golangci-lint\").write output\n      output = Utils.popen_read(\"#{bin}/golangci-lint completion zsh\")\n      (zsh_completion/\"_golangci-lint\").write output\n      output = Utils.popen_read(\"#{bin}/golangci-lint completion fish\")\n      (fish_completion/\"golangci-lint.fish\").write output\n      prefix.install_metafiles\n    test: |\n      system \"#{bin}/golangci-lint --version\"\n\n## chocolatey is disabled because mono has been removed from GitHub Actions runners due to security and maintenance concerns.\n## The release is done manually and locally, with goreleaser after the release of the other elements.\n## Note(ldez): add documentation about how to do it.\n#chocolateys:\n#  - summary: Fast linters Runner for Go\n#    description: |\n#      {{ .ProjectName }} installer package.\n#      Fast linters Runner for Go.\n#    project_url: https://golangci-lint.run\n#    skip_publish: false\n#    name: golangci-lint\n#    title: Golangci-lint\n#    owners: golangci\n#    authors: golangci\n#    copyright: 2024 GolangCI\n#    url_template: \"https://github.com/golangci/golangci-lint/releases/download/{{ .Tag }}/{{ .ArtifactName }}\"\n#    icon_url: \"https://cdn.rawgit.com/golangci/golangci-lint/HEAD/assets/go.png\"\n#    license_url: https://github.com/golangci/golangci-lint/blob/HEAD/LICENSE\n#    require_license_acceptance: false\n#    project_source_url: https://github.com/golangci/golangci-lint\n#    package_source_url: https://github.com/golangci/golangci-lint\n#    docs_url: https://golangci-lint.run\n#    bug_tracker_url: https://github.com/golangci/golangci-lint/issues\n#    tags: \"go golang lint linter\"\n#    release_notes: \"https://github.com/golangci/golangci-lint/releases/tag/v{{ .Version }}\"\n#    api_key: \"{{ .Env.CHOCOLATEY_API_KEY }}\"\n#    source_repo: \"https://push.chocolatey.org/\"\n#    goamd64: v1\n\naurs:\n  - description: Fast linters runner for Go.\n    skip_upload: false\n    homepage: https://golangci.com\n    provides:\n      - \"golangci-lint-bin\"\n    maintainers:\n      - \"Fernandez Ludovic <lfernandez dot dev at gmail dot com>\"\n    license: GPL-3.0\n    private_key: \"{{ .Env.AUR_KEY }}\"\n    git_url: \"ssh://aur@aur.archlinux.org/golangci-lint-bin.git\"\n    commit_author:\n      name: golangci-releaser\n      email: 65486276+golangci-releaser@users.noreply.github.com\n    package: |-\n      local x86_64=amd64 i686=386 aarch64=arm64 armv6h=armv6 armv7h=armv7\n      cd \"golangci-lint-${pkgver}-linux-${!CARCH}\"\n      \n      # bin\n      install -Dm755 \"./golangci-lint\" \"${pkgdir}/usr/bin/golangci-lint\"\n\n      # license\n      install -Dm644 \"./LICENSE\" \"${pkgdir}/usr/share/licenses/golangci-lint/LICENSE\"\n\n      # completions\n      mkdir -p \"${pkgdir}/usr/share/bash-completion/completions/\"\n      mkdir -p \"${pkgdir}/usr/share/zsh/site-functions/\"\n      mkdir -p \"${pkgdir}/usr/share/fish/vendor_completions.d/\"\n      ./golangci-lint completion bash | install -Dm644 /dev/stdin \"${pkgdir}/usr/share/bash-completion/completions/golangci-lint\"\n      ./golangci-lint completion zsh | install -Dm644 /dev/stdin \"${pkgdir}/usr/share/zsh/site-functions/_golangci-lint\"\n      ./golangci-lint completion fish | install -Dm644 /dev/stdin \"${pkgdir}/usr/share/fish/vendor_completions.d/golangci-lint.fish\"\n\nsnapcrafts:\n  - summary: Fast linters runner for Go.\n    description: |\n      It runs linters in parallel, uses caching, supports YAML configuration, integrates with all major IDEs, and includes over a hundred linters.\n    disable: false\n    publish: true\n    name_template: \"{{ .ProjectName }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}\"\n    grade: stable\n    confinement: classic\n    license: GPL-3.0\n    base: core22\n\nnfpms:\n  - description: Fast linters Runner for Go\n    homepage: https://golangci-lint.run/\n    id: golangci-lint-nfpms\n    package_name: golangci-lint\n    file_name_template: \"{{ .ProjectName }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}\"\n    maintainer: \"Golangci-lint Maintainers <65486276+golangci-releaser@users.noreply.github.com>\"\n    license: GPLv3\n    vendor: golangci\n    section: golang\n    formats:\n      - deb\n      - rpm\n    umask: 0o022\n    overrides:\n      deb:\n        contents:\n          - src: LICENSE\n            dst: /usr/share/doc/golangci-lint/copyright\n          - src: README.md\n            dst: /usr/share/doc/golangci-lint/README.md\n        recommends:\n          - golang-go\n      rpm:\n        contents:\n          - src: LICENSE\n            dst: /usr/share/doc/golangci-lint/LICENSE\n            type: license\n          - src: README.md\n            dst: /usr/share/doc/golangci-lint/README.md\n            type: readme\n        recommends:\n          - /usr/bin/go\n    rpm:\n      group: Development/Tools\n\ndockers_v2:\n  - id: golangci-lint\n    images:\n      - 'golangci/golangci-lint'\n    dockerfile: build/buildx.Dockerfile\n    platforms:\n      - linux/amd64\n      - linux/arm64\n    tags:\n      - 'latest'\n      - '{{ .Tag }}'\n      - 'v{{ .Major }}.{{ .Minor }}'\n    labels:\n      # https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys\n      'org.opencontainers.image.title': '{{.ProjectName}}'\n      'org.opencontainers.image.description': 'Fast linters Runner for Go'\n      'org.opencontainers.image.source': '{{.GitURL}}'\n      'org.opencontainers.image.url': '{{.GitURL}}'\n      'org.opencontainers.image.documentation': 'https://golangci-lint.run'\n      'org.opencontainers.image.created': '{{.Date}}'\n      'org.opencontainers.image.revision': '{{.FullCommit}}'\n      'org.opencontainers.image.version': '{{.Version}}'\n  - id: golangci-lint-alpine\n    images:\n      - 'golangci/golangci-lint'\n    dockerfile: build/buildx-alpine.Dockerfile\n    platforms:\n      - linux/amd64\n      - linux/arm64\n    tags:\n      - 'latest-alpine'\n      - '{{ .Tag }}-alpine'\n      - 'v{{ .Major }}.{{ .Minor }}-alpine'\n    labels:\n      # https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys\n      'org.opencontainers.image.title': '{{.ProjectName}}'\n      'org.opencontainers.image.description': 'Fast linters Runner for Go'\n      'org.opencontainers.image.source': '{{.GitURL}}'\n      'org.opencontainers.image.url': '{{.GitURL}}'\n      'org.opencontainers.image.documentation': 'https://golangci-lint.run'\n      'org.opencontainers.image.created': '{{.Date}}'\n      'org.opencontainers.image.revision': '{{.FullCommit}}'\n      'org.opencontainers.image.version': '{{.Version}}'\n"
  },
  {
    "path": ".pre-commit-hooks.yaml",
    "content": "- id: golangci-lint\n  name: golangci-lint\n  description: Fast linters runner for Go. Note that only modified files are linted, so linters like 'unused' that need to scan all files won't work as expected.\n  entry: golangci-lint run --new-from-rev HEAD --fix\n  types: [go]\n  language: golang\n  require_serial: true\n  pass_filenames: false\n- id: golangci-lint-full\n  name: golangci-lint-full\n  description: Fast linters runner for Go. Runs on all files in the module. Use this hook if you use pre-commit in CI.\n  entry: golangci-lint run --fix\n  types: [go]\n  language: golang\n  require_serial: true\n  pass_filenames: false\n- id: golangci-lint-fmt\n  name: golangci-lint-fmt\n  description: Fast linters runner for Go. Formats all files in the repo.\n  entry: golangci-lint fmt\n  types: [go]\n  language: golang\n  require_serial: true\n  pass_filenames: false\n- id: golangci-lint-config-verify\n  name: golangci-lint-config-verify\n  description: Verifies the configuration file\n  entry: golangci-lint config verify\n  files: '\\.golangci\\.(?:yml|yaml|toml|json)'\n  language: golang\n  pass_filenames: false\n"
  },
  {
    "path": "CHANGELOG-v1.md",
    "content": "Follow the news and releases on [Mastodon](https://fosstodon.org/@golangcilint) and on [Bluesky](https://bsky.app/profile/golangci-lint.run).\n\n`golangci-lint` is a free and open-source project built by volunteers.\n\nIf you value it, consider supporting us, we appreciate it!\n\n[![Donate](https://img.shields.io/badge/Donate-❤️-blue?style=for-the-badge)](https://donate.golangci.org)\n\n<!-- START --->\n\n### v1.64.8\n\n_Released on 2025-03-17_\n\n* Detects use of configuration files from golangci-lint v2\n\n### v1.64.7\n\n_Released on 2025-03-11_\n\n1. Linters bug fixes\n   * `depguard`: from 2.2.0 to 2.2.1\n   * `dupl`: from 3e9179ac440a to f665c8d69b32\n   * `gosec`: from 2.22.1 to 2.22.2\n   * `staticcheck`: from 0.6.0 to 0.6.1\n2. Documentation\n   * Add GitLab documentation\n\n### v1.64.6\n\n_Released on 2025-03-02_\n\n1. Linters bug fixes\n   * `asciicheck`: from 0.4.0 to 0.4.1\n   * `contextcheck`: from 1.1.5 to 1.1.6\n   * `errcheck`: from 1.8.0 to 1.9.0\n   * `exptostd`: from 0.4.1 to 0.4.2\n   * `ginkgolinter`: from 0.19.0 to 0.19.1\n   * `go-exhaustruct`: from 3.3.0 to 3.3.1\n   * `gocheckcompilerdirectives`: from 1.2.1 to 1.3.0\n   * `godot`: from 1.4.20 to 1.5.0\n   * `perfsprint`: from 0.8.1 to 0.8.2\n   * `revive`: from 1.6.1 to 1.7.0\n   * `tagalign`: from 1.4.1 to 1.4.2\n\n### v1.64.5\n\n_Released on 2025-02-13_\n\n1. Bug fixes\n   * Add missing flag `new-from-merge-base-flag`\n2. Linters bug fixes\n   * `asciicheck`: from 0.3.0 to 0.4.0\n   * `forcetypeassert`: from 0.1.0 to 0.2.0\n   * `gosec`: from 2.22.0 to 2.22.1\n\n### v1.64.4\n\n_Released on 2025-02-12_\n\n1. Linters bug fixes\n   * `gci`: fix standard packages list for go1.24\n\n### v1.64.3\n\n_Released on 2025-02-12_\n\n1. Linters bug fixes\n   * `ginkgolinter`: from 0.18.4 to 0.19.0\n   * `go-critic`: from 0.11.5 to 0.12.0\n   * `revive`: from 1.6.0 to 1.6.1\n   * `gci`: fix standard packages list for go1.24\n2. Misc.\n   * Build Docker images with go1.24\n\n### v1.64.2\n\n_Released on 2025-02-11_\n\nThis is the last minor release of golangci-lint v1.\nThe next release will be golangci-lint [v2](https://github.com/golangci/golangci-lint/issues/5300).\n\n1. Enhancements\n   * 🎉 go1.24 support\n   * New `issues.new-from-merge-base` option\n   * New `run.relative-path-mode` option\n2. Linters new features\n   * `copyloopvar`: from 1.1.0 to 1.2.1 (support suggested fixes)\n   * `exptostd`: from 0.3.1 to 0.4.1 (handles `golang.org/x/exp/constraints.Ordered`)\n   * `fatcontext`: from 0.5.3 to 0.7.1 (new option: `check-struct-pointers`)\n   * `perfsprint`: from 0.7.1 to 0.8.1 (new options: `integer-format`, `error-format`, `string-format`, `bool-format`, and `hex-format`)\n   * `revive`: from 1.5.1 to 1.6.0 (new rules: `redundant-build-tag`, `use-errors-new`. New option `early-return.early-return`)\n3. Linters bug fixes\n   * `go-errorlint`: from 1.7.0 to 1.7.1\n   * `gochecknoglobals`: from 0.2.1 to 0.2.2\n   * `godox`: from 006bad1f9d26 to 1.1.0\n   * `gosec`: from 2.21.4 to 2.22.0\n   * `iface`: from 1.3.0 to 1.3.1\n   * `nilnesserr`: from 0.1.1 to 0.1.2\n   * `protogetter`: from 0.3.8 to 0.3.9\n   * `sloglint`: from 0.7.2 to 0.9.0\n   * `spancheck`: fix default `StartSpanMatchersSlice` values\n   * `staticcheck`: from 0.5.1 to 0.6.0\n4. Deprecations\n   * ⚠️ `tenv` is deprecated and replaced by `usetesting.os-setenv: true`.\n   * ⚠️ `exportloopref` deprecation step 2\n5. Misc.\n   * Sanitize severities by output format\n   * Avoid panic with plugin without description\n6. Documentation\n   * Clarify `depguard` configuration\n\n### v1.64.1\n\n_Released on 2025-02-11_\n\nCancelled due to CI failure.\n\n### v1.64.0\n\n_Released on 2025-02-11_\n\nCancelled due to CI failure.\n\n### v1.63.4\n\n_Released on 2025-01-03_\n\n1. Linters bug fixes\n   * `dupl`, `gomodguard`, `revive`: keep only Go-files.\n\n### v1.63.3\n\n_Released on 2025-01-02_\n\n1. Linters bug fixes\n   * `gofmt`, `gofumpt`, `goimports`, `gci`: panic with several trailing EOL\n   * `goheader`: skip issues with invalid positions\n\n### v1.63.2\n\n_Released on 2025-01-02_\n\n1. Linters bug fixes\n   * `gofmt`, `gofumpt`, `goimports`, `gci`: panic with missing trailing EOL\n\n### v1.63.1\n\n_Released on 2025-01-01_\n\n1. Linters bug fixes\n   * `cgi`: invalid reports with cgo\n   * `gofumpt`: panic with autofix and cgo\n\n### v1.63.0\n\n_Released on 2025-01-01_\n\n1. Enhancements\n   * Add support for SuggestedFixes 🎉 (35 linters can \"autofix\" reports).\n   * Formatters (`gofmt`, `goimports`, `gofumpt`, `gci`) are applied after the suggested fixes.\n2. New linters\n   * Add `exptostd` linter https://github.com/ldez/exptostd\n   * Add `nilnesserr` linter https://github.com/alingse/nilnesserr\n   * Add `usetesting` linter https://github.com/ldez/usetesting\n3. Linters new features\n   * `gci`: new options: `no-inline-comments`, `no-prefix-comments`\n   * `gomoddirectives`: from 0.2.4 to 0.6.0 (new options: `go-version-pattern`, `toolchain-pattern`,`toolchain-forbidden`, `tool-forbidden`, `go-debug-forbidden`)\n   * `govet`: new `stdversion`, `waitgroup` analyzers\n   * `importas`: allow multiple empty aliases\n   * `loggercheck`: new `slog` option\n   * `recvcheck`: from 0.1.2 to 0.2.0 (new options: `disable-builtin`, `exclusions`)\n   * `tagliatelle`: from 0.5.0 to 0.7.1 (new options: `ignored-fields`, `extended-rules`,`overrides`, `pkg`, `ignore`)\n   * `usestdlibvars`: from 1.27.0 to 1.28.0 (autofix)\n   * `wrapcheck`: from 2.9.0 to 2.10.0 (new option: `extra-ignore-sigs`)\n4. Linters bug fixes\n   * `asciicheck`: from 0.2.0 to 0.3.0\n   * `bodyclose`: from 574207250966 to ed6a65f985e\n   * `funlen`: from 0.1.0 to 0.2.0\n   * `ginkgolinter`: from 0.18.3 to 0.18.4\n   * `gochecksumtype`: from 0.2.0 to 0.3.1\n   * `gocognit`: from 1.1.3 to 1.2.0\n   * `godot`: from 1.4.18 to 1.4.20\n   * `goheader`: report position improvement\n   * `gosec`: handling of global nosec option when it is false\n   * `iface`: from 1.2.1 to 1.3.0\n   * `importas`: from 0.1.0 to 0.2.0\n   * `intrange`: from 0.2.1 to 0.3.0\n   * `makezero`: from 1.1.1 to 1.2.0\n   * `mirror`: from 1.2.0 to 1.3.0\n   * `nilnil`: from 1.0.0 to 1.0.1\n   * `nosprintfhostport`: from 0.1.1 to 0.2.0\n   * `reassign`: from 0.2.0 to 0.3.0\n   * `spancheck`: from 0.6.2 to 0.6.4\n   * `tagalign`: from 1.3.4 to 1.4.1\n   * `wastedassign`: from 2.0.7 to 2.1.0\n   * `whitespace`: from 0.1.1 to 0.2.0\n   * `wsl`: from 4.4.1 to 4.5.0\n5. Deprecations\n   * ⚠️ `output.uniq-by-line` is deprecated and replaced by `issues.uniq-by-line`.\n6. Misc.\n   * Improvements of the help command (color and JSON support).\n   * Removes `decoder`, `sloglint`, `tagalign` from `format` preset.\n   * Enables paths with junction inside Windows.\n   * The timeout is disabled if `run.timeout` <= 0.\n\n### v1.62.2\n\n_Released on 2024-11-25_\n\n1. Linters bug fixes\n   * `fatcontext`: from 0.5.2 to 0.5.3\n   * `ginkgolinter`: from 0.18.0 to 0.18.3\n   * `errorlint`: from 1.6.0 to 1.7.0\n   * `iface`: from 1.2.0 to 1.2.1\n   * `revive`: from 1.5.0 to 1.5.1\n   * `testifylint`: from 1.5.0 to 1.5.2\n2. Misc.\n   * fix: ignore cache error when file not found\n\n### v1.62.1\n\n_Released on 2024-11-25_\n\nCancelled due to CI failure.\n\n### v1.62.0\n\n_Released on 2024-11-10_\n\n1. New linters\n   * Add `recvcheck` linter https://github.com/raeperd/recvcheck\n   * Add `iface` linter https://github.com/uudashr/iface\n2. Linters new features\n   * `ginkgolinter`: from 0.17.0 to 0.18.0 (new option: `force-succeed`)\n   * `gochecksumtype`: from 0.1.4 to 0.2.0 (new option: `default-signifies-exhaustive`)\n   * `loggercheck`: from 0.9.4 to 0.10.1 (`log/slog` support)\n   * `nilnil`: from 0.1.9 to 1.0.0 (new option: `detect-opposite`)\n   * `revive`: from 1.3.9 to 1.5.0 (new rules: `filename-format`, and `file-length-limit`)\n   * `tenv`: from 1.10.0 to 1.12.1 (handle dot import)\n   * `testifylint`: from 1.4.3 to 1.5.0 (new checkers: `contains`, `encoded-compare`, `regexp`)\n3. Linters bug fixes\n   * `bidichk`: from 0.2.7 to 0.3.2 (important performance improvement)\n   * `canonicalheader`: from 1.1.1 to 1.1.2\n   * `cyclop`: from 1.2.1 to 1.2.3\n   * `dupword`: from 0.1.1 to 0.1.3\n   * `errcheck`: from 1.7.0 to 1.8.0\n   * `errchkjson`: from 0.3.6 to 0.4.0\n   * `errname`: from 0.1.13 to 1.0.0\n   * `gocritic`: from 0.11.4 to 0.11.5\n   * `goprintffuncname`: from 7558a9eaa5af to v0.1.0\n   * `godot`: from 1.4.17 to 1.4.18\n   * `gosec`: from 2.21.2 to 2.21.4\n   * `intrange`: from 0.2.0 to 0.2.1\n   * `musttag`: from 0.12.2 to 0.13.0\n   * `nakedret`: from 2.0.4 to 2.0.5\n   * `noctx`: from 0.0.2 to 0.1.0\n   * `protogetter`: from 0.3.6 to 0.3.8\n4. Deprecations\n   * ⚠️ `execinquery`: deprecation step 2\n   * ⚠️ `gomnd`: deprecation step 2 (replaced by `mnd`)\n5. Misc.\n   * Type sizing when cross-compiling (32-bit).\n   * code-climate: add check_name field\n   * Improve Go version detection\n   * Fix Go version propagation\n6. Documentation\n   * Adds a section about `exclude-dirs-use-default`\n   * Improve 'install from sources' section\n   * Improve FAQ about Go versions\n   * Improve linter/rule/check docs\n   * Improve new linter section\n   * Improve `forbidigo` pattern examples for built-in functions\n\n### v1.61.0\n\n_Released on 2024-09-09_\n\n1. Enhancements\n   * Add `junit-xml-extended` format\n   * Exclude Swagger Codegen files by default\n2. Linters new features\n   * `gci`: from 0.13.4 to 0.13.5 (new option `no-lex-order`)\n   * `nolintlint`: remove the empty line in the directive replacement\n3. Linters bug fixes\n   * `dupword`: from 0.0.14 to 0.1.1\n   * `fatcontext`: from 0.4.0 to 0.5.2\n   * `go-ruleguard`: from 0.4.2 to 0fe6f58b47b1 (fix panic with custom linters)\n   * `godot`: from 1.4.16 to 1.4.17\n   * `gomodguard`: from 1.3.3 to 1.3.5\n   * `gosec`: disable temporarily `G407`\n   * `gosec`: from ab3f6c1c83a0 to 2.21.2 (partially fix `G115`)\n   * `intrange`: from 0.1.2 to 0.2.0\n4. Misc.\n    * Improve runtime version parsing\n5. Documentation\n    * Add additional info about `typecheck`\n\n### v1.60.3\n\n_Released on 2024-08-22_\n\n1. Updated linters\n   * `gosec`: from 81cda2f91fbe to ab3f6c1c83a0 (fix `G115` false positives)\n2. Misc.\n   * Check that the Go version use to build is greater or equals to the Go version of the project\n\n### v1.60.2\n\n_Released on 2024-08-20_\n\n1. Linters new features\n   * `gosec`: from 5f0084eb01a9 to 81cda2f91fbe (adds `G115`, `G405`, `G406`, `G506`, `G507`)\n2. Linters bug fixes\n   * `gofmt`: update to HEAD (go1.22)\n   * `gofumpt`: from 0.6.0 to 0.7.0\n   * `gosec`: fix G602 analyzer\n   * `staticcheck`: from 0.5.0 to 0.5.1\n   * `staticcheck`: propagate Go version\n   * `wrapcheck`: from 2.8.3 to 2.9.0\n3. Deprecations\n   * ⚠️ `exportloopref`: deprecation\n\n### v1.60.1\n\n_Released on 2024-08-14_\n\n1. Misc.\n   * 🎉 go1.23 support\n2. Linters new features\n   * `exhaustruct`: from 3.2.0 to 3.3.0 (recognize custom error values in return)\n   * `govet` (`printf`): report non-constant format, no args\n   * `lll`: advertise max line length instead of just reporting failure\n   * `revive`: from 1.3.7 to 1.3.9 (new rule: `comments-density`)\n   * `staticcheck`: from 0.4.7 to 0.5.0\n   * `testifylint`: from 1.3.1 to 1.4.3 (new options: `formatter`, `suite-broken-parallel`, `suite-subtest-run`)\n3. Linters bug fixes\n   * `errorlint`: from 1.5.2 to 1.6.0\n   * `fatcontext`: from 0.2.2 to 0.4.0 (fix false positives for context stored in structs)\n   * `gocognit`: from 1.1.2 to 1.1.3\n   * `gomodguard`: from 1.3.2 to 1.3.3\n   * `sloglint`: from 0.7.1 to 0.7.2\n   * `spancheck`: from 0.6.1 to 0.6.2\n   * `tenv`: from 1.7.1 to 1.10.0 (remove reports on fuzzing)\n   * `tparallel`: from 0.3.1 to 0.3.2\n   * `usestdlibvars`: from 1.26.0 to 1.27.0 (fix false-positive with number used inside a mathematical operations)\n   * `wsl`: from 4.2.1 to 4.4.1\n4. Deprecations\n   * ️⚠️ `unused`: remove `exported-is-used` option\n5. Fixes\n   * SARIF: sanitize level property\n   * ️⚠️ `typecheck` issues should never be ignored\n6. Documentation\n   * Add link on linter without configuration\n   * Remove 'trusted by' page\n   * `wsl` update documentation of the configuration\n\n### v1.60.0\n\n_Released on 2024-08-13_\n\nCancelled due to a CI problem.\n\n### v1.59.1\n\n_Released on 2024-06-09_\n\n1. Updated linters\n   * `errorlint`: from 1.5.1 to 1.5.2\n   * `gomnd`: deprecated configuration compatibility\n   * `intrange`: add `style` preset\n   * `misspell`: from 0.5.1 to 0.6.0\n   * `sloglint`: from 0.7.0 to 0.7.1\n   * `testifylint`: from 1.3.0 to 1.3.1\n   * `unparam`: bump to HEAD\n   * `usestdlibvars`: from 1.25.0 to 1.26.0\n2. Fixes\n   * SARIF: init empty result slice\n   * SARIF: issue column >= 1\n3. Documentation\n   * `revive`: update documentation of the configuration\n\n### v1.59.0\n\n_Released on 2024-05-26_\n\n1. Enhancements\n   * Add SARIF output format\n   * Allow the analysis of generated files (`issues.exclude-generated: disable`)\n2. Updated linters\n   * `errcheck`: fix deprecation warning\n   * `gocritic`: from 0.11.3 to 0.11.4\n   * `gosec`: from 2.20.0 to 5f0084eb01a9 (fix G601 and G113 performance issues)\n   * `sloglint`: from 0.6.0 to 0.7.0 (new option `forbidden-keys`)\n   * `testifylint`: from 1.2.0 to 1.3.0 (new checker `negative-positive` and new option `go-require.ignore-http-handlers`)\n3. Misc.\n   * ️️⚠️ Deprecate `github-action` output format\n   * ️️⚠️ Deprecate `issues.exclude-generated-strict` option (replaced by `issues.exclude-generated: strict`)\n   * ️️⚠️ Add warning about disabled and deprecated linters (level 2)\n\n### v1.58.2\n\n_Released on 2024-05-19_\n\n1. Updated linters\n   * `canonicalheader`: from 1.0.6 to 1.1.1\n   * `gosec`: from 2.19.0 to 2.20.0\n   * `musttag`: from 0.12.1 to 0.12.2\n   * `nilnil`: from 0.1.8 to 0.1.9\n2. Documentation\n   * Improve integrations and install pages\n\n### v1.58.1\n\n_Released on 2024-05-08_\n\n1. Updated linters\n   * `tagalign`: from 1.3.3 to 1.3.4\n   * `protogetter`: from 0.3.5 to 0.3.6\n   * `gochecknoinits`: fix analyzer name\n2. Fixes\n   * Restores previous `github-actions` output format (removes GitHub Action problem matchers)\n\n### v1.58.0\n\n_Released on 2024-05-03_\n\n1. New linters\n   * `fatcontext`: https://github.com/Crocmagnon/fatcontext\n   * `canonicalheader`: https://github.com/lasiar/canonicalheader\n2. Updated linters\n   * `copyloopvar`: from 1.0.10 to 1.1.0 (`ignore-alias` is replaced by `check-alias` with the opposite behavior)\n   * `decorder`: from 0.4.1 to 0.4.2\n   * `errname`: from 0.1.12 to 0.1.13\n   * `errorlint`: from 1.4.8 to 1.5.1 (new options `allowed-errors` and `allowed-errors-wildcard`)\n   * `execinquery`: deprecate linter ⚠️\n   * `gci`: from 0.12.3 to 0.13.4 (new section `localModule`)\n   * `gocritic`: from 0.11.2 to 0.11.3\n   * `spancheck`: from 0.5.3 to 0.6.1\n   * `goerr113` is replaced by `err113` ⚠️\n   * `gomnd` is replaced by `mnd` ⚠️\n   * `gomodguard`: from 1.3.1 to 1.3.2\n   * `grouper`: from 1.1.1 to 1.1.2\n   * `intrange`: from 0.1.1 to 0.1.2\n   * `mirror`: from 1.1.0 to 1.2.0\n   * `misspell`: from 0.4.1 to 0.5.1\n   * `musttag`: from 0.9.0 to 0.12.1\n   * `nilnil`: from 0.1.7 to 0.1.8\n   * `nonamedreturns`: from 1.0.4 to 1.0.5\n   * `promlinter`: from 0.2.0 to 0.3.0\n   * `sloglint`: from 0.5.0 to 0.6.0\n   * `unparam`: bump to HEAD (063aff900ca150b80930c8de76f11d7e6488222f)\n   * `whitespace`: from 0.1.0 to 0.1.1\n3. Enhancements\n   * Speed up \"fast\" linters when only \"fast\" linters are run: between 40% and 80% faster at first run (i.e. without cache)\n4. Fixes\n   * Use version with module plugins\n   * Skip `go.mod` report inside autogenerated processor\n   * Keep only `typecheck` issues when needed\n   * Don't hide `typecheck` errors inside diff processor\n5. Misc.\n   * ⚠️ log an error when using previously deprecated linters ([Linter Deprecation Cycle](https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle))\n      * [`deadcode`](https://github.com/remyoudompheng/go-misc/tree/HEAD/deadcode): deprecated since v1.49.0 (2022-08-23).\n      * [`exhaustivestruct`](https://github.com/mbilski/exhaustivestruct): deprecated since v1.46.0 (2022-05-08).\n      * [`golint`](https://github.com/golang/lint): deprecated since v1.41.0 (2021-06-15).\n      * [`ifshort`](https://github.com/esimonov/ifshort): deprecated since v1.48.0 (2022-08-04).\n      * [`interfacer`](https://github.com/mvdan/interfacer): deprecated since v1.38.0 (2021-03-03).\n      * [`maligned`](https://github.com/mdempsky/maligned): deprecated since v1.38.0 (2021-03-03).\n      * [`nosnakecase`](https://github.com/sivchari/nosnakecase): deprecated since v1.48.0 (2022-08-04).\n      * [`scopelint`](https://github.com/kyoh86/scopelint): deprecated since v1.39.0 (2021-03-25).\n      * [`structcheck`](https://github.com/opennota/check): deprecated since v1.49.0 (2022-08-23).\n      * [`varcheck`](https://github.com/opennota/check): deprecated since v1.49.0 (2022-08-23).\n   * ⚠️ Deprecate usage of linter alternative names\n   * Remove help display on errors with `config verify` command\n   * Add `pre-commit` hook to run `config verify`\n   * Improve `github-action` output\n6. Documentation\n   * Remove deprecated Atom from Editor Integrations\n\nGitHub Action (v5.1.0) for golangci-lint:\n- supports for `pull`, `pull_request_target`, and `merge_group` events with the option `only-new-issues`.\n- ️️⚠️ `skip-pkg-cache` and `skip-build-cache` have been removed because the cache related to Go itself is already handled by `actions/setup-go`.\n- with golangci-lint v1.58, the file information (path and position) will be displayed on the log.\n\n### v1.57.2\n\n_Released on 2024-03-28_\n\n1. Updated linters\n   * `contextcheck`: from 1.1.4 to 1.1.5\n   * `copyloopvar`: from 1.0.8 to 1.0.10\n   * `ginkgolinter`: from 0.16.1 to 0.16.2\n   * `goconst`: from 1.7.0 to 1.7.1\n   * `gomoddirectives`: from 0.2.3 to 0.2.4\n   * `intrange`: from 0.1.0 to 0.1.1\n2. Misc.\n   * Display warnings on deprecated linter options\n   * Fix missing `colored-tab` output format\n   * Fix TeamCity `inspectionType` service message\n3. Documentation\n   * Remove invalid example about mixing files and directory\n   * Improve linters page\n\n### v1.57.1\n\n_Released on 2024-03-20_\n\n1. Fixes\n   * Ignore issues with invalid position (e.g. `contextcheck`).\n\n### v1.57.0\n\n_Released on 2024-03-19_\n\n1. New linters\n   * `copyloopvar`: https://github.com/karamaru-alpha/copyloopvar\n   * `intrange`: https://github.com/ckaznocha/intrange\n2. Updated linters\n   * `dupword`: from 0.0.13 to 0.0.14\n   * `gci`: from 0.12.1 to 0.12.3\n   * `ginkgolinter`: from 0.15.2 to 0.16.1 (new option `force-expect-to`, `validate-async-intervals`, and `forbid-spec-pollution`)\n   * `go-critic`: from 0.11.1 to 0.11.2\n   * `go-critic`: support of `enable-all` and `disable-all` options\n   * `go-spancheck`: from 0.5.2 to 0.5.3\n   * `gomodguard`: from 1.3.0 to 1.3.1\n   * `govet`: deprecation of `check-shadowing` ⚠️\n   * `govet`: disable temporarily `httpresponse` because of a bug https://github.com/golang/go/issues/66259\n   * `misspell`: add `extra-words`\n   * `musttag`: from 0.8.0 to 0.9.0\n   * `nakedret`: from 2.0.2 to 2.0.4\n   * `paralleltest`: from 1.0.9 to 1.0.10\n   * `perfsprint`: from 0.6.0 to 0.7.1 (new option `strconcat`)\n   * `protogetter`: from 0.3.4 to 0.3.5\n   * `revive`: add `exclude` option\n   * `sloglint`: from 0.4.0 to 0.5.0 (new option `no-global`)\n   * `staticcheck`: from 0.4.6 to 0.4.7\n   * `testifylint`: from 1.1.2 to 1.2.0 (new option `bool-compare`)\n   * `unconvert`: to HEAD (new options `fast-math` and `safe`)\n   * `wrapcheck`: from 2.8.1 to 2.8.3\n   * Disable `copyloopvar` and `intrange` on Go < 1.22\n3. Enhancements\n   * 🧩New custom linters system https://golangci-lint.run/docs/plugins/module-plugins/\n   * Allow running only a specific linter without modifying the file configuration (`--enable-only`)\n   * Allow custom sort order for the reports (`output.sort-order`)\n   * Automatically adjust the maximum concurrency to the container CPU quota if `run.concurrency=0`\n   * Add `config verify` command to check the configuration against the JSON Schema\n   * Option to strictly follow Go generated file convention (`issues.exclude-generated-strict`)\n   * Syntax to not override `severity` from linters (`@linter`)\n   * Use severities from `gosec`\n   * Create automatically directory related to `output.formats.path`\n   * Use the first issue without inline on `mergeLineIssues` on multiple issues\n4. Misc.\n   * ⚠️ Inactivate deprecated linters (`deadcode`, `exhaustivestruct`, `golint`, `ifshort`, `interfacer`, `maligned`, `nosnakecase`, `scopelint`, `structcheck`, `varcheck`)\n   * ⚠️ Deprecated CLI flags have been removed (deprecated since 2018)\n   * ⚠️ Move `show-stats` option from `run` to `output` configuration section\n   * ⚠️ Replace `run.skip-xxx` options by `issues.exclude-xxx` options\n   * ⚠️ Replace `output.format` by `output.formats` with a new file configuration syntax\n   * Internal rewrite of the CLI\n   * Improve 'no go files to analyze' message\n   * Use `GOTOOLCHAIN=auto` inside the Docker images\n5. Documentation\n   * ⚠️ Define the linter deprecation cycle https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle\n   * 🎉Use information from the previous release to create linter pages\n   * Publish JSON schema on https://golangci-lint.run/jsonschema/golangci.jsonschema.json\n   * Reorganize documentation pages\n   * Add an explanation about the configuration file inside golangci-lint repository\n\n**⚠️ Important ⚠️**\n\n1. Deprecated linters are inactivated, you still need to disable them if you are using `enable-all`.\n2. Deprecated CLI flags (about linter settings and `deadline`) have been removed.\n\n### v1.56.2\n\n_Released on 2024-02-15_\n\n1. updated linters\n   * `go-critic`: from 0.11.0 to 0.11.1\n   * `gosec`: from 2.18.2 to 2.19.0\n   * `testifylint`: from 1.1.1 to 1.1.2\n   * `usestdlibvars`: from 1.24.0 to 1.25.0\n   * `wsl`: from 4.2.0 to 4.2.1\n2. misc.\n   * Fix missing version in Docker image\n3. Documentation\n   * Explain the limitation of `new-from-rev` and `new-from-patch`\n\n### v1.56.1\n\n_Released on 2024-02-08_\n\n1. updated linters\n   * `errcheck`: from 1.6.3 to 1.7.0\n   * `govet`: disable `loopclosure` with go1.22\n   * `revive`: from 1.3.6 to 1.3.7\n   * `testifylint`: from 1.1.0 to 1.1.1\n\n### v1.56.0\n\n_Released on 2024-02-07_\n\n1. new linters\n   * `spancheck`: https://github.com/jjti/go-spancheck\n2. updated linters\n   * `depguard`: from 2.1.0 to 2.2.0\n   * `exhaustive`: from 0.11.0 to 0.12.0\n   * `exhaustruct`: from 3.1.0 to 3.2.0\n   * `gci`: from 0.11.2 to 0.12.1\n   * `ginkgolinter`: from 0.14.1 to 0.15.2\n   * `go-check-sumtype`: from 0.1.3 to 0.1.4\n   * `go-critic`: from 0.9.0 to 0.11.0\n   * `go-errorlint`: from 1.4.5 to 1.4.8\n   * `go-spancheck`: from 0.4.2 to 0.5.2\n   * `goconst`: from 1.6.0 to 1.7.0\n   * `godot`: from 1.4.15 to 1.4.16\n   * `gofumpt`: from 0.5.0 to 0.6.0\n   * `inamedparam`: from 0.1.2 to 0.1.3\n   * `ineffassign`: from 0.0.0-20230610083614-0e73809eb601 to 0.1.0\n   * `ireturn`: from 0.2.2 to 0.3.0\n   * `misspell`: add mode option\n   * `musttag`: from v0.7.2 to v0.8.0\n   * `paralleltest`: from 1.0.8 to 1.0.9\n   * `perfsprint`: from 0.2.0 to 0.6.0\n   * `protogetter`: from 0.2.3 to 0.3.4\n   * `revive`: from 1.3.4 to 1.3.6\n   * `sloglint`: add static-msg option\n   * `sloglint`: from 0.1.2 to 0.4.0\n   * `testifylint`: from 0.2.3 to 1.1.0\n   * `unparam`: from 20221223090309-7455f1af531d to 20240104100049-c549a3470d14\n   * `whitespace`: update after moving to the `analysis` package\n   * `wsl`: from 3.4.0 to 4.2.0\n   * `zerologlint`: from 0.1.3 to 0.1.5\n3. misc.\n   * 🎉 go1.22 support\n   * Implement stats per linter with a flag\n   * Make versioning inside Docker image consistent with binaries\n   * Parse Go RC version\n4. Documentation\n   * Fix `noctx` description\n   * Add missing fields to `.golangci.reference.yml`\n   * Improve `.golangci.reference.yml` defaults\n   * `typecheck`: improve FAQ\n   * `exhaustruct`: note that struct regular expressions are expected to match the entire `package/name/structname`\n   * `wrapcheck`: adjust `ignoreSigs` to new defaults\n\n**Important**\n\n`testifylint` has [breaking changes](https://github.com/Antonboom/testifylint/releases/tag/v1.0.0) about enabling/disabling checks:\n\n- If you were using the option `enable` with a filtered list of checks, you should either add `disable-all: true` (1) or use `disable` field (2).\n\n    ```yml\n      # Example (1)\n      testifylint:\n        disable-all: true\n        enable:\n          - bool-compare\n          - compares\n          - empty\n          - error-is-as\n          - error-nil\n          - expected-actual\n          - go-require\n          - float-compare\n          - len\n          - nil-compare\n          - require-error\n          # - suite-dont-use-pkg\n          - suite-extra-assert-call\n          - suite-thelper\n    ```\n\n    ```yml\n      # Example (2)\n      testifylint:\n        disable:\n          - suite-dont-use-pkg\n    ```\n\n### v1.55.2\n\n_Released on 2023-11-03_\n\n1. updated linters\n   * `ireturn`: from 0.2.1 to 0.2.2\n   * `ginkgolinter`: from 0.14.0 to 0.14.1\n\n### v1.55.1\n\n_Released on 2023-10-25_\n\n1. updated linters\n   * `gosec`: from 2.18.1 to 2.18.2\n2. misc.\n   * `revgrep`: from v0.5.0 to v0.5.2 (support git < 2.41.0)\n   * output: convert backslashes to forward slashes for GitHub Action annotations printer\n\n### v1.55.0\n\n_Released on 2023-10-20_\n\n1. new linters\n   * `gochecksumtype`: https://github.com/alecthomas/go-check-sumtype\n   * `inamedparam`: https://github.com/macabu/inamedparam\n   * `perfsprint`: https://github.com/catenacyber/perfsprint\n   * `protogetter`: https://github.com/ghostiam/protogetter\n   * `sloglint`: https://github.com/go-simpler/sloglint\n   * `testifylint`: https://github.com/Antonboom/testifylint\n2. updated linters\n   * `bidichk`: from 0.2.4 to 0.2.7\n   * `decorder`: from 0.4.0 to 0.4.1\n   * `dupword`: from 0.0.12 to 0.0.13\n   * `errchkjson`: from 0.3.1 to 0.3.6\n   * `gci`: from 0.11.0 to 0.11.2\n   * `ginkgolinter`: from 0.13.5 to 0.14.0\n   * `go-errorlint`: from 1.4.4 to 1.4.5\n   * `gocognit`: from 1.0.7 to 1.1.0\n   * `goconst`: from 1.5.1 to 1.6.0\n   * `godot`: from 1.4.14 to 1.4.15\n   * `gofmt`: update to HEAD\n   * `goimports`: update to HEAD\n   * `gosec`: from 2.17.0 to 2.18.1\n   * `gosmopolitan`: from 1.2.1 to 1.2.2\n   * `govet`: add `appends` analyzer\n   * `ireturn`: from 0.2.0 to 0.2.1\n   * `protogetter`: from 0.2.2 to 0.2.3\n   * `revgrep`: from 745bb2f7c2e6 to v0.5.0\n   * `revive`: from 1.3.2 to 1.3.4\n   * `sqlclosecheck`: from 0.4.0 to 0.5.1\n   * `staticcheck`: from 0.4.5 to 0.4.6\n   * `tagalign`: from 1.3.2 to 1.3.3\n   * `unused`: support passing in options\n3. misc.\n   * Add a pre-commit hook to check all files\n4. Documentation\n   * add source options to exclude-rules docs\n   * `gosec`: add G602 to includes/excludes inside .golangci.reference.yml\n\n### v1.54.2\n\n_Released on 2023-08-21_\n\n1. updated linters:\n   * `errname`: from 0.1.10 to 0.1.12\n   * `ginkgolinter`: from 0.13.3 to 0.13.5\n   * `go-errorlint`: from 1.4.3 to 1.4.4\n   * `godot`: from 1.4.11 to 1.4.14\n   * `gosec`: from 2.16.0 to 2.17.0\n   * `musttag`: from 0.7.1 to 0.7.2\n   * `nilnil`: from 0.1.5 to 0.1.7\n   * `staticcheck`: from 0.4.3 to 0.4.5\n   * `usestdlibvars`: from 1.23.0 to 1.24.0\n   * `govet`: add missing `directive` and `slog` passes\n\n### v1.54.1\n\n_Released on 2023-08-11_\n\n1. updated linters:\n   * `go-critic`:  from 0.8.2 to 0.9.0\n2. misc.\n   * plugin: temporarily hide warning about using plugins using the old API\n\n### v1.54.0\n\n_Released on 2023-08-09_\n\n1. updated linters:\n   * `decorder`: from 0.2.3 to 0.4.0\n   * `dupword`: from 0.0.11 to 0.0.12\n   * `errorlint`: from 1.4.2 to 1.4.3\n   * `exhaustruct`: from 2.3.0 to 3.1.0\n   * `forbidigo`: from 1.5.3 to 1.6.0\n   * `funlen`: from 0.0.3 to 0.1.0\n   * `gci`: from 0.10.1 to 0.11.0\n   * `ginkgolinter`: from 0.12.1 to 0.13.3\n   * `go-critic`: from 0.8.1 to 0.8.2\n   * `go-errorlint`: from 1.4.2 to 1.4.3\n   * `go-exhaustruct`: from 2.3.0 to 3.1.0\n   * `gocognit`: from 1.0.6 to 1.0.7\n   * `gocritic`: from 0.8.1 to 0.8.2\n   * `gofmt`: autofix missing newline at EOF\n   * `misspell`: 0.4.0 to 0.4.1\n   * `musttag`: from 0.7.0 to 0.7.1\n   * `paralleltest`: from 1.0.7 to 1.0.8\n   * `tagalign`: from 1.2.2 to 1.3.2\n   * `typecheck`: explain it and remove it from the linter list\n   * `zerologlint`: from 0.1.2 to 0.1.3\n2. misc.\n   * 🎉 go1.21 support\n   * plugin: include custom linters in `enable-all`\n   * plugin: allow to use settings for plugins\n3. Documentation\n   * Add linter descriptions.\n\n**Important**\n\n`ruleguard` (a \"rule\" inside `gocritic`) was disabled in this release (v1.54.0) and was enabled again in the next release (v1.54.1).\n\n`exhaustruct` has breaking changes with regular expressions, more details [here](https://github.com/GaijinEntertainment/go-exhaustruct/releases/tag/v3.0.0).\n\n### v1.53.3\n\n_Released on 2023-06-15_\n\n1. updated linters:\n   * `cyclop`: from 1.2.0 to 1.2.1\n   * `exhaustive`: from 0.10.0 to 0.11.0\n   * `forbidigo`: from 1.5.1 to 1.5.3\n   * `ginkgolinter`: from 0.12.2 to 0.12.1\n   * `ineffassign`: bump to HEAD\n   * `nakedret`: from 2.0.1 to 2.0.2\n   * `zerologlint`: from 0.1.1 to 0.1.2\n2. misc.\n   * codeclimate: reduce memory allocation\n   * support illumos/amd64\n\n### v1.53.2\n\n_Released on 2023-06-03_\n\n1. updated linters\n   * `depguard`: from v2.0.1 to 2.1.0\n2. misc.\n   * `depguard`: throw error only when the linter is called\n\n### v1.53.1\n\n_Released on 2023-06-02_\n\n1. misc.\n   * `depguard`: fix GOROOT detection\n   * `importas`: fix duplication detection when aliases use regular expression replacement pattern\n\n### v1.53.0\n\n_Released on 2023-06-01_\n\n1. new linters\n   * `gosmopolitan`: https://github.com/xen0n/gosmopolitan\n   * `mirror`: https://github.com/butuzov/mirror\n   * `tagalign`: https://github.com/4meepo/tagalign\n   * `zerologlint`: https://github.com/ykadowak/zerologlint\n2. updated linters\n   * `bodyclose`: bump to HEAD\n   * `containedctx`: from 1.0.2 to 1.0.3\n   * `depguard`: migrate to v2\n   * `errname`: from 0.1.9 to 0.1.10\n   * `exhaustive`: from 0.9.5 to 0.10.0\n   * `forbidigo`: better support for configuring complex rules\n   * `gci`: improve error message\n   * `ginkgolinter`: add suppress-async-assertion option\n   * `ginkgolinter`: from 0.9.0 to 0.12.0\n   * `go-critic`: from 0.7.0 to 0.8.1\n   * `go-errorlint`: from 1.4.0 to 1.4.2\n   * `gofumpt`: from 0.4.0 to 0.5.0\n   * `gosec`: convert global settings as map with proper key type\n   * `gosec`: from 2.15.0 to 2.16.0\n   * `importas`: detect duplicate alias or package in the configuration\n   * `importas`: fix typo in logs\n   * `ireturn`: from 0.1.1 to 0.2.0\n   * `musttag`: from 0.5.0 to 0.7.0\n   * `nakedret`: to 2.0.1\n   * `nilnil`: from 0.1.3 to 0.1.5\n   * `paralleltest`: from 1.0.6 to 1.0.7\n   * `revive`: from 1.3.1 to 1.3.2\n   * `tagliatelle`: from 0.4.0 to 0.5.0\n   * `usestdlibvars`: fix configuration\n3. misc.\n   * `golang.org/x/tools`: from 0.7.0 to 0.9.2\n   * add loongarch64 to the install script\n   * output: add colored-tab\n   * remove warning when the config file is explicitly stdin\n   * rules: support inverted path match\n4. Documentation\n   * `mnd`: clarify ignore usage examples to be regexps\n   * `tagliatelle`: update documentation\n   * improve features section\n   * update supported Go versions FAQ\n\n### v1.52.2\n\n_Released on 2023-03-25_\n\n1. updated linters\n   * `tparallel`: from 0.3.0 to 0.3.1\n2. misc.\n   * fix: pre-commit `require_serial` and `pass_filenames`\n\n### v1.52.1\n\n_Released on 2023-03-21_\n\n1. misc.\n   * fix: improve panic management\n   * fix: the combination of --fix and --path-prefix\n\n### v1.52.0\n\n_Released on 2023-03-18_\n\n1. updated linters\n   * `asciicheck`: from 0.1.1 to 0.2.0\n   * `bidichk`: from 0.2.3 to 0.2.4\n   * `contextcheck`: from 1.1.3 to 1.1.4\n   * `dupword`: from 0.0.9 to 0.0.11\n   * `durationcheck`: from 0.0.9 to 0.0.10\n   * `errchkjson`: from 0.3.0 to 0.3.1\n   * `errname`: from 0.1.7 to 0.1.9\n   * `forbidigo`: from 1.4.0 to 1.5.1\n   * `gci`: from 0.9.1 to 0.10.1\n   * `ginkgolinter`: from 0.8.1 to 0.9.0\n   * `go-critic`: from 0.6.7 to 0.7.0\n   * `go-errorlint`: from 1.1.0  to 1.4.0\n   * `godox`: bump to HEAD\n   * `lll`: skip go command\n   * `loggercheck`: from 0.9.3 to 0.9.4\n   * `musttag`: from 0.4.5 to 0.5.0\n   * `nilnil`: from 0.1.1 to 0.1.3\n   * `noctx`: from 0.0.1 to 0.0.2\n   * `revive`: from 1.2.5 to 1.3.1\n   * `rowserrcheck`: remove limitation related to generics support\n   * `staticcheck`: from 0.4.2 to 0.4.3\n   * `testpackage`: from 1.1.0 to 1.1.1\n   * `tparallel`: from 0.2.1 to 0.3.0\n   * `wastedassign`: remove limitation related to generics support\n   * `wrapcheck`: from 2.8.0 to 2.8.1\n2. misc.\n   * Add TeamCity output format\n   * Consider path prefix when matching path patterns\n   * Add Go version to version information\n3. Documentation\n   * Add Tekton in Trusted By page\n   * Clarify that custom linters are not enabled by default\n   * Remove description for deprecated \"go\" option\n\n### v1.51.2\n\n_Released on 2023-02-19_\n\n1. updated linters\n   * `forbidigo`: from 1.3.0 to 1.4.0\n   * `gci`: from 0.9.0 to 0.9.1\n   * `go-critic`: from 0.6.5 to 0.6.7\n   * `go-errorlint`: from 1.0.6 to 1.1.0\n   * `gosec`: from 2.14.0 to 2.15.0\n   * `musttag`: from 0.4.4 to 0.4.5\n   * `staticcheck`: from 0.4.0 to 0.4.2\n   * `tools`: from 0.5.0 to 0.6.0\n   * `usestdlibvars`: from 1.21.1 to 1.23.0\n   * `wsl`: from 3.3.0 to 3.4.0\n   * `govet`: enable `timeformat` by default\n2. misc.\n   * fix: cache status size calculation\n   * add new source archive\n3. Documentation\n   * Improve installation section\n   * Replace links to godoc.org with pkg.go.dev\n\n### v1.51.1\n\n_Released on 2023-02-05_\n\n1. updated linters\n   * `ginkgolinter`: from 0.7.1 to 0.8.1\n   * `ineffassign`: bump to HEAD\n   * `musttag`: from 0.4.3 to 0.4.4\n   * `sqlclosecheck`: from 0.3.0 to 0.4.0\n   * `staticcheck`: bump to v0.4.0\n   * `wastedassign`: from 2.0.6 to 2.0.7\n   * `wrapcheck`: from 2.7.0 to 2.8.0\n\n### v1.51.0\n\n_Released on 2023-02-02_\n\n1. new linters\n   * `ginkgolinter`: https://github.com/nunnatsa/ginkgolinter\n   * `musttag`: https://github.com/tmzane/musttag\n   * `gocheckcompilerdirectives`: https://github.com/leighmcculloch/gocheckcompilerdirectives\n2. updated linters\n   * `bodyclose`: to HEAD\n   * `dupword`: from 0.0.7 to 0.0.9\n   * `errcheck`: from 1.6.2 to 1.6.3\n   * `exhaustive`: from 0.8.3 to 0.9.5\n   * `exportloopref`: from 0.1.8 to 0.1.11\n   * `gci`: from 0.8.1 to 0.9.0\n   * `ginkgolinter`: from 0.6.0 to 0.7.1\n   * `go-errorlint`: from 1.0.5 to 1.0.6\n   * `go-ruleguard`: from 0.3.21 to 0.3.22\n   * `gocheckcompilerdirectives`: from 1.1.0 to 1.2.1\n   * `gochecknoglobals`: from 0.1.0 to 0.2.1\n   * `gomodguard`: from 1.2.4 to 1.3.0\n   * `gosec`: from 2.13.1 to 2.14.0\n   * `govet`: Add `timeformat` to analysers\n   * `grouper`: from 1.1.0 to 1.1.1\n   * `musttag`: from 0.4.1 to 0.4.3\n   * `revive`: from 1.2.4 to 1.2.5\n   * `tagliatelle`: from 0.3.1 to 0.4.0\n   * `tenv`: from 1.7.0 to 1.7.1\n   * `unparam`: bump to HEAD\n   * `usestdlibvars`: from 1.20.0 to 1.21.1\n   * `wsl`: fix `force-err-cuddling` flag\n3. misc.\n   * go1.20 support\n   * remove deprecated linters from presets\n   * Build NetBSD binaries\n   * Build loong64 binaries\n4. Documentation\n   * `goimport`: improve documentation for local-prefixes\n   * `gomnd`: add missing always ignored functions\n   * `nolint`: fix typo\n   * `tagliatelle` usage typo\n   * add note about binary requirement for plugin\n   * cache preserving and colored output on docker runs\n   * improve documentation about debugging.\n   * improve Editor Integration section\n   * More specific default cache directory\n   * update output example to use valid checkstyle example; add json example\n\n### v1.50.1\n\n_Released on 2022-10-22_\n\n1. updated linters\n   * `contextcheck`: from 1.1.2 to 1.1.3\n   * `go-mnd`: from 2.5.0 to 2.5.1\n   * `wrapcheck`: from 2.6.2 to 2.7.0\n   * `revive`: fix configuration parsing\n   * `lll`: skip imports\n2. misc.\n   * windows: remove redundant character escape '\\/'\n   * code-climate: add default severity\n\n### v1.50.0\n\n_Released on 2022-10-04_\n\n1. new linters\n   * `dupword`: https://github.com/Abirdcfly/dupword\n   * `testableexamples`: https://github.com/maratori/testableexamples\n2. updated linters\n   * `contextcheck`: change owner\n   * `contextcheck`: from 1.0.6 to 1.1.2\n   * `depguard`: from 1.1.0 to 1.1.1\n   * `exhaustive`: add missing config\n   * `exhaustive`: from 0.8.1 to 0.8.3\n   * `gci`: from 0.6.3 to 0.8.0\n   * `go-critic`: from 0.6.4 to 0.6.5\n   * `go-errorlint`: from 1.0.2 to 1.0.5\n   * `go-reassign`: v0.1.2 to v0.2.0\n   * `gofmt`: add option `rewrite-rules`\n   * `gofumpt` from 0.3.1 to 0.4.0\n   * `goimports`: update to HEAD\n   * `interfacebloat`: fix configuration loading\n   * `logrlint`: rename `logrlint` to `loggercheck`\n   * `paralleltest`: add tests of the ignore-missing option\n   * `revive`: from 1.2.3 to 1.2.4\n   * `usestdlibvars`: from 1.13.0 to 1.20.0\n   * `wsl`: support all configs and update docs\n3. misc.\n   * Normalize `exclude-rules` paths for Windows\n   * add riscv64 to the install script\n4. Documentation\n   * cli: remove reference to old service\n\n### v1.49.0\n\n_Released on 2022-08-24_\n\nIMPORTANT: `varcheck` and `deadcode` has been removed of default linters.\n\n1. new linters\n   * `interfacebloat`: https://github.com/sashamelentyev/interfacebloat\n   * `logrlint`: https://github.com/timonwong/logrlint\n   * `reassign`: https://github.com/curioswitch/go-reassign\n2. updated linters\n   * `go-colorable`: from 0.1.12 to 0.1.13\n   * `go-critic`: from 0.6.3 to 0.6.4\n   * `go-errorlint`: from 1.0.0 to 1.0.2\n   * `go-exhaustruct`: from 2.2.2 to 2.3.0\n   * `gopsutil`: from 3.22.6 to 3.22.7\n   * `gosec`: from 2.12.0 to 2.13.1\n   * `revive`: from 1.2.1 to 1.2.3\n   * `usestdlibvars`: from 1.8.0 to 1.13.0\n   * `contextcheck`: from v1.0.4 to v1.0.6 && re-enable\n   * `nosnakecase`: This linter is deprecated.\n   * `varcheck`: This linter is deprecated use `unused` instead.\n   * `deadcode`: This linter is deprecated use `unused` instead.\n   * `structcheck`: This linter is deprecated use `unused` instead.\n3. documentation\n   * `revive`: fix wrong URL\n   * Add a section about default exclusions\n   * `usestdlibvars`: fix typo in documentation\n   * `nolintlint`: remove allow-leading-space option\n   * Update documentation and assets\n4. misc.\n   * dev: rewrite the internal tests framework\n   * fix: exit early on run --version\n   * fix: set an explicit `GOROOT` in the Docker image for `go-critic`\n\n### v1.48.0\n\n_Released on 2022-08-04_\n\n1. new linters\n   * `usestdlibvars`:https://github.com/sashamelentyev/usestdlibvars\n2. updated linters\n   * `contextcheck`: disable linter\n   * `errcheck`: from 1.6.1 to 1.6.2\n   * `gci`: add missing `custom-order` setting\n   * `gci`: from 0.5.0 to 0.6.0\n   * `ifshort`: deprecate linter\n   * `nolint`: drop allow-leading-space option and add \"nolint:all\"\n   * `revgrep`: bump to HEAD\n3. documentation\n   * remove outdated info on source install\n4. misc\n   * go1.19 support\n\n### v1.47.3\n\n_Released on 2022-08-01_\n\n1. updated linters:\n   * remove some go1.18 limitations\n   * `asasalint`: from 0.0.10 to 0.0.11\n   * `decorder`: from 0.2.2 to v0.2.3\n   * `gci`: fix panic with invalid configuration option\n   * `gci`: from 0.4.3 to v0.5.0\n   * `go-exhaustruct`: from 2.2.0 to 2.2.2\n   * `gomodguard`: from 1.2.3 to 1.2.4\n   * `nosnakecase`: from 1.5.0 to 1.7.0\n   * `honnef.co/go/tools`: from 0.3.2 to v0.3.3\n2. misc\n   * cgo: fix linters ignoring CGo files\n\n### v1.47.2\n\n_Released on 2022-07-21_\n\n1. updated linters:\n   * `revive`: ignore slow rules\n\n### v1.47.1\n\n_Released on 2022-07-19_\n\n1. updated linters:\n   * `gci`: from 0.4.2 to 0.4.3\n   * `gci`: remove the use of stdin\n   * `gci`: fix options display\n   * `tenv`: from 1.6.0 to 1.7.0\n   * `unparam`: bump to HEAD\n\n### v1.47.0\n\n_Released on 2022-07-18_\n\n1. new linters:\n   * `asasalint`: https://github.com/alingse/asasalint\n   * `nosnakecase`: https://github.com/sivchari/nosnakecase\n2. updated linters:\n   * `decorder`: from 0.2.1 to 0.2.2\n   * `errcheck`: from 1.6.0 to 1.6.1\n   * `errname`: from 0.1.6 to 0.1.7\n   * `exhaustive`: from 0.7.11 to 0.8.1\n   * `gci`: fix issues and re-enable autofix\n   * `gci`: from 0.3.4 to 0.4.2\n   * `go-exhaustruct`: from 2.1.0 to 2.2.0\n   * `go-ruleguard`: from 0.3.19 to 0.3.21\n   * `gocognit`: from 1.0.5 to 1.0.6\n   * `gocyclo`: from 0.5.1 to 0.6.0\n   * `golang.org/x/tools`: bump to HEAD\n   * `gosec`: allow `global` config\n   * `gosec`: from 2.11.0 to 2.12.0\n   * `nonamedreturns`: from 1.0.1 to 1.0.4\n   * `paralleltest`: from 1.0.3 to 1.0.6\n   * `staticcheck`: fix generics\n   * `staticcheck`: from 0.3.1 to 0.3.2\n   * `tenv`: from 1.5.0 to 1.6.0\n   * `testpackage`: from 1.0.1 to 1.1.0\n   * `thelper`: from 0.6.2 to 0.6.3\n   * `wrapcheck`: from 2.6.1 to 2.6.2\n3. documentation:\n   * add thanks page\n   * add a clear explanation about the `staticcheck` integration.\n   * `depguard`: add `ignore-file-rules`\n   * `depguard`: adjust phrasing\n   * `gocritic`: add `enable` and `disable` ruleguard settings\n   * `gomnd`: fix typo\n   * `gosec`: add configs for all existing rules\n   * `govet`: add settings for `shadow` and `unusedresult`\n   * `thelper`: add `fuzz` config and description\n   * linters: add defaults\n\n### v1.46.2\n\n_Released on 2022-05-17_\n\n1. updated linters:\n   * `execinquery`: bump from v1.2.0 to v1.2.1\n   * `errorlint`: bump to v1.0.0\n   * `thelper`: allow to disable one option\n2. documentation:\n   * rename `.golangci.example.yml` to `.golangci.reference.yml`\n   * add `containedctx` linter to the list of available linters\n\n### v1.46.1\n\n_Released on 2022-05-12_\n\n1. updated linters:\n   * `execinquery`: bump from v0.6.0 to v0.6.1\n2. documentation:\n   * add missing linters\n\n### v1.46.0\n\n_Released on 2022-05-09_\n\n1. new linters:\n   * `execinquery`: https://github.com/lufeee/execinquery\n   * `nonamedreturns`: https://github.com/firefart/nonamedreturns\n   * `nosprintfhostport`: https://github.com/stbenjam/no-sprintf-host-port\n   * `exhaustruct`: https://github.com/GaijinEntertainment/go-exhaustruct\n2. updated linters:\n   * `bidichk`: from 0.2.2 to 0.2.3\n   * `deadcode`: bump to HEAD\n   * `errchkjson`: from 0.2.3 to 0.3.0\n   * `errname`: from 0.1.5 to 0.1.6\n   * `go-critic`: from 0.6.2 to 0.6.3\n   * `gocyclo`: from 0.4.0 to 0.5.1\n   * `gofumpt` from 0.3.0 to 0.3.1\n   * `gomoddirectives`: from 0.2.2 to 0.2.3\n   * `gosec`: from 2.10.0 to 2.11.0\n   * `honnef.co/go/tools`: from 0.2.2to 0.3.1 (go1.18 support)\n   * `nilnil`: from 0.1.0 to 0.1.1\n   * `nonamedreturns`: bump from 1.0.0 to 1.0.1\n   * `predeclared`: from 0.2.1 to 0.2.2\n   * `promlinter`: bump to v0.2.0\n   * `revive`: from 1.1.4 to 1.2.1\n   * `tenv`: from 1.4.7 to 1.5.0\n   * `thelper`: from 0.5.1 to 0.6.2\n   * `unused`: fix false-positive\n   * `varnamelen`: bump to v0.8.0\n   * `wrapcheck`: from 2.5.0 to 2.6.1\n   * `exhaustivestruct`: This linter is deprecated use `exhaustruct` instead.\n3. documentation:\n   * Update \"Shell Completion\" instruction on Linux\n   * Update FAQ page\n4. misc:\n   * log: enable override coloring based on `CLICOLOR` and `CLICOLOR_FORCE`\n\n### v1.45.2\n\n_Released on 2022-03-24_\n\n1. misc:\n   * fix: help command\n\n### v1.45.1\n\n_Released on 2022-03-24_\n\n1. updated linters:\n   * `interfacer`: inactivate with go1.18\n   * `govet`: inactivate unsupported analyzers (go1.18)\n   * `depguard`: reduce requirements\n   * `structcheck`: inactivate with go1.18\n   * `varnamelen`: bump from v0.6.0 to v0.6.1\n2. misc:\n   * Automatic Go version detection 🎉 (go1.18)\n   * docker: update base images (go1.18)\n\n### v1.45.0\n\n_Released on 2022-03-29_\n\n1. updated linters:\n   * `cobra`: from 1.3.0 to 1.4.0\n   * `containedctx`: from 1.0.1 to 1.0.2\n   * `errcheck`: add an option to remove default exclusions\n   * `gci`: from 0.3.1 to 0.3.2\n   * `go-header`: from 0.4.2 to 0.4.3\n   * `gofumpt`: add module-path setting\n   * `gofumpt`: from 0.2.1 to 0.3.0\n   * `gopsutil`: from 3.22.1 to 3.22.2\n   * `gosec`: from 2.9.6 to 2.10.0\n   * `makezero`: from 1.1.0 to 1.1.1\n   * `revive`: fix default values\n   * `wrapcheck`: from 2.4.0 to 2.5.0\n2. documentation:\n   * docs: add \"back to the top\" button\n   * docs: add `forbidigo` example that uses comments\n   * docs: improve linters page\n3. misc:\n   * go1.18 support 🎉\n   * Add an option to manage the targeted version of Go\n   * Default to YAML when config file has no extension\n\n### v1.44.2\n\n_Released on 2022-02-17_\n\n1. updated linters:\n   * `gci`: bump to HEAD\n   * `gci`: restore defaults for sections\n   * `whitespace`: from 0.0.4 to 0.0.5\n2. documentation:\n   * add link to configuration in the linters list\n\n### v1.44.1\n\n_Released on 2022-02-17_\n\n1. updated linters:\n   * `bidichk`: from 0.2.1 to 0.2.2\n   * `errchkjson`: from 0.2.1 to 0.2.3\n   * `thelper`: from 0.5.0 to 0.5.1\n   * `tagliatelle`: from 0.3.0 to 0.3.1\n   * `gopsutil`: from 3.21.12 to 3.22.1\n   * `gci`: from 0.2.9 to 0.3.0\n   * `revive`: from v1.1.3 to v1.1.4\n   * `varnamelen`: from v0.5.0 to v0.6.0\n2. documentation:\n   * linters: improve configuration pages\n   * `decorder`: fix `disable-init-func-first-check: false` elaboration\n3. misc:\n   * fix debug output\n\n### v1.44.0\n\n_Released on 2022-01-25_\n\n1. new linters:\n   * `containedctx`: https://github.com/sivchari/containedctx\n   * `decorder`: https://gitlab.com/bosi/decorder\n   * `errchkjson`: https://github.com/breml/errchkjson\n   * `maintidx`: https://github.com/yagipy/maintidx\n   * `grouper`: https://github.com/leonklingele/grouper\n2. updated linters:\n   * `asciicheck`: bump to v0.1.1\n   * `bidichk`: from 0.1.1 to 0.2.1\n   * `bodyclose`: bump to HEAD\n   * `decorder`: from 0.2.0 to 0.2.1\n   * `depguard`: from 1.0.1 to 1.1.0\n   * `errchkjson`: from 0.2.0 to 0.2.1\n   * `errorlint`: bump to HEAD\n   * `exhaustive`: drop deprecated/unused settings\n   * `exhaustive`: from v0.2.3 to 0.7.11\n   * `forbidigo`: from 1.2.0 to 1.3.0\n   * `forcetypeassert`: bump to v0.1.0\n   * `gocritic`: from 0.6.1 to 0.6.2\n   * `gocritic`: support autofix\n   * `gocyclo`: from 0.3.1 to 0.4.0\n   * `godot`: add period option\n   * `gofumpt`: from 0.1.1 to 0.2.1\n   * `gomnd`: from 2.4.0 to 2.5.0\n   * `gomnd`: new configuration\n   * `gosec`: from 2.9.1 to 2.9.6\n   * `ifshort`: from 1.0.3 to 1.0.4\n   * `ineffassign`: bump to HEAD\n   * `makezero`: to v1.1.0\n   * `promlinter`: from v0.1.0 to HEAD\n   * `revive`: fix `enableAllRules`\n   * `revive`: from 1.1.2 to 1.1.3\n   * `staticcheck`: from 0.2.1 to 0.2.2\n   * `tagliatelle`: from 0.2.0 to 0.3.0\n   * `thelper`: from 0.4.0 to 0.5.0\n   * `unparam`: bump to HEAD\n   * `varnamelen`: bump to v0.5.0\n   * `wrapcheck`: update configuration to include `ignoreSignRegexps`\n3. documentation:\n   * linters: improve pages about configuration\n   * improve page about false-positive\n   * `nolintlint`: fix wrong default value in comment\n   * `revive`: add a more detailed configuration\n4. misc:\n   * outputs: Add support for multiple outputs\n   * outputs: Print error text in `<failure>` tag content for more readable JUnit output\n   * outputs: ensure that the Issues key in JSON format is a list\n   * Return error if any linter fails to run\n   * cli: Show deprecated mark in the CLI linters help\n\n### November 2021\n\n1. new linters:\n   * `bidichk`: https://github.com/breml/bidichk\n2. update linters:\n   * `nestif`: from 0.3.0 to 0.3.1\n   * `rowserrcheck`: from 1.1.0 to 1.1.1\n   * `gopsutil`: from 3.21.9 to 3.21.10\n   * `wrapcheck`: from 2.3.1 to 2.4.0\n   * `gocritic`: add support for variable substitution in `ruleguard` path settings\n3. documentation:\n   * improve `go-critic` documentation\n   * improve `nolintlint` documentation\n4. Misc:\n   * cli: don't hide `enable-all` option\n\n### october 2021\n\n1. new linters:\n   * `contextcheck`: https://github.com/kkHAIKE/contextcheck\n   * `varnamelen`: https://github.com/blizzy78/varnamelen\n2. update linters:\n   * `gochecknoglobals`: to v0.1.0\n   * `gosec`: filter issues according to the severity and confidence\n   * `errcheck`: empty selector name.\n   * `ifshort`: from 1.0.2 to 1.0.3\n   * `go-critic`: from 0.5.6 to 0.6.0\n   * `gosec`: from 2.8.1 to 2.9.1\n   * `durationcheck`: from 0.0.8 to 0.0.9\n   * `wrapcheck`: from 2.3.0 to 2.3.1\n   * `revive`: from 1.1.1 to 1.1.2\n\n### September 2021\n\n1. new linters:\n   * `ireturn`: https://github.com/butuzov/ireturn\n   * `nilnil`: https://github.com/Antonboom/nilnil\n   * `tenv`: https://github.com/sivchari/tenv\n2. update linters:\n   * `errcheck`: update to HEAD\n   * `errname`: from 0.1.4 to 0.1.5\n   * `gci`: Parse the settings more similarly to the CLI\n   * `godot`: from 1.4.9  to 1.4.11\n   * `ireturn`: from 0.1.0 to 0.1.1\n   * `nlreturn`: add block-size option\n   * `paralleltest`: from 1.0.2 to 1.0.3\n3. Misc:\n   * new-from-rev: add support for finding issues in entire files in a diff\n\n### August 2021\n\n1. new linters:\n   * `errname`: https://github.com/Antonboom/errname\n2. update linters:\n   * `errname`: from 0.1.3 to 0.1.4\n   * `go-critic`: fix invalid type conversions.\n   * `godot`: from 1.4.8 to 1.4.9\n   * `gomodguard`: from 1.2.2 to 1.2.3\n   * `revive`: from 1.0.9 to 1.1.1\n   * `staticcheck`: bump to 2021.1.1 (v0.2.1)\n   * `wrapcheck`: bump to v2.3.0\n3. Misc:\n   * build binaries and Docker images with go1.17\n\n### July 2021\n\n1. update linters:\n   * `errcheck`: allow exclude config without extra file\n   * `exhaustive`: from 0.1.0 to 0.2.3\n   * `gocognit`: from 1.0.1 to 1.0.5\n   * `godot`: from 1.4.7 to 1.4.8\n   * `gomoddirectives`: from 0.2.1 to 0.2.2\n   * `revive`: from 1.0.8 to 1.0.9\n2. documentation:\n   * improve `goconst` documentation\n   * improve `goimports` description\n\n### June 2021\n\n1. update linters:\n   * `durationcheck`: from 0.0.7 to 0.0.8\n   * `gci`: from 0.2.8 to 0.2.9\n   * `goconst`: from 0.5.6 to 0.5.7\n   * `gofumpt`: Add lang-version option\n   * `gomodguard`: from 1.2.1 to 1.2.2\n   * `gosec`: from 2.8.0 to 2.8.1\n   * `revive`: add enable-all-rules.\n   * `revive`: allow to disable rule\n   * `revive`: fix exclude comment rule for const block\n   * `revive`: from 1.0.7 to 1.0.8\n   * `wrapcheck`: from 2.1.0 to 2.2.0\n2. documentation:\n   * add all integrations to docs introduction page\n3. Misc:\n   * 🎉 Un-deprecate enable-all option\n   * output: generate HTML report\n   * Support RISV64\n\n### May 2021\n\n1. new linters:\n   * `tagliatelle`: https://github.com/ldez/tagliatelle\n   * `promlinter`: https://github.com/yeya24/promlinter\n2. update linters:\n   * `durationcheck`: from 0.0.6 to 0.0.7\n   * `errorlint`: bump to HEAD\n   * `forbidigo`: from 1.1.0 to 1.2.0\n   * `go-critic`: from 0.5.5 to 0.5.6\n   * `godot`: from 1.4.6 to 1.4.7\n   * ⚠ `golint`: deprecated\n   * `gomnd`: from 2.3.2 to 2.4.0\n   * `gomodguard`: fix problem where duplicate issues were reported\n   * `gosec`: from 2.7.0 to 2.8.0\n   * `govet`: fix `sigchanyzer`\n   * `govet`: Update vet passes\n   * `importas`: allow repeated aliases\n   * `importas`: bump to HEAD\n   * `makezero`: bump to HEAD\n   * `nolintlint`: fix false positive\n   * `revive`: convert hard coded excludes into default exclude patterns\n   * `revive`: fix add-constant rule support\n   * `revive`: fix excludes\n   * `revive`: from 1.0.6 to 1.0.7\n   * `revive`: improve 'exported' rule output\n   * `rowserrcheck`: bump to v1.1.0\n   * `staticcheck`: configuration for `staticcheck`, `gosimple`, `stylecheck`\n   * `staticcheck`: from 0.1.3 to 0.1.4\n   * `staticcheck`: from v0.1.4 to v0.2.0\n   * `wastedassign`: from 0.2.0 to 1.0.0\n   * `wastedassign`: from 1.0.0 to v2.0.6\n   * `wrapcheck`: from 1.2.0 to 2.1.0\n3. documentation:\n   * improve linters page\n   * `exhaustivestruct` example explanation\n   * fix pattern of `forbidigo` in example config yaml\n   * bump documentation dependencies\n   * fix typos\n4. Misc:\n   * set the minimum Go version to go1.15\n   * non-zero exit code when a linter produces a panic\n\n### April 2021\n\n1. new linters:\n   * `tagliatelle`: https://github.com/ldez/tagliatelle\n   * `promlinter`: https://github.com/yeya24/promlinter\n2. update linters:\n   * `godot`: from 1.4.4 to 1.4.6\n   * `wrapcheck`: from 1.0.0 to 1.2.0\n   * `go-mnd`: from 2.3.1 to 2.3.2\n   * `wsl`: from 3.2.0 to 3.3.0\n   * `revive`: from 1.0.5 to 1.0.6\n   * `importas`: bump to HEAD\n   * `staticcheck`: configurable Go version\n   * `gosec`: add configuration\n   * `typecheck`: improve error stack parsing\n3. documentation:\n   * bump documentation dependencies\n   * fix typos\n4. Misc:\n   * fix: comma in exclude pattern leads to unexpected results\n\n### March 2021\n\n1. new linters:\n   * `gomoddirectives`: https://github.com/ldez/gomoddirectives\n2. update linters:\n   * `go-critic`: from 0.5.4 to 0.5.5\n   * `gofumpt`: from v0.1.0 to v0.1.1\n   * `gosec`: from 2.6.1 to 2.7.0\n   * `ifshort`: bump to v1.0.2\n   * `importas`: bump to HEAD\n   * `makezero`: bump to HEAD\n   * `nolintlint`: allow to fix //nolint lines\n   * `revive`: from 1.0.3 to 1.0.5\n   * `revive`: the default configuration is only applied when no dedicated configuration\n   * `rowserrcheck`: bump to HEAD\n   * ⚠ `scopelint`: deprecated\n   * `staticcheck`: from v0.1.2 (2020.2.2) to v0.1.3 (2020.2.3)\n   * 🎉 `typecheck`: display compilation errors as report instead of error\n   * `wastedassign`: bump to v0.2.0\n   * `wrapcheck`: bump to v1.0.0\n3. documentation:\n   * improve [linters page](https://golangci-lint.run/docs/linters/) (versions, deprecation, and presets)\n   * add [cache directory](https://golangci-lint.run/docs/configuration/cli/#cache) information\n   * adding missing format options\n   * fix typos\n4. Misc:\n   * Set `version` command output to Stdout\n   * fix linters load mode\n   * Restore fast linters meaning\n\n### February 2021\n\n1. new linters:\n   * `durationcheck`: https://github.com/charithe/durationcheck\n   * `revive`: https://github.com/mgechev/revive\n   * `cyclop`: https://github.com/bkielbasa/cyclop\n   * `wastedassign`: https://github.com/sanposhiho/wastedassign\n   * `importas`: https://github.com/julz/importas\n   * `nilerr`: https://github.com/gostaticanalysis/nilerr\n   * `forcetypeassert`: https://github.com/gostaticanalysis/forcetypeassert\n   * `govet`: add `stringintconv` and `ifaceassert`\n2. update linters:\n   * `prealloc`: Use upstream version\n   * `errcheck`: Use upstream version\n   * `ineffassign`: Use upstream version\n   * `gocyclo`: Use upstream version\n   * `godot` from 1.3.2 to 1.4.3\n   * `exhaustivestruct` from 1.1.0 to 1.2.0\n   * `forbidigo` from 1.0.0 to 1.1.0\n   * `thelper` from 0.2.1 to 0.3.1\n   * `ruleguard`: print error message and exit with non-zero status when parsing error occurs\n   * fix wrong load mode for `asciicheck`, `exhaustivestruct`, `exportloopref`, and `makezero`\n   * `wsl`: bump to v3.2.0\n   * `durationcheck`: from 0.0.4 to 0.0.6\n   * `staticcheck`: from 2020.1.6 to v0.1.2 (2020.2.2)\n   * `thelper` from 0.3.1 to 0.4.0\n   * `bodyclose`: bump to HEAD\n   * `go-err113`: bump to HEAD\n   * ⚠ `interfacer`: deprecated\n   * ⚠ `maligned`: deprecated (govet `fieldalignment` as replacement)\n   * `govet`: use same default linter as go vet\n   * `go-printf-func-name`: to `v0.0.0-20200119135958-7558a9eaa5af`\n   * `godox`: to `v0.0.0-20210227103229-6504466cf951`\n   * `asciicheck`: to `v0.0.0-20200416200610-e657995f937b`\n   * `wrapcheck`: to `v0.0.0-20201130113247-1683564d9756`\n   * `unparam`: to `v0.0.0-20210104141923-aac4ce9116a7`\n3. CLI: truncate multiline descriptions\n4. fix: new-from-rev for a large repository\n5. Support RelatedInformation for analysis Diagnostic\n6. use go1.16 to create binaries\n7. fix: MIPS release\n8. documentation:\n   * bump documentation dependencies\n   * fix `go-header` usage\n   * improve `gocritic` description\n   * update deprecated hyperlink for Sublime Text plugin\n   * add docs on using homebrew tap\n\n### January 2021\n\n1. new linters:\n   * `predeclared`: https://github.com/nishanths/predeclared\n   * `ifshort`: https://github.com/esimonov/ifshort\n2. update linters:\n   * `go-critic` from 0.5.2 to 0.5.3\n   * `thelper` from 0.1.0 to 0.2.1\n   * Validate `go-critic` settings\n   * `gofumpt` to v0.1.0\n   * `gci` to v0.2.8\n   * `go-mnd` to v2.3.1\n   * `gosec` from 2.5.0 to 2.6.1\n   * `godot` from 1.3.2 to 1.4.3\n   * `ifshort` to v1.0.1\n   * `rowserrcheck`: fix reports false positive\n3. fix: modules-download-mode support\n4. documentation:\n   * bump documentation dependencies\n\n### December 2020\n\n1. new linters:\n   * `forbidigo`: https://github.com/ashanbrown/forbidigo\n   * `makezero`: https://github.com/ashanbrown/makezero\n   * `thelper`: https://github.com/kulti/thelper\n2. update linters:\n   * `go-header` from v0.3.1 to v0.4.2\n   * `go-mnd` from v2.0.0 to v2.2.0\n   * `godot` from v1.3.0 to v1.3.2\n   * `gci` from v0.2.4 to v0.2.7\n   * `gomodguard` from v1.1.0 to v1.2.0\n   * `go-errorlint` from v0.0.0-20201006195004-351e25ade6e3 to v0.0.0-20201127212506-19bd8db6546f\n   * `gofumpt` from v0.0.0-20200802201014-ab5a8192947d to v0.0.0-20201129102820-5c11c50e9475\n   * `nolintlint` fix comment analysis. (#1571)\n3. result/processors: treat all non-Go source as special autogenerated files\n4. throw an error on panic. (#1540)\n5. resolve custom linters' path relative to config file directory (#1572)\n6. treat all non-Go source as special autogenerated files\n7. documentation:\n   * add settings examples for `gocritic` (#1562)\n   * removing reference to no-longer-existing linter-in-the-cloud (#1553)\n8. others:\n   * bump `gopkg.in/yaml.v2` from 2.3.0 to 2.4.0 (#1528)\n   * bump `gatsby-remark-responsive-iframe` in /docs (#1533)\n   * bump `gatsby-remark-images` from 3.3.29 to 3.6.0 in /docs (#1531)\n   * bump `ini` from 1.3.5 to 1.3.8 in /tools (#1560)\n   * bump `react-headroom` from 3.0.0 to 3.0.1 in /docs (#1532)\n   * bump `react-live` from 2.2.2 to 2.2.3 in /docs (#1534)\n   * bump `react` from 16.13.1 to 16.14.0 in /docs (#1481)\n   * Fix `forbidigo` linter name in reports (#1590)\n\n### November 2020\n\n1. new linters:\n   * `paralleltest`: https://github.com/kunwardeep/paralleltest\n2. update linters:\n   * `godot` from v0.4.9 to v1.3.0\n   * `exportloopref` from v0.1.7 to v0.1.8\n   * `gosec` from 2.4.0 to 2.5.0\n   * `goconst` using upstream https://github.com/jgautheron/goconst\n3. `DefaultExcludePatterns` should only be used for specified linter (#1494)\n4. unknown linter breaks //nolint (#1497)\n5. report all unknown linters at once (#1477)\n6. CI:\n   * fix Docker tag for Alpine build\n7. documentation:\n   * missing sort-results in the docs (#1514)\n   * add description of Homebrew's official formula (#1421)\n8. others:\n   * bump `golang.org/x/text` to v0.3.4 (#1293)\n   * bump `github.com/fatih/color` to from 1.9.0 to 1.10.0 (#1485)\n   * bump `lodash` from 4.17.15 to 4.17.19 in /.github/peril (#1252)\n   * bump `polished` from 3.6.6 to 4.0.3 in /docs (#1482)\n   * bump `gatsby-alias-imports` from 1.0.4 to 1.0.6 in /docs (#1479)\n   * bump `puppeteer` from 5.3.1 to 5.4.1 in /docs (#1480)\n   * bump `gatsby-remark-embedder` from 3.0.0 to 4.0.0 in /docs (#1478)\n\n### October 2020\n\n1. new linters:\n   * `exhaustivestruct`: https://github.com/mbilski/exhaustivestruct\n   * `go-errorlint`: https://github.com/polyfloyd/go-errorlint\n   * `tparallel`: https://github.com/moricho/tparallel\n   * `wrapcheck`: https://github.com/tomarrell/wrapcheck\n2. update linters:\n   * `honnef.co/go/tools` from 2020.1.5 to 2020.1.6\n   * `exhaustivestruct` from v1.0.1 to v1.1.0\n   * `exhaustive` to v0.1.0\n   * `gochecknoglobals`: use https://github.com/leighmcculloch/gochecknoglobals\n3. add support for powershell completion (#1408)\n4. add `.golangci.yaml` to list of configuration files searched on startup (#1364)\n5. support for only specifying default severity (#1396)\n6. documentation:\n   * mention macports installation procedure on macOS (#1352)\n   * sort linters (#1451)\n7. CI:\n   * add codeQL scanning (#1405)\n   * fix version details in Docker image (#1471)\n   * releasing docker image for arm64 (#1383)\n   * change interval for npm to monthly (#1424)\n8. others:\n   * use tag version for cobra (#1458)\n   * bump `nancy` to 1.0.1 (#1410)\n   * bump `gatsby-plugin-catch-links` in /docs (#1415)\n   * bump `gatsby-plugin-mdx` from 1.2.40 to 1.2.43 in /docs (#1419)\n   * bump `gatsby-plugin-sharp` from 2.6.31 to 2.6.40 in /docs (#1423)\n   * bump `gatsby-plugin-sitemap` from 2.4.12 to 2.4.14 in /docs (#1417)\n   * bump `github.com/mattn/go-colorable` from 0.1.7 to 0.1.8 (#1413)\n   * bump `github.com/sirupsen/logrus` from 1.6.0 to 1.7.0 (#1412)\n   * bump `github.com/sourcegraph/go-diff` from 0.6.0 to 0.6.1 (#1414)\n   * bump `golangci/golangci-lint-action` from v2 to v2.3.0  (#1447) (#1469)\n   * bump `puppeteer` from 3.3.0 to 5.3.1 in /docs (#1418)\n\n### September 2020\n\n1. update linters:\n   * `godot` from 0.4.8 to 0.4.9\n   * `exhaustive` from v0.0.0-20200708172631-8866003e3856 to v0.0.0-20200811152831-6cf413ae40e0\n   * `gofumpt` from v0.0.0-20200709182408-4fd085cb6d5f to v0.0.0-20200802201014-ab5a8192947d\n2. add support for fish completion (#1201)\n3. documentation:\n   * fix typo in performance docs (#1350)\n4. CI:\n   * prevent macos to be marked as passing upon failure (#1381)\n   * check only for go.mod file (#1397)\n   * check if go.mod and go.sum are up to dated (#1377)\n   * trigger Netlify (#1358)\n5. others:\n   * bump `github.com/sourcegraph/go-diff` from 0.5.3 to 0.6.0 (#1353)\n   * bump `github.com/valyala/quicktemplate` from 1.6.2 to 1.6.3 (#1385)\n   * ignore known dependency failure in nancy (#1378)\n   * bump `@mdx-js/mdx` from 1.6.16 to 1.6.18 in /docs (#1401)\n   * bump `gatsby` from 2.24.52 to 2.24.65 in /docs (#1400)\n   * bump `gatsby-plugin-canonical-urls` in /docs (#1390)\n   * bump `gatsby-plugin-google-analytics` in /docs (#1388)\n   * bump `gatsby-plugin-manifest` from 2.4.23 to 2.4.27 in /docs (#1355)\n   * bump `gatsby-plugin-mdx` from 1.2.35 to 1.2.40 in /docs (#1386)\n   * bump `gatsby-plugin-offline` from 3.2.23 to 3.2.27 in /docs (#1368)\n   * bump `gatsby-plugin-sharp` from 2.6.25 to 2.6.31 in /docs (#1354)\n   * bump `gatsby-plugin-sitemap` from 2.4.11 to 2.4.12 in /docs (#1344)\n   * bump `gatsby-remark-autolink-headers` in /docs (#1387)\n   * bump `gatsby-remark-images` from 3.3.25 to 3.3.28 in /docs (#1345)\n   * bump `gatsby-remark-images` from 3.3.28 to 3.3.29 in /docs (#1365)\n   * bump `gatsby-remark-mermaid` from 2.0.0 to 2.1.0 in /docs (#1369)\n   * bump `gatsby-source-filesystem` in /docs (#1366)\n   * bump `gatsby-source-filesystem` in /docs (#1389)\n   * bump `gatsby-transformer-sharp` in /docs (#1402)\n   * bump `gatsby-transformer-yaml` from 2.4.10 to 2.4.11 in /docs (#1367)\n   * bump `node-fetch` in /.github/contributors (#1363)\n   * bump `polished` from 3.6.5 to 3.6.6 in /docs (#1347)\n\n### August 2020\n\n1. new `nlreturn` linter: https://github.com/ssgreg/nlreturn\n2. new `gci` linter: https://github.com/daixiang0/gci\n3. support `latest` version of golangci-lint in golangci-lint-action\n4. update `gosec` linter from 2.3.0 to 2.4.0\n5. update `godot` linter from 0.4.2 to 0.4.8\n6. update `go-critic` from 0.5.0 to 0.5.2 (#1307)\n7. update `nlreturn` from 2.0.1 to 2.0.2 (#1287), 2.0.2 to 2.1.0 (#1327)\n8. update `gci` to v0.2.1 (#1292), to v0.2.2 (#1305), to v0.2.4 (#1337),\n9. update `funlen` from 0.0.2 to 0.0.3 (#1341)\n10. upgrade to golang 1.15 for smaller binary (#1303)\n11. support short and json formats for version cmd (#1315)\n12. add home directory to config file search paths (#1325)\n13. allow for serializing multiple golangci-lint invocations (#1302)\n\n### July 2020\n\n1. `gofumpt` linter:\n    * update linter\n    * add `extra-rules` option\n    * support auto-fixing\n2. upgrade `exhaustive` linter\n3. upgrade `exportloopref` linter\n4. improve 'no such linter' error message\n5. sorting result.Issues implementation\n6. enhancements in CI:\n    * Run `nancy` validation for all dependencies\n    * Move dependabot config to `.github` folder\n7. other\n    * bump `lodash` from 4.17.15 to 4.17.19 in /tools\n    * bump `golangci/golangci-lint-action` from v1.2.2 to v2\n    * bump `github.com/valyala/quicktemplate` from 1.5.0 to 1.5.1\n\n\n### June 2020\n\n1. Add new linters: `gofumpt`\n\n### May 2020\n\n1. Add new linters: `nolintlint`, `goerr113`\n2. Updated linters: `godot`, `staticcheck`\n3. Launch a [website](https://golangci-lint.run)\n\n### April 2020\n\n1. Add new linters: `testpackage`, `nestif`, `godot`, `gomodguard`, `asciicheck`\n2. Add GitHub Actions output format\n3. Update linters: `wsl`, `gomodguard`, `gosec`\n4. Support `disabled-tags` setting for `gocritic`\n5. Mitigate OOM and \"failed prerequisites\"\n6. Self-isolate due to unexpected pandemics\n7. Support case-sensitive excludes\n8. Allow granular re-enabling excludes by ID, e.g. `EXC0002`\n\n### September 2019\n\n1. Support go1.13\n2. Add new linters: `funlen`, `whitespace` (with auto-fix) and `godox`\n3. Update linters: `gochecknoglobals`, `scopelint`, `gosec`\n4. Provide pre-built binary for ARM and FreeBSD\n5. Fix false-positives in `unused`\n6. Support `--skip-dirs-use-default`\n7. Add support for bash completions\n\n### July 2019\n\n1. Fix parallel writes race condition\n2. Update bodyclose with fixed panic\n\n### June 2019\n\n1. Treat Go source files as a plain text by `misspell`: it allows detecting issues in strings, variable names, etc.\n2. Implement richer and more stable auto-fix of `misspell` issues.\n\n### May 2019\n\n1. Add [bodyclose](https://github.com/timakin/bodyclose) linter.\n2. Support junit-xml output.\n\n### April 2019\n\n1. Update go-critic, new checkers were added: badCall, dupImports, evalOrder, newDeref\n2. Fix staticcheck panic on packages that do not compile\n3. Make install script work on Windows\n4. Fix compatibility with the latest x/tools version and update golang.org/x/tools\n5. Correct import path of module sourcegraph/go-diff\n6. Fix `max-issues-per-linter` name\n7. Fix linting of preprocessed files (e.g. `*.qtpl.go`, goyacc)\n8. Enable auto-fixing when running via pre-commit\n\n### March 2019\n\n1. Support the newest `go vet` (with `go/analysis`)\n2. Support configuration of `go vet`: e.g. you can set print functions by `linters-settings.govet.settings.printf.funcs`\n3. Update megacheck (staticcheck) to 2019.1.1\n4. Add [information](https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint) about controlling space-time trade-off into README\n5. Exclude issues by source code line regexp by `issues.exclude-rules[i].source`\n6. Build and test on go 1.12\n7. Support `--color` option\n8. Update x/tools to fix c++ issues\n9. Include support for log level\n10. Sort linters list in help commands\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Follow the news and releases on [Mastodon](https://fosstodon.org/@golangcilint) and on [Bluesky](https://bsky.app/profile/golangci-lint.run).\n\n`golangci-lint` is a free and open-source project built by volunteers.\n\nIf you value it, consider supporting us, we appreciate it!\n\n[![Donate](https://img.shields.io/badge/Donate-❤️-blue?style=for-the-badge)](https://donate.golangci.org)\n\n<!-- START --->\n\n### v2.11.3\n\n_Released on 2026-03-10_\n\n1. Linters bug fixes\n   * `gosec`: from v2.24.7 to 619ce2117e08\n\n### v2.11.2\n\n_Released on 2026-03-07_\n\n1. Fixes\n   * `fmt`: fix error when using the `fmt` command with explicit paths. \n\n### v2.11.1\n\n_Released on 2026-03-06_\n\nDue to an error related to AUR, some artifacts of the v2.11.0 release have not been published.\n\nThis release contains the same things as v2.11.0.\n\n### v2.11.0\n \n_Released on 2026-03-06_\n\n1. Linters new features or changes\n   * `errcheck`: from 1.9.0 to 1.10.0 (exclude `crypto/rand.Read` by default)\n   * `gosec`: from 2.23.0 to 2.24.6 (new rules: `G113`, `G118`, `G119`, `G120`, `G121`, `G122`, `G123`, `G408`, `G707`)\n   * `noctx`: from 0.4.0 to 0.5.0 (new detection: `httptest.NewRequestWithContext`)\n   * `prealloc`: from 1.0.2 to 1.1.0\n   * `revive`: from 1.14.0 to 1.15.0 (⚠️ Breaking change: package-related checks moved from `var-naming` to a new rule `package-naming`)\n2. Linters bug fixes\n   * `gocognit`: from 1.2.0 to 1.2.1\n   * `gosec`: from 2.24.6 to 2.24.7\n   * `unqueryvet`: from 1.5.3 to 1.5.4\n\n### v2.10.1\n\n_Released on 2026-02-17_\n\n1. Fixes\n   * buildssa panic \n\n### v2.10.0\n\n_Released on 2026-02-17_\n\n1. Linters new features or changes\n   * `ginkgolinter`: from 0.22.0 to 0.23.0\n   * `gosec`: from 2.22.11 to 2.23.0 (new rules: `G117`, `G602`, `G701`, `G702`, `G703`, `G704`, `G705`, `G706`)\n   * `staticcheck`: from 0.6.1 to 0.7.0\n2. Linters bug fixes\n   * `godoclint`: from 0.11.1 to 0.11.2\n \n### v2.9.0\n\n_Released on 2026-02-10_\n\n1. Enhancements\n   * 🎉 go1.26 support\n2. Linters new features or changes\n   * `arangolint`: from 0.3.1 to 0.4.0 (new rule: detect potential query injections)\n   * `ginkgolinter`: from 0.21.2 to 0.22.0 (support for wrappers)\n   * `golines`: from 0.14.0 to 0.15.0\n   * `misspell`: from 0.7.0 to 0.8.0\n   * `revive`: from v1.13.0 to v1.14.0 (new rules: `epoch-naming`, `use-slices-sort`)\n   * `unqueryvet`: from 1.4.0 to 1.5.3 (new options: `check-n1`, `check-sql-injection`, `check-tx-leaks`, `allow`, `custom-rules`)\n   * `wsl_v5`: from 5.3.0 to 5.6.0 (new rule: `after-block`)\n3. Linters bug fixes\n   * `modernize`: from 0.41.0 to 0.42.0\n   * `prealloc`: from 1.0.1 to 1.0.2\n   * `protogetter`: from 0.3.18 to 0.3.20\n4. Misc.\n   * Log information about files when configuration verification\n   * Emit an error when no linters enabled\n   * Do not collect VCS information when loading code\n\n### v2.8.0\n\n_Released on 2026-01-07_\n\n1. Linters new features or changes\n   * `godoclint`: from 0.10.2 to 0.11.1 (new rule: `require-stdlib-doclink`)\n   * `golines`: from 442fd0091d95 to 0.14.0\n   * `gomoddirectives`: from 0.7.1 to 0.8.0\n   * `gosec`: from daccba6b93d7 to 2.22.11 (new rule: `G116`)\n   * `modernize`: from 0.39.0 to 0.40.0 (new analyzers: `stringscut`, `unsafefuncs`)\n   * `prealloc`: from 1.0.0 to 1.0.1 (message changes)\n   * `unqueryvet`: from 1.3.0 to 1.4.0 (new options: `check-aliased-wildcard`, `check-string-concat`, `check-format-strings`, `check-string-builder`, `check-subqueries`, `ignored-functions`, `sql-builders`)\n2. Linters bug fixes\n   * `gocritic`: from 0.14.2 to 0.14.3\n   * `errorlint`: from 1.8.0 to 1.9.0\n   * `govet`: from 0.39.0 to 0.40.0\n   * `protogetter`: from 0.3.17 to 0.3.18\n   * `revive`: add missing enable-default-rules setting\n3. Documentation\n   * docs: split installation page\n\n### v2.7.2\n\n_Released on 2025-12-07_\n\n1. Linter bug fixes\n   * `gosec`: from 2.22.10 to daccba6b93d7\n\n### v2.7.1\n\n_Released on 2025-12-04_\n\n1. Linter bug fixes\n   * `modernize`: disable `stringscut` analyzer\n\n### v2.7.0\n\n_Released on 2025-12-03_\n\n1. Bug fixes\n   * fix: clone args used by `custom` command\n2. Linters new features or changes\n   * `nosprintfhostport`: from 0.2.0 to 0.3.1 (ignore string literals without a colon)\n   * `unqueryvet`: from 1.2.1 to 1.3.0 (handles `const` and `var` declarations)\n   * `revive`: from 1.12.0 to 1.13.0 (new option: `enable-default-rules`, new rules: `forbidden-call-in-wg-go`, `unnecessary-if`, `inefficient-map-lookup`)\n   * `modernize`: from 0.38.0 to 0.39.0 (new analyzers: `plusbuild`, `stringscut`)\n3. Linters bug fixes\n   * `perfsprint`: from 0.10.0 to 0.10.1\n   * `wrapcheck`: from 2.11.0 to 2.12.0\n   * `godoclint`: from 0.10.1 to 0.10.2\n4. Misc.\n   * Add some flags to the `custom` command\n5. Documentation\n   * docs: split changelog v1 and v2\n\n### v2.6.2\n\n_Released on 2025-11-14_\n\n1. Bug fixes\n   * `fmt` command with symlinks\n   * use file depending on build configuration to invalidate cache\n2. Linters bug fixes\n   * `testableexamples`: from 1.0.0 to 1.0.1\n   * `testpackage`: from 1.1.1 to 1.1.2\n\n### v2.6.1\n\n_Released on 2025-11-04_\n\n1. Linters bug fixes\n   * `copyloopvar`: from 1.2.1 to 1.2.2\n   * `gocritic`: from 0.14.0 to 0.14.2\n\n### v2.6.0\n\n_Released on 2025-10-29_\n\n1. New linters\n   * Add `modernize` analyzer suite\n2. Linters new features or changes\n   * `arangolint`: from 0.2.0 to 0.3.1\n   * `dupword`: from 0.1.6 to 0.1.7 (new option `comments-only`)\n   * `gocritic`: from 0.13.0 to 0.14.0 (new rules/checkers: `zeroByteRepeat`, `dupOption`)\n   * `gofumpt`: from 0.9.1 to 0.9.2 (\"clothe\" naked returns is now controlled by the `extra-rules` option)\n   * `perfsprint`: from 0.9.1 to 0.10.0 (new options: `concat-loop`, `loop-other-ops`)\n   * `wsl`: from 5.2.0 to 5.3.0\n3. Linters bug fixes\n   * `dupword`: from 0.1.6 to 0.1.7\n   * `durationcheck`: from 0.0.10 to 0.0.11\n   * `exptostd`: from 0.4.4 to 0.4.5\n   * `fatcontext`: from 0.8.1 to 0.9.0\n   * `forbidigo`: from 2.1.0 to 2.3.0\n   * `ginkgolinter`: from 0.21.0 to 0.21.2\n   * `godoclint`: from 0.10.0 to 0.10.1\n   * `gomoddirectives`: from 0.7.0 to 0.7.1\n   * `gosec`: from 2.22.8 to 2.22.10\n   * `makezero`: from 2.0.1 to 2.1.0\n   * `nilerr`: from 0.1.1 to 0.1.2\n   * `paralleltest`: from 1.0.14 to 1.0.15\n   * `protogetter`: from 0.3.16 to 0.3.17\n   * `unparam`: from 0df0534333a4 to 5beb8c8f8f15\n4. Misc.\n   * fix: ignore some files to hash the version for custom build\n\n### v2.5.0\n\n_Released on 2025-09-21_\n\n1. New linters\n   * Add `godoclint` linter https://github.com/godoc-lint/godoc-lint\n   * Add `unqueryvet` linter https://github.com/MirrexOne/unqueryvet\n   * Add `iotamixing` linter https://github.com/AdminBenni/iota-mixing\n2. Linters new features or changes\n   * `embeddedstructfieldcheck`: from 0.3.0 to 0.4.0 (new option: `empty-line`)\n   * `err113`: from aea10b59be24 to 0.1.1 (skip internals of `Is` methods for `error` type)\n   * `ginkgolinter`: from 0.20.0 to 0.21.0 (new option: `force-tonot`)\n   * `gofumpt`: from 0.8.0 to 0.9.1 (new rule is to \"clothe\" naked returns for the sake of clarity)\n   * `ineffassign`: from 0.1.0 to 0.2.0 (new option: `check-escaping-errors`)\n   * `musttag`: from 0.13.1 to 0.14.0 (support interface methods)\n   * `revive`: from 1.11.0 to 1.12.0 (new options: `identical-ifelseif-branches`, `identical-ifelseif-conditions`, `identical-switch-branches`, `identical-switch-conditions`, `package-directory-mismatch`, `unsecure-url-scheme`, `use-waitgroup-go`, `useless-fallthrough`)\n   * `thelper`: from 0.6.3 to 0.7.1 (skip `t.Helper` in functions passed to `synctest.Test`)\n   * `wsl_v5`: from 5.1.1 to 5.2.0 (improvements related to subexpressions)\n3. Linters bug fixes\n   * `asciicheck`: from 0.4.1 to 0.5.0\n   * `errname`: from 1.1.0 to 1.1.1\n   * `fatcontext`: from 0.8.0 to 0.8.1\n   * `goprintffuncname`: from 0.1.0 to 0.1.1\n   * `godot`: from 1.5.1 to 1.5.4\n   * `gosec`: from 2.22.7 to 2.22.8\n   * `nilerr`: from 0.1.1 to a temporary fork\n   * `nilnil`: from 1.1.0 to 1.1.1\n   * `protogetter`: from 0.3.15 to 0.3.16\n   * `tagliatelle`: from 0.7.1 to 0.7.2\n   * `testifylint`: from 1.6.1 to 1.6.4\n4. Misc.\n   * fix: \"no export data\" errors are now handled as a standard typecheck error\n5. Documentation\n   * Improve nolint section about syntax\n\n### v2.4.0\n\n_Released on 2025-08-14_\n\n1. Enhancements\n    * 🎉 go1.25 support\n2. Linters new features or changes\n    * `exhaustruct`: from v3.3.1 to 4.0.0 (new options: `allow-empty`, `allow-empty-rx`, `allow-empty-returns`, `allow-empty-declarations`)\n3. Linters bug fixes\n   * `godox`: trim filepath from report messages\n   * `staticcheck`: allow empty options\n   * `tagalign`: from 1.4.2 to 1.4.3\n4. Documentation\n   * 🌟 New website (with a search engine)\n\n### v2.3.1\n\n_Released on 2025-08-02_\n\n1. Linters bug fixes\n   * `gci`: from 0.13.6 to 0.13.7\n   * `gosec`: from 2.22.6 to 2.22.7\n   * `noctx`: from 0.3.5 to 0.4.0\n   * `wsl_v5`: from 5.1.0 to 5.1.1\n   * tagliatelle: force upper case for custom initialisms\n\n### v2.3.0\n\n_Released on 2025-07-21_\n\n1. Linters new features or changes\n   * `ginkgolinter`: from 0.19.1 to 0.20.0 (new option: `force-assertion-description`)\n   * `iface`: from 1.4.0 to 1.4.1 (report message improvements)\n   * `noctx`: from 0.3.4 to 0.3.5 (new detections: `log/slog`, `exec`, `crypto/tls`)\n   * `revive`: from 1.10.0 to 1.11.0 (new rule: `enforce-switch-style`)\n   * `wsl_v5`: from 5.0.0 to 5.1.0\n2. Linters bug fixes\n   * `gosec`: from 2.22.5 to 2.22.6\n   * `noinlineerr`: from 1.0.4 to 1.0.5\n   * `sloglint`: from 0.11.0 to 0.11.1\n3. Misc.\n   * fix: panic close of closed channel\n\n### v2.2.2\n\n_Released on 2025-07-11_\n\n1. Linters bug fixes\n   * `noinlineerr`: from 1.0.3 to 1.0.4\n2. Documentation\n   * Improve debug keys documentation\n3. Misc.\n   * fix: panic close of closed channel\n   * godot: add noinline value into the JSONSchema\n\n### v2.2.1\n\n_Released on 2025-06-28_\n\n1. Linters bug fixes\n  * `varnamelen`: fix configuration\n\n### v2.2.0\n\n_Released on 2025-06-28_\n\n1. New linters\n   * Add `arangolint` linter https://github.com/Crocmagnon/arangolint\n   * Add `embeddedstructfieldcheck` linter https://github.com/manuelarte/embeddedstructfieldcheck\n   * Add `noinlineerr` linter https://github.com/AlwxSin/noinlineerr\n   * Add `swaggo` formatter https://github.com/golangci/swaggoswag\n2. Linters new features or changes\n   * `errcheck`: add `verbose` option\n   * `funcorder`: from 0.2.1 to 0.5.0 (new option `alphabetical`)\n   * `gomoddirectives`: from 0.6.1 to 0.7.0 (new option `ignore-forbidden`)\n   * `iface`: from 1.3.1 to 1.4.0 (new option `unexported`)\n   * `noctx`: from 0.1.0 to 0.3.3 (new report messages, and new rules related to `database/sql`)\n   * `noctx`: from 0.3.3 to 0.3.4 (new SQL functions detection)\n   * `revive`: from 1.9.0 to 1.10.0 (new rules: `time-date`, `unnecessary-format`, `use-fmt-print`)\n   * `usestdlibvars`: from 1.28.0 to 1.29.0 (new option `time-date-month`)\n   * `wsl`: deprecation\n   * `wsl_v5`: from 4.7.0 to 5.0.0 (major version with new configuration)\n3. Linters bug fixes\n   * `dupword`: from 0.1.3 to 0.1.6\n   * `exptostd`: from 0.4.3 to 0.4.4\n   * `forbidigo`: from 1.6.0 to 2.1.0\n   * `gci`: consistently format the code\n   * `spancheck`: from 0.6.4 to 0.6.5\n   * `goconst`: from 1.8.1 to 1.8.2\n   * `gosec`: from 2.22.3 to 2.22.4\n   * `gosec`: from 2.22.4 to 2.22.5\n   * `makezero`: from 1.2.0 to 2.0.1\n   * `misspell`: from 0.6.0 to 0.7.0\n   * `usetesting`: from 0.4.3 to 0.5.0\n4. Misc.\n   * exclusions:  fix `path-expect`\n   * formatters: write the input to `stdout` when using `stdin` and there are no changes\n   * migration: improve the error message when trying to migrate a migrated config\n   * `typecheck`: deduplicate errors\n   * `typecheck`: stops the analysis after the first error\n   * Deprecate `print-resources-usage` flag\n   * Unique version per custom build\n5. Documentation\n   * Improves typecheck FAQ\n   * Adds plugin systems recommendations\n   * Add description for `linters.default` sets\n\n### v2.1.6\n\n_Released on 2025-05-04_\n\n1. Linters bug fixes\n   * `godot`: from 1.5.0 to 1.5.1\n   * `musttag`: from 0.13.0 to 0.13.1\n2. Documentation\n   * Add note about golangci-lint v2 integration in VS Code\n\n### v2.1.5\n\n_Released on 2025-04-24_\n\nDue to an error related to Snapcraft, some artifacts of the v2.1.4 release have not been published.\n\nThis release contains the same things as v2.1.3.\n\n### v2.1.4\n\n_Released on 2025-04-24_\n\nDue to an error related to Snapcraft, some artifacts of the v2.1.3 release have not been published.\n\nThis release contains the same things as v2.1.3.\n\n### v2.1.3\n\n_Released on 2025-04-24_\n\n1. Linters bug fixes\n   * `fatcontext`: from 0.7.2 to 0.8.0\n2. Misc.\n   * migration: fix `nakedret.max-func-lines: 0`\n   * migration: fix order of `staticcheck` settings\n   * fix: add `go.mod` hash to the cache salt\n   * fix: use diagnostic position for related information position\n\n### v2.1.2\n\n_Released on 2025-04-15_\n\n1. Linters bug fixes\n   * `exptostd`: from 0.4.2 to 0.4.3\n   * `gofumpt`: from 0.7.0 to 0.8.0\n   * `protogetter`: from 0.3.13 to 0.3.15\n   * `usetesting`: from 0.4.2 to 0.4.3\n\n### v2.1.1\n\n_Released on 2025-04-12_\n\nThe release process of v2.1.0 failed due to a regression inside goreleaser.\n\nThe binaries of v2.1.0 have been published, but not the other artifacts (AUR, Docker, etc.).\n\n### v2.1.0\n\n_Released on 2025-04-12_\n\n1. Enhancements\n   * Add an option to display absolute paths (`--path-mode=abs`)\n   * Add configuration path placeholder (`${config-path}`)\n   * Add `warn-unused` option for `fmt` command\n   * Colored diff for `fmt` command (`golangci-lint fmt --diff-colored`)\n2. New linters\n   * Add `funcorder` linter https://github.com/manuelarte/funcorder\n3. Linters new features or changes\n   * `errorlint`: from 1.7.1 to 1.8.0 (automatic error comparison and type assertion fixes)\n   * ⚠️ `goconst`: `ignore-strings` is deprecated and replaced by `ignore-string-values`\n   * `goconst`: from 1.7.1 to 1.8.1 (new options: `find-duplicates`, `eval-const-expressions`)\n   * `govet`: add `httpmux` analyzer\n   * `nilnesserr`: from 0.1.2 to 0.2.0 (detect more cases)\n   * `paralleltest`: from 1.0.10 to 1.0.14 (checks only `_test.go` files)\n   * `revive`: from 1.7.0 to 1.9.0 (support kebab case for setting names)\n   * `sloglint`: from 0.9.0 to 0.11.0 (autofix, new option `msg-style`, suggest `slog.DiscardHandler`)\n   * `wrapcheck`: from 2.10.0 to 2.11.0 (new option `report-internal-errors`)\n   * `wsl`: from 4.6.0 to 4.7.0 (cgo files are always excluded)\n4. Linters bug fixes\n   * `fatcontext`: from 0.7.1 to 0.7.2\n   * `gocritic`: fix `importshadow` checker\n   * `gosec`: from 2.22.2 to 2.22.3\n   * `ireturn`: from 0.3.1 to 0.4.0\n   * `loggercheck`: from 0.10.1 to 0.11.0\n   * `nakedret`: from 2.0.5 to 2.0.6\n   * `nonamedreturns`: from 1.0.5 to 1.0.6\n   * `protogetter`: from 0.3.12 to 0.3.13\n   * `testifylint`: from 1.6.0 to 1.6.1\n   * `unconvert`: update to HEAD\n5. Misc.\n   * Fixes memory leaks when using go1.(N) with golangci-lint built with go1.(N-X)\n   * Adds `golangci-lint-fmt` pre-commit hook\n6. Documentation\n   * Improvements\n   * Updates section about vscode integration\n\n### v2.0.2\n\n_Released on 2025-03-25_\n\n1. Misc.\n   * Fixes flags parsing for formatters\n   * Fixes the filepath used by the exclusion `source` option\n2. Documentation\n   * Adds a section about flags migration\n   * Cleaning pages with v1 options\n\n### v2.0.1\n\n_Released on 2025-03-24_\n\n1. Linters/formatters bug fixes\n   * `golines`: fix settings during linter load\n2. Misc.\n   * Validates the `version` field before the configuration\n   * `forbidigo`: fix migration\n\n### v2.0.0\n\n_Released on 2025-03-24_\n\n1. Enhancements\n   * 🌟 New `golangci-lint fmt` command with dedicated [formatter configuration](https://golangci-lint.run/docs/welcome/quick-start/#formatting)\n   * ♻️ New `golangci-lint migrate` command to help migration from v1 to v2 (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#command-migrate))\n   * ⚠️ New default values (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/))\n   * ⚠️ No exclusions by default (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#issuesexclude-use-default))\n   * ⚠️ New default sort order (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#outputsort-order))\n   * 🌟 New option `run.relative-path-mode` (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#runrelative-path-mode))\n   * 🌟 New linters configuration (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#linters))\n   * 🌟 New output format configuration (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#output))\n   * 🌟 New `--fast-only` flag (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#lintersfast))\n   * 🌟 New option `linters.exclusions.warn-unused` to log a warning if an exclusion rule is unused.\n2. New linters/formatters\n   * Add `golines` formatter https://github.com/segmentio/golines\n3. Linters new features\n   * ⚠️ Merge `staticcheck`, `stylecheck`, `gosimple` into one linter (`staticcheck`) (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#lintersenablestylecheckgosimplestaticcheck))\n   * `gocritic`: from 0.12.0 to 0.13.0\n   * `gomodguard`: from 1.3.5 to 1.4.1 (block explicit indirect dependencies)\n   * `nilnil`: from 1.0.1 to 1.1.0 (new option: `only-two`)\n   * `perfsprint`: from 0.8.2 to 0.9.1 (checker name in the diagnostic message)\n   * `staticcheck`: new `quickfix` set of rules\n   * `testifylint`: from 1.5.2 to 1.6.0 (new options: `equal-values`, `suite-method-signature`, `require-string-msg`)\n   * `wsl`: from 4.5.0 to 4.6.0 (new option: `allow-cuddle-used-in-block`)\n4. Linters bug fixes\n   * `bidichk`: from 0.3.2 to 0.3.3\n   * `errchkjson`: from 0.4.0 to 0.4.1\n   * `errname`: from 1.0.0 to 1.1.0\n   * `funlen`: fix `ignore-comments` option\n   * `gci`: from 0.13.5 to 0.13.6\n   * `gosmopolitan`: from 1.2.2 to 1.3.0\n   * `inamedparam`: from 0.1.3 to 0.2.0\n   * `intrange`: from 0.3.0 to 0.3.1\n   * `protogetter`: from 0.3.9 to 0.3.12\n   * `unparam`: from 8a5130ca722f to 0df0534333a4\n5. Misc.\n   * 🧹 Configuration options renaming (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/))\n   * 🧹 Remove options (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/))\n   * 🧹 Remove flags (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/))\n   * 🧹 Remove alternative names (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/#alternative-linter-names))\n   * 🧹 Remove or replace deprecated elements (cf. [Migration guide](https://golangci-lint.run/docs/product/migration-guide/))\n   * Adds an option to display some commands as JSON:\n     * `golangci-lint config path --json`\n     * `golangci-lint help linters --json`\n     * `golangci-lint help formatters --json`\n     * `golangci-lint linters --json`\n     * `golangci-lint formatters --json`\n     * `golangci-lint version --json`\n6. Documentation\n   * [Migration guide](https://golangci-lint.run/docs/product/migration-guide/)\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>."
  },
  {
    "path": "Makefile",
    "content": ".DEFAULT_GOAL = test\n.PHONY: FORCE\n\n# enable consistent Go 1.12/1.13 GOPROXY behavior.\nexport GOPROXY = https://proxy.golang.org\n\nBINARY = golangci-lint\nifeq ($(OS),Windows_NT)\n\tBINARY := $(BINARY).exe\nendif\n\n# Build\n\nbuild: $(BINARY)\n.PHONY: build\n\nbuild_race:\n\tgo build -race -o $(BINARY) ./cmd/golangci-lint\n.PHONY: build_race\n\nclean:\n\trm -f $(BINARY)\n\trm -f test/path\n\trm -f tools/Dracula.itermcolors\n\trm -f tools/svg-term\n\trm -rf tools/node_modules\n.PHONY: clean\n\n# Test\ntest: export GOLANGCI_LINT_INSTALLED = true\ntest: CGO_ENABLED=1\ntest: build\n\tGL_TEST_RUN=1 ./$(BINARY) run -v\n\tGL_TEST_RUN=1 go test -v -parallel 2 ./...\n.PHONY: test\n\ntest_race: build_race\n\tGL_TEST_RUN=1 ./$(BINARY) run -v --timeout=5m\n.PHONY: test_race\n\n# ex: T=output.go make test_integration\n# the value of `T` is the name of a file from `test/testdata`\ntest_integration:\n\tGL_TEST_RUN=1 go test -v ./test -count 1 -run TestSourcesFromTestdata/$T\n.PHONY: test_integration\n\n# ex: T=multiple-issues-fix.go make test_integration_fix\n# the value of `T` is the name of a file from `test/testdata/fix`\ntest_integration_fix: build\n\tGL_TEST_RUN=1 go test -v ./test -count 1 -run TestFix/$T\n.PHONY: test_integration_fix\n\n# Maintenance\n\nfast_generate: assets/github-action-config.json\n.PHONY: fast_generate\n\nfast_check_generated:\n\t$(MAKE) --always-make fast_generate\n\tgit checkout -- go.mod go.sum # can differ between go1.16 and go1.17\n\tgit diff --exit-code # check no changes\n\n# Migration\n\nclone_config:\n\tgo run ./pkg/commands/internal/migrate/cloner/\n\n# Benchmark\n\n# Benchmark with a local version\n# LINTER=gosec VERSION=v1.59.0 make bench_local\nbench_local: hyperfine\n\t@:$(call check_defined, LINTER VERSION, 'missing parameter(s)')\n\t@./scripts/bench/bench_local.sh $(LINTER) $(VERSION)\n.PHONY: bench_local\n\n# Benchmark between 2 existing versions\n# make bench_version LINTER=gosec VERSION_OLD=v1.58.2 VERSION_NEW=v1.59.0\nbench_version: hyperfine\n\t@:$(call check_defined, LINTER VERSION_OLD VERSION_NEW, 'missing parameter(s)')\n\t@./scripts/bench/bench_version.sh $(LINTER) $(VERSION_OLD) $(VERSION_NEW)\n.PHONY: bench_version\n\nhyperfine:\n\t@which hyperfine > /dev/null || (echo \"Please install hyperfine https://github.com/sharkdp/hyperfine#installation\" && exit 1)\n.PHONY: hyperfine\n\n# Non-PHONY targets (real files)\n\n$(BINARY): FORCE\n\tgo build -o $@ ./cmd/golangci-lint\n\nassets/github-action-config.json: FORCE $(BINARY)\n\t# go run ./scripts/gen_github_action_config/main.go $@\n\tcd ./scripts/gen_github_action_config/; go run . ../../$@\n\ngo.mod: FORCE\n\tgo mod tidy\n\tgo mod verify\ngo.sum: go.mod\n\n# Documentation\n\ndocs_serve: website_expand_templates\n\t@make -C ./docs serve\n.PHONY: docs_serve\n\ndocs_clean:\n\t@make -C ./docs clean\n.PHONY: docs_clean\n\ndocs_build: website_copy_install_sh website_copy_jsonschema website_expand_templates\n\t@make -C ./docs build\n.PHONY: docs_build\n\ndocs/static/demo.gif: FORCE\n\tvhs docs/golangci-lint.tape\n\nwebsite_copy_jsonschema:\n\t go run ./scripts/website/copy_jsonschema/\n.PHONY: website_copy_jsonschema\n\nwebsite_copy_install_sh:\n\t cp install.sh ./docs/static/\n.PHONY: website_copy_install_sh\n\nwebsite_expand_templates:\n\tgo run ./scripts/website/expand_templates/\n.PHONY: website_expand_templates\n\nwebsite_dump_info:\n\tgo run ./scripts/website/dump_info/\n.PHONY: website_dump_info\n\n# Functions\n\n# Check that given variables are set and all have non-empty values,\n# die with an error otherwise.\n#\n# Params:\n#   1. Variable name(s) to test.\n#   2. (optional) Error message to print.\n#\n# https://stackoverflow.com/a/10858332/8228109\ncheck_defined = \\\n    $(strip $(foreach 1,$1, \\\n        $(call __check_defined,$1,$(strip $(value 2)))))\n__check_defined = \\\n    $(if $(value $1),, \\\n      $(error Undefined $1$(if $2, ($2))))\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img alt=\"golangci-lint logo\" src=\"assets/go.png\" height=\"150\" />\n  <h3 align=\"center\">golangci-lint</h3>\n  <p align=\"center\">Fast linters runner for Go</p>\n</p>\n\n---\n\n`golangci-lint` is a fast Go linters runner.\n\nIt runs linters in parallel, uses caching, supports YAML configuration,\nintegrates with all major IDEs, and includes over a hundred linters.\n\n## Install `golangci-lint`\n\n- [On my machine](https://golangci-lint.run/docs/welcome/install/local);\n- [On CI/CD systems](https://golangci-lint.run/docs/welcome/install/ci).\n\n## Documentation\n\nDocumentation is hosted at https://golangci-lint.run.\n\n## Social Networks\n\n[![Join Slack](https://img.shields.io/badge/Slack-4285F4?logo=slack&logoColor=white)](https://gophers.slack.com/archives/CS0TBRKPC)\n[![Follow on Mastodon](https://img.shields.io/badge/Mastodon-6364FF?logo=mastodon&logoColor=white)](https://fosstodon.org/@golangcilint)\n[![Follow on Bluesky](https://img.shields.io/badge/Bluesky-0a7aff?logo=bluesky&logoColor=white)](https://bsky.app/profile/golangci-lint.run)\n[![Follow on Twitter](https://img.shields.io/badge/Twitter-1DA1F2?logo=x&logoColor=white)](https://twitter.com/golangci)\n\n## Support Us\n\n`golangci-lint` is a free and open-source project built by volunteers.\n\nIf you value it, consider supporting us, we appreciate it! :heart:\n\n[![Golangci-lint](https://img.shields.io/badge/Support-golangci_lint-blue?style=for-the-badge)](https://donate.golangci.org)\n[![Linter Authors](https://img.shields.io/badge/Support-Linter_Authors-blue?style=for-the-badge)](https://golangci-lint.run/docs/product/thanks/)\n\n## Badges\n\n![Build Status](https://github.com/golangci/golangci-lint/workflows/CI/badge.svg)\n[![License](https://img.shields.io/github/license/golangci/golangci-lint)](/LICENSE)\n[![Release](https://img.shields.io/github/release/golangci/golangci-lint.svg)](https://github.com/golangci/golangci-lint/releases/latest)\n[![Docker](https://img.shields.io/docker/pulls/golangci/golangci-lint)](https://hub.docker.com/r/golangci/golangci-lint)\n[![GitHub Releases Stats of golangci-lint](https://img.shields.io/github/downloads/golangci/golangci-lint/total.svg?logo=github)](https://somsubhra.github.io/github-release-stats/?username=golangci&repository=golangci-lint)\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [How to contribute](https://golangci-lint.run/docs/contributing/).\n\n<a href=\"https://github.com/golangci/golangci-lint/graphs/contributors\">\n  <img src=\"https://opencollective.com/golangci-lint/contributors.svg?width=890&button=false&skip=golangcidev,CLAassistant,renovate,fossabot,golangcibot,kortschak,golangci-releaser,dependabot%5Bbot%5D\" />\n</a>\n\n## Sponsors\n\n<p>&nbsp;</p>\n<p float=\"left\">\n  <a href=\"https://www.jetbrains.com/go/?utm_source=OSS&utm_medium=referral&utm_campaign=golangci\" target=\"_blank\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"assets/goland-white.svg\">\n      <source media=\"(prefers-color-scheme: light)\" srcset=\"assets/goland.svg\">\n      <img alt=\"The complete IDE crafted for professional Go developers.\" src=\"assets/goland.svg\" width=\"150\" />\n    </picture>\n  </a>\n</p>\n\n## Stargazers over time\n\n[![Stargazers over time](https://starchart.cc/golangci/golangci-lint.svg?variant=adaptive)](https://starchart.cc/golangci/golangci-lint)\n"
  },
  {
    "path": "assets/github-action-config-v1.json",
    "content": "{\n  \"MinorVersionToConfig\": {\n    \"latest\": {\n      \"TargetVersion\": \"v1.64.8\"\n    },\n    \"v1.10\": {\n      \"Error\": \"golangci-lint version 'v1.10' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.11\": {\n      \"Error\": \"golangci-lint version 'v1.11' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.12\": {\n      \"Error\": \"golangci-lint version 'v1.12' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.13\": {\n      \"Error\": \"golangci-lint version 'v1.13' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.14\": {\n      \"Error\": \"golangci-lint version 'v1.14' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.15\": {\n      \"Error\": \"golangci-lint version 'v1.15' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.16\": {\n      \"Error\": \"golangci-lint version 'v1.16' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.17\": {\n      \"Error\": \"golangci-lint version 'v1.17' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.18\": {\n      \"Error\": \"golangci-lint version 'v1.18' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.19\": {\n      \"Error\": \"golangci-lint version 'v1.19' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.20\": {\n      \"Error\": \"golangci-lint version 'v1.20' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.21\": {\n      \"Error\": \"golangci-lint version 'v1.21' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.22\": {\n      \"Error\": \"golangci-lint version 'v1.22' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.23\": {\n      \"Error\": \"golangci-lint version 'v1.23' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.24\": {\n      \"Error\": \"golangci-lint version 'v1.24' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.25\": {\n      \"Error\": \"golangci-lint version 'v1.25' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.26\": {\n      \"Error\": \"golangci-lint version 'v1.26' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.27\": {\n      \"Error\": \"golangci-lint version 'v1.27' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.28\": {\n      \"TargetVersion\": \"v1.28.3\"\n    },\n    \"v1.29\": {\n      \"TargetVersion\": \"v1.29.0\"\n    },\n    \"v1.3\": {\n      \"Error\": \"golangci-lint version 'v1.3' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.30\": {\n      \"TargetVersion\": \"v1.30.0\"\n    },\n    \"v1.31\": {\n      \"TargetVersion\": \"v1.31.0\"\n    },\n    \"v1.32\": {\n      \"TargetVersion\": \"v1.32.2\"\n    },\n    \"v1.33\": {\n      \"TargetVersion\": \"v1.33.2\"\n    },\n    \"v1.34\": {\n      \"TargetVersion\": \"v1.34.1\"\n    },\n    \"v1.35\": {\n      \"TargetVersion\": \"v1.35.2\"\n    },\n    \"v1.36\": {\n      \"TargetVersion\": \"v1.36.0\"\n    },\n    \"v1.37\": {\n      \"TargetVersion\": \"v1.37.1\"\n    },\n    \"v1.38\": {\n      \"TargetVersion\": \"v1.38.0\"\n    },\n    \"v1.39\": {\n      \"TargetVersion\": \"v1.39.0\"\n    },\n    \"v1.4\": {\n      \"Error\": \"golangci-lint version 'v1.4' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.40\": {\n      \"TargetVersion\": \"v1.40.1\"\n    },\n    \"v1.41\": {\n      \"TargetVersion\": \"v1.41.1\"\n    },\n    \"v1.42\": {\n      \"TargetVersion\": \"v1.42.1\"\n    },\n    \"v1.43\": {\n      \"TargetVersion\": \"v1.43.0\"\n    },\n    \"v1.44\": {\n      \"TargetVersion\": \"v1.44.2\"\n    },\n    \"v1.45\": {\n      \"TargetVersion\": \"v1.45.2\"\n    },\n    \"v1.46\": {\n      \"TargetVersion\": \"v1.46.2\"\n    },\n    \"v1.47\": {\n      \"TargetVersion\": \"v1.47.3\"\n    },\n    \"v1.48\": {\n      \"TargetVersion\": \"v1.48.0\"\n    },\n    \"v1.49\": {\n      \"TargetVersion\": \"v1.49.0\"\n    },\n    \"v1.5\": {\n      \"Error\": \"golangci-lint version 'v1.5' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.50\": {\n      \"TargetVersion\": \"v1.50.1\"\n    },\n    \"v1.51\": {\n      \"TargetVersion\": \"v1.51.2\"\n    },\n    \"v1.52\": {\n      \"TargetVersion\": \"v1.52.2\"\n    },\n    \"v1.53\": {\n      \"TargetVersion\": \"v1.53.3\"\n    },\n    \"v1.54\": {\n      \"TargetVersion\": \"v1.54.2\"\n    },\n    \"v1.55\": {\n      \"TargetVersion\": \"v1.55.2\"\n    },\n    \"v1.56\": {\n      \"TargetVersion\": \"v1.56.2\"\n    },\n    \"v1.57\": {\n      \"TargetVersion\": \"v1.57.2\"\n    },\n    \"v1.58\": {\n      \"TargetVersion\": \"v1.58.2\"\n    },\n    \"v1.59\": {\n      \"TargetVersion\": \"v1.59.1\"\n    },\n    \"v1.6\": {\n      \"Error\": \"golangci-lint version 'v1.6' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.60\": {\n      \"TargetVersion\": \"v1.60.3\"\n    },\n    \"v1.61\": {\n      \"TargetVersion\": \"v1.61.0\"\n    },\n    \"v1.62\": {\n      \"TargetVersion\": \"v1.62.2\"\n    },\n    \"v1.63\": {\n      \"TargetVersion\": \"v1.63.4\"\n    },\n    \"v1.64\": {\n      \"TargetVersion\": \"v1.64.8\"\n    },\n    \"v1.7\": {\n      \"Error\": \"golangci-lint version 'v1.7' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.8\": {\n      \"Error\": \"golangci-lint version 'v1.8' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.9\": {\n      \"Error\": \"golangci-lint version 'v1.9' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v2.0\": {\n      \"Error\": \"golangci-lint version 'v2.0' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.1\": {\n      \"Error\": \"golangci-lint version 'v2.1' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.10\": {\n      \"Error\": \"golangci-lint version 'v2.10' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.11\": {\n      \"Error\": \"golangci-lint version 'v2.11' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.2\": {\n      \"Error\": \"golangci-lint version 'v2.2' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.3\": {\n      \"Error\": \"golangci-lint version 'v2.3' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.4\": {\n      \"Error\": \"golangci-lint version 'v2.4' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.5\": {\n      \"Error\": \"golangci-lint version 'v2.5' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.6\": {\n      \"Error\": \"golangci-lint version 'v2.6' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.7\": {\n      \"Error\": \"golangci-lint version 'v2.7' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.8\": {\n      \"Error\": \"golangci-lint version 'v2.8' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.9\": {\n      \"Error\": \"golangci-lint version 'v2.9' isn't supported: only v1 versions are supported\"\n    }\n  }\n}\n"
  },
  {
    "path": "assets/github-action-config-v2.json",
    "content": "{\n  \"MinorVersionToConfig\": {\n    \"latest\": {\n      \"TargetVersion\": \"v2.11.3\"\n    },\n    \"v1.10\": {\n      \"Error\": \"golangci-lint version 'v1.10' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.11\": {\n      \"Error\": \"golangci-lint version 'v1.11' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.12\": {\n      \"Error\": \"golangci-lint version 'v1.12' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.13\": {\n      \"Error\": \"golangci-lint version 'v1.13' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.14\": {\n      \"Error\": \"golangci-lint version 'v1.14' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.15\": {\n      \"Error\": \"golangci-lint version 'v1.15' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.16\": {\n      \"Error\": \"golangci-lint version 'v1.16' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.17\": {\n      \"Error\": \"golangci-lint version 'v1.17' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.18\": {\n      \"Error\": \"golangci-lint version 'v1.18' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.19\": {\n      \"Error\": \"golangci-lint version 'v1.19' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.20\": {\n      \"Error\": \"golangci-lint version 'v1.20' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.21\": {\n      \"Error\": \"golangci-lint version 'v1.21' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.22\": {\n      \"Error\": \"golangci-lint version 'v1.22' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.23\": {\n      \"Error\": \"golangci-lint version 'v1.23' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.24\": {\n      \"Error\": \"golangci-lint version 'v1.24' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.25\": {\n      \"Error\": \"golangci-lint version 'v1.25' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.26\": {\n      \"Error\": \"golangci-lint version 'v1.26' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.27\": {\n      \"Error\": \"golangci-lint version 'v1.27' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.28\": {\n      \"Error\": \"golangci-lint version 'v1.28' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.29\": {\n      \"Error\": \"golangci-lint version 'v1.29' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.3\": {\n      \"Error\": \"golangci-lint version 'v1.3' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.30\": {\n      \"Error\": \"golangci-lint version 'v1.30' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.31\": {\n      \"Error\": \"golangci-lint version 'v1.31' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.32\": {\n      \"Error\": \"golangci-lint version 'v1.32' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.33\": {\n      \"Error\": \"golangci-lint version 'v1.33' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.34\": {\n      \"Error\": \"golangci-lint version 'v1.34' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.35\": {\n      \"Error\": \"golangci-lint version 'v1.35' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.36\": {\n      \"Error\": \"golangci-lint version 'v1.36' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.37\": {\n      \"Error\": \"golangci-lint version 'v1.37' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.38\": {\n      \"Error\": \"golangci-lint version 'v1.38' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.39\": {\n      \"Error\": \"golangci-lint version 'v1.39' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.4\": {\n      \"Error\": \"golangci-lint version 'v1.4' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.40\": {\n      \"Error\": \"golangci-lint version 'v1.40' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.41\": {\n      \"Error\": \"golangci-lint version 'v1.41' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.42\": {\n      \"Error\": \"golangci-lint version 'v1.42' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.43\": {\n      \"Error\": \"golangci-lint version 'v1.43' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.44\": {\n      \"Error\": \"golangci-lint version 'v1.44' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.45\": {\n      \"Error\": \"golangci-lint version 'v1.45' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.46\": {\n      \"Error\": \"golangci-lint version 'v1.46' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.47\": {\n      \"Error\": \"golangci-lint version 'v1.47' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.48\": {\n      \"Error\": \"golangci-lint version 'v1.48' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.49\": {\n      \"Error\": \"golangci-lint version 'v1.49' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.5\": {\n      \"Error\": \"golangci-lint version 'v1.5' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.50\": {\n      \"Error\": \"golangci-lint version 'v1.50' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.51\": {\n      \"Error\": \"golangci-lint version 'v1.51' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.52\": {\n      \"Error\": \"golangci-lint version 'v1.52' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.53\": {\n      \"Error\": \"golangci-lint version 'v1.53' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.54\": {\n      \"Error\": \"golangci-lint version 'v1.54' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.55\": {\n      \"Error\": \"golangci-lint version 'v1.55' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.56\": {\n      \"Error\": \"golangci-lint version 'v1.56' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.57\": {\n      \"Error\": \"golangci-lint version 'v1.57' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.58\": {\n      \"Error\": \"golangci-lint version 'v1.58' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.59\": {\n      \"Error\": \"golangci-lint version 'v1.59' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.6\": {\n      \"Error\": \"golangci-lint version 'v1.6' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.60\": {\n      \"Error\": \"golangci-lint version 'v1.60' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.61\": {\n      \"Error\": \"golangci-lint version 'v1.61' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.62\": {\n      \"Error\": \"golangci-lint version 'v1.62' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.63\": {\n      \"Error\": \"golangci-lint version 'v1.63' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.64\": {\n      \"Error\": \"golangci-lint version 'v1.64' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.7\": {\n      \"Error\": \"golangci-lint version 'v1.7' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.8\": {\n      \"Error\": \"golangci-lint version 'v1.8' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.9\": {\n      \"Error\": \"golangci-lint version 'v1.9' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v2.0\": {\n      \"TargetVersion\": \"v2.0.2\"\n    },\n    \"v2.1\": {\n      \"TargetVersion\": \"v2.1.6\"\n    },\n    \"v2.10\": {\n      \"TargetVersion\": \"v2.10.1\"\n    },\n    \"v2.11\": {\n      \"TargetVersion\": \"v2.11.3\"\n    },\n    \"v2.2\": {\n      \"TargetVersion\": \"v2.2.2\"\n    },\n    \"v2.3\": {\n      \"TargetVersion\": \"v2.3.1\"\n    },\n    \"v2.4\": {\n      \"TargetVersion\": \"v2.4.0\"\n    },\n    \"v2.5\": {\n      \"TargetVersion\": \"v2.5.0\"\n    },\n    \"v2.6\": {\n      \"TargetVersion\": \"v2.6.2\"\n    },\n    \"v2.7\": {\n      \"TargetVersion\": \"v2.7.2\"\n    },\n    \"v2.8\": {\n      \"TargetVersion\": \"v2.8.0\"\n    },\n    \"v2.9\": {\n      \"TargetVersion\": \"v2.9.0\"\n    }\n  }\n}\n"
  },
  {
    "path": "assets/github-action-config.json",
    "content": "{\n  \"MinorVersionToConfig\": {\n    \"latest\": {\n      \"TargetVersion\": \"v1.64.8\"\n    },\n    \"v1.10\": {\n      \"Error\": \"golangci-lint version 'v1.10' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.11\": {\n      \"Error\": \"golangci-lint version 'v1.11' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.12\": {\n      \"Error\": \"golangci-lint version 'v1.12' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.13\": {\n      \"Error\": \"golangci-lint version 'v1.13' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.14\": {\n      \"Error\": \"golangci-lint version 'v1.14' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.15\": {\n      \"Error\": \"golangci-lint version 'v1.15' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.16\": {\n      \"Error\": \"golangci-lint version 'v1.16' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.17\": {\n      \"Error\": \"golangci-lint version 'v1.17' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.18\": {\n      \"Error\": \"golangci-lint version 'v1.18' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.19\": {\n      \"Error\": \"golangci-lint version 'v1.19' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.20\": {\n      \"Error\": \"golangci-lint version 'v1.20' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.21\": {\n      \"Error\": \"golangci-lint version 'v1.21' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.22\": {\n      \"Error\": \"golangci-lint version 'v1.22' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.23\": {\n      \"Error\": \"golangci-lint version 'v1.23' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.24\": {\n      \"Error\": \"golangci-lint version 'v1.24' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.25\": {\n      \"Error\": \"golangci-lint version 'v1.25' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.26\": {\n      \"Error\": \"golangci-lint version 'v1.26' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.27\": {\n      \"Error\": \"golangci-lint version 'v1.27' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.28\": {\n      \"TargetVersion\": \"v1.28.3\"\n    },\n    \"v1.29\": {\n      \"TargetVersion\": \"v1.29.0\"\n    },\n    \"v1.3\": {\n      \"Error\": \"golangci-lint version 'v1.3' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.30\": {\n      \"TargetVersion\": \"v1.30.0\"\n    },\n    \"v1.31\": {\n      \"TargetVersion\": \"v1.31.0\"\n    },\n    \"v1.32\": {\n      \"TargetVersion\": \"v1.32.2\"\n    },\n    \"v1.33\": {\n      \"TargetVersion\": \"v1.33.2\"\n    },\n    \"v1.34\": {\n      \"TargetVersion\": \"v1.34.1\"\n    },\n    \"v1.35\": {\n      \"TargetVersion\": \"v1.35.2\"\n    },\n    \"v1.36\": {\n      \"TargetVersion\": \"v1.36.0\"\n    },\n    \"v1.37\": {\n      \"TargetVersion\": \"v1.37.1\"\n    },\n    \"v1.38\": {\n      \"TargetVersion\": \"v1.38.0\"\n    },\n    \"v1.39\": {\n      \"TargetVersion\": \"v1.39.0\"\n    },\n    \"v1.4\": {\n      \"Error\": \"golangci-lint version 'v1.4' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.40\": {\n      \"TargetVersion\": \"v1.40.1\"\n    },\n    \"v1.41\": {\n      \"TargetVersion\": \"v1.41.1\"\n    },\n    \"v1.42\": {\n      \"TargetVersion\": \"v1.42.1\"\n    },\n    \"v1.43\": {\n      \"TargetVersion\": \"v1.43.0\"\n    },\n    \"v1.44\": {\n      \"TargetVersion\": \"v1.44.2\"\n    },\n    \"v1.45\": {\n      \"TargetVersion\": \"v1.45.2\"\n    },\n    \"v1.46\": {\n      \"TargetVersion\": \"v1.46.2\"\n    },\n    \"v1.47\": {\n      \"TargetVersion\": \"v1.47.3\"\n    },\n    \"v1.48\": {\n      \"TargetVersion\": \"v1.48.0\"\n    },\n    \"v1.49\": {\n      \"TargetVersion\": \"v1.49.0\"\n    },\n    \"v1.5\": {\n      \"Error\": \"golangci-lint version 'v1.5' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.50\": {\n      \"TargetVersion\": \"v1.50.1\"\n    },\n    \"v1.51\": {\n      \"TargetVersion\": \"v1.51.2\"\n    },\n    \"v1.52\": {\n      \"TargetVersion\": \"v1.52.2\"\n    },\n    \"v1.53\": {\n      \"TargetVersion\": \"v1.53.3\"\n    },\n    \"v1.54\": {\n      \"TargetVersion\": \"v1.54.2\"\n    },\n    \"v1.55\": {\n      \"TargetVersion\": \"v1.55.2\"\n    },\n    \"v1.56\": {\n      \"TargetVersion\": \"v1.56.2\"\n    },\n    \"v1.57\": {\n      \"TargetVersion\": \"v1.57.2\"\n    },\n    \"v1.58\": {\n      \"TargetVersion\": \"v1.58.2\"\n    },\n    \"v1.59\": {\n      \"TargetVersion\": \"v1.59.1\"\n    },\n    \"v1.6\": {\n      \"Error\": \"golangci-lint version 'v1.6' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.60\": {\n      \"TargetVersion\": \"v1.60.3\"\n    },\n    \"v1.61\": {\n      \"TargetVersion\": \"v1.61.0\"\n    },\n    \"v1.62\": {\n      \"TargetVersion\": \"v1.62.2\"\n    },\n    \"v1.63\": {\n      \"TargetVersion\": \"v1.63.4\"\n    },\n    \"v1.64\": {\n      \"TargetVersion\": \"v1.64.8\"\n    },\n    \"v1.7\": {\n      \"Error\": \"golangci-lint version 'v1.7' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.8\": {\n      \"Error\": \"golangci-lint version 'v1.8' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.9\": {\n      \"Error\": \"golangci-lint version 'v1.9' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v2.0\": {\n      \"Error\": \"golangci-lint version 'v2.0' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.1\": {\n      \"Error\": \"golangci-lint version 'v2.1' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.10\": {\n      \"Error\": \"golangci-lint version 'v2.10' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.11\": {\n      \"Error\": \"golangci-lint version 'v2.11' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.2\": {\n      \"Error\": \"golangci-lint version 'v2.2' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.3\": {\n      \"Error\": \"golangci-lint version 'v2.3' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.4\": {\n      \"Error\": \"golangci-lint version 'v2.4' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.5\": {\n      \"Error\": \"golangci-lint version 'v2.5' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.6\": {\n      \"Error\": \"golangci-lint version 'v2.6' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.7\": {\n      \"Error\": \"golangci-lint version 'v2.7' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.8\": {\n      \"Error\": \"golangci-lint version 'v2.8' isn't supported: only v1 versions are supported\"\n    },\n    \"v2.9\": {\n      \"Error\": \"golangci-lint version 'v2.9' isn't supported: only v1 versions are supported\"\n    }\n  }\n}\n"
  },
  {
    "path": "build/buildx-alpine.Dockerfile",
    "content": "# syntax=docker/dockerfile:1.4\nFROM golang:1.26-alpine\n\nARG TARGETPLATFORM\n\n# related to https://github.com/golangci/golangci-lint/issues/3107\nENV GOROOT /usr/local/go\n\n# Allow to download a more recent version of Go.\n# https://go.dev/doc/toolchain\n# GOTOOLCHAIN=auto is shorthand for GOTOOLCHAIN=local+auto\nENV GOTOOLCHAIN auto\n\n# gcc is required to support cgo;\n# git and mercurial are needed most times for go get`, etc.\n# See https://github.com/docker-library/golang/issues/80\nRUN apk --no-cache add gcc musl-dev git mercurial\n\n# Set all directories as safe\nRUN git config --global --add safe.directory '*'\n\nCOPY $TARGETPLATFORM/golangci-lint /usr/bin/\nCMD [\"golangci-lint\"]\n"
  },
  {
    "path": "build/buildx.Dockerfile",
    "content": "# syntax=docker/dockerfile:1.4\nFROM golang:1.26\n\nARG TARGETPLATFORM\n\n# related to https://github.com/golangci/golangci-lint/issues/3107\nENV GOROOT /usr/local/go\n\n# Allow to download a more recent version of Go.\n# https://go.dev/doc/toolchain\n# GOTOOLCHAIN=auto is shorthand for GOTOOLCHAIN=local+auto\nENV GOTOOLCHAIN auto\n\n# Set all directories as safe\nRUN git config --global --add safe.directory '*'\n\nCOPY $TARGETPLATFORM/golangci-lint /usr/bin/\nCMD [\"golangci-lint\"]\n"
  },
  {
    "path": "cmd/golangci-lint/main.go",
    "content": "package main\n\nimport (\n\t\"cmp\"\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"runtime/debug\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n)\n\nvar (\n\tgoVersion = \"unknown\"\n\n\t// Populated by goreleaser during build\n\tversion = \"unknown\"\n\tcommit  = \"?\"\n\tdate    = \"\"\n)\n\nfunc main() {\n\tinfo := createBuildInfo()\n\n\tif err := commands.Execute(info); err != nil {\n\t\t_, _ = fmt.Fprintf(os.Stderr, \"The command is terminated due to an error: %v\\n\", err)\n\t\tos.Exit(exitcodes.Failure)\n\t}\n}\n\nfunc createBuildInfo() commands.BuildInfo {\n\tinfo := commands.BuildInfo{\n\t\tCommit:    commit,\n\t\tVersion:   version,\n\t\tGoVersion: goVersion,\n\t\tDate:      date,\n\t}\n\n\tbuildInfo, available := debug.ReadBuildInfo()\n\tif !available {\n\t\treturn info\n\t}\n\n\tinfo.GoVersion = buildInfo.GoVersion\n\n\tif date != \"\" {\n\t\treturn info\n\t}\n\n\tinfo.Version = buildInfo.Main.Version\n\n\tmatched, _ := regexp.MatchString(`v\\d+\\.\\d+\\.\\d+`, buildInfo.Main.Version)\n\tif matched {\n\t\tinfo.Version = strings.TrimPrefix(buildInfo.Main.Version, \"v\")\n\t}\n\n\tvar revision string\n\tvar modified string\n\tfor _, setting := range buildInfo.Settings {\n\t\t// The `vcs.xxx` information is only available with `go build`.\n\t\t// This information is not available with `go install` or `go run`.\n\t\tswitch setting.Key {\n\t\tcase \"vcs.time\":\n\t\t\tinfo.Date = setting.Value\n\t\tcase \"vcs.revision\":\n\t\t\trevision = setting.Value\n\t\tcase \"vcs.modified\":\n\t\t\tmodified = setting.Value\n\t\t}\n\t}\n\n\tinfo.Date = cmp.Or(info.Date, \"(unknown)\")\n\n\tinfo.Commit = fmt.Sprintf(\"(%s, modified: %s, mod sum: %q)\",\n\t\tcmp.Or(revision, \"unknown\"), cmp.Or(modified, \"?\"), buildInfo.Main.Sum)\n\n\treturn info\n}\n"
  },
  {
    "path": "cmd/golangci-lint/plugins.go",
    "content": "package main\n\n// This file is used to declare module plugins.\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "### Hugo files\n.hugo_build.lock\npublic/\nresources/\n\n# Copy of install.sh\n/static/install.sh\n\n### Generated files\n\n# Generated by /scripts/copy_jsonschema\n/static/jsonschema/\n\n# Generated by /scripts/expand_templates\ndata/version.json\ndata/formatter_settings.json\ndata/linter_settings.json\n.tmp/\n"
  },
  {
    "path": "docs/Makefile",
    "content": ".PHONY: default clean serve build\n\ndefault: clean serve\n\nclean:\n\trm -rf public/\n\nserve: clean\n\thugo server --disableFastRender --buildDrafts --enableGitInfo\n\n# IMPORTANT used by the CI to deploy documentation\nbuild: clean\n\tHUGO_ENVIRONMENT=production \\\n\tHUGO_ENV=production \\\n\thugo \\\n\t\t--gc --minify \\\n\t\t--baseURL \"https://golangci-lint.run/\"\n"
  },
  {
    "path": "docs/archetypes/default.md",
    "content": "---\ndate: '{{ .Date }}'\ndraft: true\ntitle: '{{ replace .File.ContentBaseName \"-\" \" \" | title }}'\n---\n"
  },
  {
    "path": "docs/assets/css/custom.css",
    "content": ":root {\n  --primary-hue: 187deg;\n  --primary-saturation: 54.4%;\n  --primary-lightness: 57.8%;\n}\n\n/* Allow card subtitle with more than 3 lines */\n.hx\\:line-clamp-3.hextra-card-subtitle {\n  -webkit-line-clamp: 30;\n}\n\n.author-cards {\n    grid-template-columns: repeat(auto-fill, minmax(max(150px, calc((100% - 1rem * 4) / var(--hextra-cards-grid-cols))), 1fr));\n}\n\n.support-cards {\n    grid-template-columns: repeat(auto-fill, minmax(max(200px, calc((100% - 1rem * 4) / var(--hextra-cards-grid-cols))), 1fr));\n}\n\n.support-cards .hextra-card-image {\n    margin: 2rem;\n}\n\n.gl-hidden {\n    display: none;\n}\n\n.hextra-nav-container a[title=\"Support us\"] {\n    transition: ease-in-out 0.2s;\n}\n\n.hextra-nav-container a[title=\"Support us\"]:hover  {\n    transform: scale(1.3, 1.3);\n}\n\n.hextra-footer .social-media {\n    transition: ease-in-out 0.2s;\n}\n\n.hextra-footer .social-media :hover{\n    transform: translateY(-2px);\n}\n\n.hextra-banner {\n    background: #833AB4;\n    background: linear-gradient(90deg,rgba(131, 58, 180, 1) 0%, rgba(253, 29, 29, 1) 50%, rgba(252, 176, 69, 1) 100%);\n    /*color: var(--hx-color-slate-900);*/\n}\n\n.extra-banner-close-button {\n    color: var(--hx-color-slate-50);\n}\n"
  },
  {
    "path": "docs/content/_index.md",
    "content": "---\ntitle: 'Golangci-lint'\nlayout: hextra-home\nparams:\n  width: wide\n---\n\n{{< hextra/hero-container image=\"images/golangci-lint-logo-anim.gif\" imageWidth=\"300\" imageHeight=\"300\" imageTitle=\"golangci-lint\" >}}\n\n<div class=\"hx:mt-6 hx:mb-6\">\n{{< hextra/hero-headline >}}\n  Golangci-lint is a fast linters runner for Go\n{{< /hextra/hero-headline >}}\n</div>\n\n<div class=\"hx:mb-12\">\n{{< hextra/hero-subtitle >}}\n  It runs linters in parallel, uses caching, supports YAML configuration,&nbsp;<br class=\"hx:sm:block hx:hidden\" />integrates with all major IDEs, and includes over a hundred linters.\n{{< /hextra/hero-subtitle >}}\n</div>\n\n<div class=\"hx:mb-6\">\n{{< hextra/hero-button text=\"Get Started\" link=\"docs\" >}}\n</div>\n\n{{< /hextra/hero-container >}}\n\n<div class=\"hx:mt-6\"></div>\n\n{{< hextra/feature-grid cols=3 >}}\n  {{< hextra/feature-card\n    icon=\"fast-forward\"\n    title=\"Fast\"\n    subtitle=\"Runs linters in parallel, reuses Go build cache and caches analysis results.\"\n    style=\"background: radial-gradient(ellipse at 50% 80%,rgba(194,97,254,0.15),hsla(0,0%,100%,0));\"\n    link=\"/docs/\" >}}\n  {{< hextra/feature-card\n    icon=\"desktop-computer\"\n    title=\"Integrations\"\n    subtitle=\"Integrations with VS Code, Sublime Text, GoLand, GNU Emacs, Vim, GitHub Actions.\"\n    style=\"background: radial-gradient(ellipse at 50% 80%,rgba(142,53,74,0.15),hsla(0,0%,100%,0));\"\n    link=\"/docs/welcome/integrations\" >}}\n  {{< hextra/feature-card\n    icon=\"sparkles\"\n    title=\"Nice outputs\"\n    subtitle=\"Text with colors and source code lines, JSON, tab, HTML, Checkstyle, Code-Climate, JUnit-XML, TeamCity, SARIF.\"\n    style=\"background: radial-gradient(ellipse at 50% 80%,rgba(221,210,59,0.15),hsla(0,0%,100%,0));\"\n    link=\"/docs/configuration/file/#output-configuration\" >}}\n  {{< hextra/feature-card\n    icon=\"eye-off\"\n    title=\"Minimum number of false positives\"\n    subtitle=\"Tuned default settings.\"\n    link=\"/docs/linters/false-positives\" >}}\n  {{< hextra/feature-card\n    icon=\"collection\"\n    title=\"A lot of linters\"\n    subtitle=\"No need to install them.\"\n    link=\"/docs/linters\" >}}\n  {{< hextra/feature-card\n    icon=\"document-text\"\n    title=\"YAML-based configuration\"\n    subtitle=\"Easy to read and maintain.\"\n    link=\"/docs/configuration/file\" >}}\n{{< /hextra/feature-grid >}}\n"
  },
  {
    "path": "docs/content/docs/_index.md",
    "content": "---\ntitle: 'Golangci-lint Documentation'\n---\n\n{{< hextra/hero-subtitle >}}\n  Everything you need to know for your golangci-lint journey.\n{{< /hextra/hero-subtitle >}}\n\n![golangci-lint demo](/images/demo.gif)\n\n{{< cards >}}\n{{< card\n    link=\"/docs/welcome/quick-start\"\n    title=\"Getting Started\"\n    subtitle=\"Get ready to use golangci-lint\"\n    icon=\"arrow-circle-right\" >}}\n{{< card\n    link=\"/docs/linters\"\n    title=\"Linters\"\n    subtitle=\"List of all the linters\"\n    icon=\"arrow-circle-right\" >}}\n{{< card\n    link=\"/docs/formatters\"\n    title=\"Formatters\"\n    subtitle=\"List of all the formatters\"\n    icon=\"arrow-circle-right\" >}}\n{{< /cards >}}\n\n## Support Us\n\nGolangci-lint is a free and open-source project built by volunteers.\n\nIf you value it, consider supporting us, we appreciate it!\n\n{{< golangci/button text=\"Donate ❤️\" link=\"/docs/donate\" >}}\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [How to contribute](/docs/contributing/workflow/).\n\n[![golangci-lint contributors](https://opencollective.com/golangci-lint/contributors.svg?width=890&button=false&skip=golangcidev,CLAassistant,renovate,fossabot,golangcibot,kortschak,golangci-releaser,dependabot%5Bbot%5D)](https://github.com/golangci/golangci-lint/graphs/contributors)\n\n## Stargazers over time\n\n{{< golangci/starcharts repo=\"golangci/golangci-lint\" >}}\n"
  },
  {
    "path": "docs/content/docs/configuration/_index.md",
    "content": "---\ntitle: Configuration\nweight: 2\naliases:\n  - /usage/configuration/\n---\n\nThe config file has lower priority than command-line options.\nIf the same bool/string/int option is provided on the command-line\nand in the config file, the option from command-line will be used.\nSlice options (e.g. list of enabled/disabled linters) are combined from the command-line and config file.\n\n## More\n\n{{< cards cols=2 >}}\n  {{< card link=\"/docs/configuration/cli\" title=\"Command Line\" icon=\"terminal\" >}}\n  {{< card link=\"/docs/configuration/file\" title=\"Configuration File\" icon=\"adjustments\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/configuration/cli.md",
    "content": "---\ntitle: Command-Line\nweight: 1\n---\n\n{{% golangci/cli-output %}}\n\n## `run`\n\n{{< cards >}}\n    {{< card link=\"/docs/linters\" title=\"Linters Overview\" icon=\"collection\" >}}\n    {{< card link=\"/docs/configuration/file/#linters-configuration\" title=\"Global Configuration\" icon=\"adjustments\" >}}\n    {{< card link=\"/docs/linters/configuration/\" title=\"Linter Settings\" icon=\"adjustments\" >}}\n{{< /cards >}}\n\n> [!NOTE]\n> This command executes enabled linters, and the formatters defined in [`formatters`](/docs/configuration/file/#formatters-configuration),\n> but it does not format the code.\n> \n> To only format code, use [`golangci-lint fmt`](/docs/configuration/cli/#fmt).\n> To apply both linter fixes and formatting, use `golangci-lint run --fix`. \n> \n> The formatters cannot be enabled or disabled inside the [`linters`](/docs/configuration/file/#linters-configuration) section or the flags `-E/--enable`, `-D/--disable` of the command  [`golangci-lint run`](/docs/configuration/cli/#run).\n> \n> The formatters can be enabled/disabled by defining them inside the [`formatters`](/docs/configuration/file/#formatters-configuration) section or by using the flags `-E/--enable`, `-D/--disable` of command [`golangci-lint fmt`](/docs/configuration/cli/#fmt).\n\n{{% golangci/cli-output cmd=\"run\" %}}\n\nWhen the `--cpu-profile-path` or `--mem-profile-path` arguments are specified,\ngolangci-lint writes runtime profiling data in the format expected by the [pprof](https://github.com/google/pprof) visualization tool.\n\nWhen the `--trace-path` argument is specified, `golangci-lint` writes runtime tracing data in the format expected by\nthe `go tool trace` command and visualization tool.\n\n## fmt\n\n{{< cards >}}\n{{< card link=\"/docs/formatters\" title=\"Formatters Overview\" icon=\"collection\" >}}\n{{< card link=\"/docs/configuration/file/#formatters-configuration\" title=\"Global Configuration\" icon=\"adjustments\" >}}\n{{< card link=\"/docs/formatters/configuration/\" title=\"Formatter Settings\" icon=\"adjustments\" >}}\n{{< /cards >}}\n\n{{% golangci/cli-output cmd=\"fmt\" %}}\n\n## `migrate`\n\n{{% golangci/cli-output cmd=\"migrate\" %}}\n\n## `formatters`\n\n{{% golangci/cli-output cmd=\"formatters\" %}}\n\n## `help`\n\n{{% golangci/cli-output cmd=\"help\" %}}\n\n## `linters`\n\n{{% golangci/cli-output cmd=\"linters\" %}}\n\n## `cache`\n\nGolangci-lint stores its cache in the subdirectory `golangci-lint` inside the [default user cache directory](https://pkg.go.dev/os#UserCacheDir).\n\nYou can override the default cache directory with the environment variable `GOLANGCI_LINT_CACHE`; the path must be absolute.\n\nThe cache is only used by `golangci-lint run` (linters).\n\n{{% golangci/cli-output cmd=\"cache\" %}}\n\n## `config`\n\n{{% golangci/cli-output cmd=\"config\" %}}\n\n## `custom`\n\n{{% golangci/cli-output cmd=\"custom\" %}}\n\n## `version`\n\n{{% golangci/cli-output cmd=\"version\" %}}\n\n## `completion`\n\n{{% golangci/cli-output cmd=\"completion\" %}}\n"
  },
  {
    "path": "docs/content/docs/configuration/file.md",
    "content": "---\ntitle: Configuration File\nweight: 2\n---\n\nGolangci-lint looks for config files in the following paths from the current working directory:\n\n- `.golangci.yml`\n- `.golangci.yaml`\n- `.golangci.toml`\n- `.golangci.json`\n\nGolangci-lint also searches for config files in all directories from the directory of the first analyzed path up to the root.\nIf no configuration file has been found, golangci-lint will try to find one in your home directory.\nTo see which config file is being used and where it was sourced from run golangci-lint with `-v` option.\n\nConfig options inside the file are identical to command-line options.\nYou can configure specific linters' options only within the config file (not the command-line).\n\nThere is a [`.golangci.reference.yml`](https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.reference.yml) file with all supported options, their descriptions, and default values.\nThis file is neither a working example nor a recommended configuration,\nit's just a reference to display all the configuration options used to generate the documentation.\n\nThe configuration file can be validated with the JSON Schema: [golangci.jsonschema.json](https://golangci-lint.run/jsonschema/golangci.jsonschema.json)\n\n{{% golangci/configuration-file-snippet section=\"root\" %}}\n\n## `version` configuration\n\n{{% golangci/configuration-file-snippet section=\"version\" %}}\n\n## `linters` configuration\n\n{{< cards  cols=2 >}}\n{{< card link=\"/docs/linters\" title=\"Linters Overview\" icon=\"collection\" >}}\n{{< card link=\"/docs/linters/configuration\" title=\"Linters Settings\" icon=\"adjustments\" >}}\n{{< /cards >}}\n\n{{% golangci/configuration-file-snippet section=\"linters\" %}}\n\n## `formatters` configuration\n\n{{< cards  cols=2 >}}\n{{< card link=\"/docs/formatters\" title=\"Formatters Overview\" icon=\"collection\" >}}\n{{< card link=\"/docs/formatters/configuration\" title=\"Formatters Settings\" icon=\"adjustments\" >}}\n{{< /cards >}}\n\n{{% golangci/configuration-file-snippet section=\"formatters\" %}}\n\n## `issues` configuration\n\n{{% golangci/configuration-file-snippet section=\"issues\" %}}\n\n## `output` configuration\n\n{{% golangci/configuration-file-snippet section=\"output\" %}}\n\n## `run` configuration\n\n{{% golangci/configuration-file-snippet section=\"run\" %}}\n\n## `severity` configuration\n\n{{% golangci/configuration-file-snippet section=\"severity\" %}}\n"
  },
  {
    "path": "docs/content/docs/contributing/_index.md",
    "content": "---\ntitle: Contributing\nweight: 6\naliases:\n  - /contributing/quick-start/\n---\n\n{{< cards >}}\n  {{< card link=\"/docs/contributing/workflow/\" title=\"Contributing workflow\" icon=\"document-text\" >}}\n  {{< card link=\"/docs/contributing/architecture/\" title=\"Architecture of golangci-lint\" icon=\"code\" >}}\n  {{< card link=\"/docs/contributing/new-linters/\" title=\"How to add new linters\" icon=\"document-text\" >}}\n  {{< card link=\"/docs/contributing/debug/\" title=\"Debugging golangci-lint\" icon=\"code\" >}}\n  {{< card link=\"/docs/contributing/faq/\" title=\"FAQ\" icon=\"question-mark-circle\" >}}\n  {{< card link=\"/docs/contributing/website/\" title=\"Contributing to this website\" icon=\"globe\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/contributing/architecture.md",
    "content": "---\ntitle: Architecture\nweight: 3\naliases:\n  - /contributing/architecture/\n---\n\nThere are the following golangci-lint execution steps:\n\n```mermaid\ngraph LR\n    init[Init]\n    loadPackages[Load packages]\n    runLinters[Run linters]\n    postprocess[Postprocess issues]\n    print[Print issues]\n\n    init --> loadPackages --> runLinters --> postprocess --> print\n\n```\n\n## Init\n\nThe configuration is loaded from file and flags by `config.Loader` inside `PersistentPreRun` (or `PreRun`) of the commands that require configuration.\n\nThe linter database (`linterdb.Manager`) is fill based on the configuration:\n- The linters (\"internals\" and plugins) are built by `linterdb.LinterBuilder` and `linterdb.PluginBuilder` builders.\n- The configuration is validated by `linterdb.Validator`.\n\n## Load Packages\n\nLoading packages is listing all packages and their recursive dependencies for analysis.  \nAlso, depending on the enabled linters set some parsing of the source code can be performed at this step.\n\nPackages loading starts here:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/HEAD/\", filename=\"pkg/lint/package.go\"}\nfunc (l *PackageLoader) Load(ctx context.Context, linters []*linter.Config) (pkgs, deduplicatedPkgs []*packages.Package, err error) {\n\tloadMode := findLoadMode(linters)\n\n\tpkgs, err = l.loadPackages(ctx, loadMode)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to load packages: %w\", err)\n\t}\n// ...\n```\n\nFirst, we find a load mode as union of load modes for all enabled linters.\nWe use [go/packages](https://pkg.go.dev/golang.org/x/tools/go/packages) for packages loading and use its enum `packages.Need*` for load modes.\nLoad mode sets which data a linter needs for execution.\n\nA linter that works only with AST need minimum of information: only filenames and AST.\n\nThere is no need for packages dependencies or type information.\nAST is built during `go/analysis` execution to reduce memory usage.\nSuch AST-based linters are configured with the following code:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/lint/linter/config.go\"}\nfunc (lc *Config) WithLoadFiles() *Config {\n\tlc.LoadMode |= packages.NeedName | packages.NeedFiles | packages.NeedCompiledGoFiles\n\treturn lc\n}\n```\n\nIf a linter uses `go/analysis` and needs type information, we need to extract more data by `go/packages`:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/lint/linter/config.go\"}\nfunc (lc *Config) WithLoadForGoAnalysis() *Config {\n\tlc = lc.WithLoadFiles()\n\tlc.LoadMode |= packages.NeedImports | packages.NeedDeps | packages.NeedExportFile | packages.NeedTypesSizes\n\tlc.IsSlow = true\n\treturn lc\n}\n```\n\nAfter finding a load mode, we run `go/packages`: \nthe library get list of dirs (or `./...` as the default value) as input and outputs list of packages and requested information about them:\nfilenames, type information, AST, etc.\n\n## Run Linters\n\nFirst, we need to find all enabled linters. All linters are registered here:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/lint/lintersdb/builder_linter.go\"}\nfunc (b LinterBuilder) Build(cfg *config.Config) []*linter.Config {\n\t// ...\n\treturn []*linter.Config{\n\t\t// ...\n\t\tlinter.NewConfig(golinters.NewBodyclose()).\n\t\t\tWithSince(\"v1.18.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/timakin/bodyclose\"),\n\t\t// ...\n\t\tlinter.NewConfig(golinters.NewGovet(govetCfg)).\n\t\t\tWithGroups(config.GroupStandard).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://pkg.go.dev/cmd/vet\"),\n\t\t// ...\n\t}\n}\n```\n\nWe filter requested in config and command-line linters in `EnabledSet`:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/lint/lintersdb/manager.go\"}\nfunc (m *Manager) GetEnabledLintersMap() (map[string]*linter.Config, error)\n```\n\nWe merge enabled linters into one `MetaLinter` to improve execution time if we can:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/lint/lintersdb/manager.go\"}\n// GetOptimizedLinters returns enabled linters after optimization (merging) of multiple linters into a fewer number of linters.\n// E.g. some go/analysis linters can be optimized into one metalinter for data reuse and speed up.\nfunc (m *Manager) GetOptimizedLinters() ([]*linter.Config, error) {\n\t// ...\n\tm.combineGoAnalysisLinters(resultLintersSet)\n\t// ...\n}\n```\n\nThe `MetaLinter` just stores all merged linters inside to run them at once:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/goanalysis/metalinter.go\"}\ntype MetaLinter struct {\n\tlinters              []*Linter\n\tanalyzerToLinterName map[*analysis.Analyzer]string\n}\n```\n\nCurrently, all linters except `unused` can be merged into this meta linter.  \nThe `unused` isn't merged because it has high memory usage.\n\nLinters execution starts in `runAnalyzers`.\nIt's the most complex part of the golangci-lint.\nWe use custom [go/analysis](https://pkg.go.dev/golang.org/x/tools/go/analysis) runner there.  \nIt runs as much as it can in parallel.\nIt lazy-loads as much as it can to reduce memory usage.\nAlso, it sets all heavyweight data to `nil` as becomes unneeded to save memory.\n\nWe don't use existing [multichecker](https://pkg.go.dev/golang.org/x/tools/go/analysis/multichecker) because\nit doesn't use caching and doesn't have some important performance optimizations.\n\nAll found by linters issues are represented with `result.Issue` struct:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/result/issue.go\"}\ntype Issue struct {\n\tFromLinter string\n\tText       string\n\n\tSeverity string\n\n\t// Source lines of a code with the issue to show\n\tSourceLines []string\n\n\t// Pkg is needed for proper caching of linting results\n\tPkg *packages.Package `json:\"-\"`\n\n\tPos token.Position\n\n\tLineRange *Range `json:\",omitempty\"`\n\n\t// HunkPos is used only when golangci-lint is run over a diff\n\tHunkPos int `json:\",omitempty\"`\n\n\t// If we know how to fix the issue we can provide replacement lines\n\tSuggestedFixes []analysis.SuggestedFix `json:\",omitempty\"`\n\n\t// If we are expecting a nolint (because this is from nolintlint), record the expected linter\n\tExpectNoLint         bool\n\tExpectedNoLintLinter string\n\n\t// ...\n}\n```\n\n## Postprocess Issues\n\nWe have an abstraction of `result.Processor` to postprocess found issues:\n\n<!--\n$ tree -L 1 ./pkg/result/processors/ | grep -v test\n-->\n\n{{< filetree/container >}}\n  {{< filetree/folder name=\"./pkg/result/processors/\" >}}\n\t{{< filetree/file name=\"cgo.go\" >}}\n\t{{< filetree/file name=\"diff.go\" >}}\n\t{{< filetree/file name=\"exclusion_generated_file_filter.go\" >}}\n\t{{< filetree/file name=\"exclusion_generated_file_matcher.go\" >}}\n\t{{< filetree/file name=\"exclusion_paths.go\" >}}\n\t{{< filetree/file name=\"exclusion_presets.go\" >}}\n\t{{< filetree/file name=\"exclusion_rules.go\" >}}\n\t{{< filetree/file name=\"filename_unadjuster.go\" >}}\n\t{{< filetree/file name=\"fixer.go\" >}}\n\t{{< filetree/file name=\"identifier_marker.go\" >}}\n\t{{< filetree/file name=\"invalid_issue.go\" >}}\n\t{{< filetree/file name=\"issues.go\" >}}\n\t{{< filetree/file name=\"max_from_linter.go\" >}}\n\t{{< filetree/file name=\"max_per_file_from_linter.go\" >}}\n\t{{< filetree/file name=\"max_same_issues.go\" >}}\n\t{{< filetree/file name=\"nolint_filter.go\" >}}\n\t{{< filetree/file name=\"path_absoluter.go\" >}}\n\t{{< filetree/file name=\"path_prettifier.go\" >}}\n\t{{< filetree/file name=\"path_relativity.go\" >}}\n\t{{< filetree/file name=\"path_shortener.go\" >}}\n\t{{< filetree/file name=\"processor.go\" >}}\n\t{{< filetree/file name=\"severity.go\" >}}\n\t{{< filetree/file name=\"sort_results.go\" >}}\n\t{{< filetree/file name=\"source_code.go\" >}}\n\t{{< filetree/file name=\"uniq_by_line.go\" >}}\n  {{< /filetree/folder >}}\n{{< /filetree/container >}}\n\nThe abstraction is simple:\n\n```go {base_url=\"https://github.com/golangci/golangci-lint/blob/main/\", filename=\"pkg/result/processors/processor.go\"}\ntype Processor interface {\n\tProcess(issues []*result.Issue) ([]*result.Issue, error)\n\tName() string\n\tFinish()\n}\n```\n\nA processor can hide issues (`nolint`, `exclude`) or change issues (`path_prettifier`).\n\n## Print Issues\n\nWe have an abstraction for printing found issues.\n\n<!--\n$ tree -L 1 ./pkg/printers/ | grep -v test\n-->\n\n{{< filetree/container >}}\n  {{< filetree/folder name=\"./pkg/printers/\" >}}\n    {{< filetree/file name=\"checkstyle.go\" >}}\n    {{< filetree/file name=\"codeclimate.go\" >}}\n    {{< filetree/file name=\"html.go\" >}}\n    {{< filetree/file name=\"json.go\" >}}\n    {{< filetree/file name=\"junitxml.go\" >}}\n    {{< filetree/file name=\"printer.go\" >}}\n    {{< filetree/file name=\"sarif.go\" >}}\n    {{< filetree/file name=\"tab.go\" >}}\n    {{< filetree/file name=\"teamcity.go\" >}}\n    {{< filetree/file name=\"text.go\" >}}\n  {{< /filetree/folder >}}\n{{< /filetree/container >}}\n"
  },
  {
    "path": "docs/content/docs/contributing/debug.md",
    "content": "---\ntitle: Debugging\nweight: 5\naliases:\n  - /contributing/debug/\n---\n\nYou can see a verbose output of linter by using `-v` option.\n\n```bash\ngolangci-lint run -v\n```\n\nIf you would like to see more detailed logs you can use the environment variable `GL_DEBUG`.  \nIts value is a list of debug tags.\n\nThe existing debug tags are documented in the following file: [/pkg/logutils/logutils.go](https://github.com/golangci/golangci-lint/blob/HEAD/pkg/logutils/logutils.go)\n\nFor example:\n\n```bash\nGL_DEBUG=\"loader,gocritic\" golangci-lint run\n```\n\n```bash\nGL_DEBUG=\"loader,env\" golangci-lint run\n```\n"
  },
  {
    "path": "docs/content/docs/contributing/faq.md",
    "content": "---\ntitle: FAQ\nweight: 6\naliases:\n  - /contributing/faq/\n---\n\n## How to add a new open-source linter to `golangci-lint`\n\nSee [there](/docs/contributing/new-linters#how-to-add-a-public-linter-to-golangci-lint).\n\n## How to add a new private linter to `golangci-lint`\n\nSee [there](/docs/contributing/new-linters#how-to-add-a-private-linter-to-golangci-lint).\n\n## How to update an existing linter\n\nWe use [Dependabot](https://github.com/golangci/golangci-lint/blob/HEAD/.github/dependabot.yml) to update dependencies, including linters.  \nThe updates happen automatically at least once a week (Sunday 11am UTC).\n\nNo pull requests to update a linter will be accepted unless you are the author of the linter and specific changes are required.\n\n## How to add a configuration option to an existing linter\n\nAdd a new field to the [linter settings struct](https://github.com/golangci/golangci-lint/blob/HEAD/pkg/config/linters_settings.go).  \nDocument it in [.golangci.next.reference.yml](https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml).  \nPass it to the linter.\n\n## How to see `INFO` or `DEBUG` logs\n\nSee [tutorial about debugging](/docs/contributing/debug/).\n"
  },
  {
    "path": "docs/content/docs/contributing/new-linters.md",
    "content": "---\ntitle: New linters\nweight: 4\naliases:\n  - /contributing/new-linters/\n---\n\n## How to write a linter\n\nUse `go/analysis` and take a look at [this tutorial](https://web.archive.org/web/20250527152107/https://disaev.me/p/writing-useful-go-analysis-linter/):\nit shows how to write `go/analysis` linter from scratch and integrate it into `golangci-lint`.\n\n## How to add a public linter to `golangci-lint`\n\nYou need to implement a new linter using `go/analysis` API.\n\nWe don't accept non `go/analysis` linters.\n\nAfter that:\n\n1. Implement functional tests for the linter:\n    - Add one file into directory `pkg/golinters/{yourlintername}/testdata/`.\n2. Add a new file `pkg/golinters/{yourlintername}/{yourlintername}.go`.\n   Other linters implementation can help you.\n3. Add the new struct for the linter (which you've implemented in `pkg/golinters/{yourlintername}/{yourlintername}.go`) to the\n   list of all supported linters in [`pkg/lint/lintersdb/builder_linter.go`](https://github.com/golangci/golangci-lint/blob/HEAD/pkg/lint/lintersdb/builder_linter.go)\n   to the method `LinterBuilder.Build`.\n    - Add `WithSince(\"next_version\")`, where `next_version` must be replaced by the next minor version. (ex: v1.2.0 if the current version is v1.1.0)\n4. Find out what options do you need to configure for the linter.\n   For example, `nakedret` has only 1 option: [`max-func-lines`](https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.reference.yml).\n   Choose default values to not be annoying for users of golangci-lint. Add configuration options to:\n    - [.golangci.next.reference.yml](https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml): the example of a configuration file.\n      You can also add them to [.golangci.yml](https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.yml)\n      if you think that this project needs not default values.\n    - [config struct](https://github.com/golangci/golangci-lint/blob/HEAD/pkg/config/config.go):\n      don't forget about `mapstructure` tags for proper configuration files parsing.\n5. Take a look at the example of [pull requests with new linter support](https://github.com/golangci/golangci-lint/pulls?q=is%3Apr+is%3Amerged+label%3A%22linter%3A+new%22).\n6. Run the tests:\n    ```bash\n    go run ./cmd/golangci-lint/ run --no-config --default=none --enable={yourlintername} ./pkg/golinters/{yourlintername}/testdata/{yourlintername}.go\n    ```\n\n## How to add a private linter to `golangci-lint`\n\nSome people and organizations may choose to have custom-made linters run as a part of `golangci-lint`.  \nTypically, these linters can't be open-sourced or too specific.\n\nSuch linters can be added through 2 plugin systems:\n\n{{< cards cols=2 >}}\n  {{< card link=\"/docs/plugins/module-plugins\" title=\"Module Plugin System\" icon=\"puzzle\" tag=\"Recommended\" >}}\n  {{< card link=\"/docs/plugins/go-plugins\" title=\"Go Plugin System\" icon=\"puzzle\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/contributing/website.md",
    "content": "---\ntitle: This Website\nweight: 7\naliases:\n  - /contributing/website/\n---\n\n## Technology\n\nWe use [Hugo](https://gohugo.io/) for static site generation because sites built with it are very fast.\n\n## Source Code\n\nThe website lives in `docs/` directory of [golangci-lint repository](https://github.com/golangci/golangci-lint).\n\n## Theme\n\nThe site is based on [hextra](https://github.com/imfing/hextra) theme.\n\n## Templating\n\nWe use [shortcodes](https://gohugo.io/templates/types/#shortcode) and [partials](https://gohugo.io/templates/types/#partial) based on files from `./docs/.tmp/` and `./docs/data/`. \n\n- The files in `./docs/.tmp/` are used to be embedded with the shortcode `{{%/* golangci/embed file=\"filename.ext\" */%}}`.\n- The files in `./docs/data/` are used as [data sources](https://gohugo.io/content-management/data-sources/). \n\nThese files are created by running:\n\n- `make website_expand_templates` in the root of the repository.  \n- `make website_dump_info` in the root of the repository. (only during a release)\n\n### Some Notes\n\n[shortcodes](https://gohugo.io/templates/types/#shortcode):\n- cannot be used inside another shortcode\n- can only be used inside a page\n- can contain Markdown or HTML, but the tag is different: `{{%/* shortcode */%}}` vs `{{</* shortcode */>}}`\n\n[partials](https://gohugo.io/templates/types/#partial):\n- are reusable HTML blocks or \"functions\"\n- cannot be used inside a page\n- can be used inside another partial\n- can be used inside a shortcode\n- can be used inside a layout\n\n## Hosting\n\nWe use GitHub Pages for static website hosting and CD.\n\nGitHub deploys the website to production after merging anything to a `main` branch.\n\n## Local Testing\n\nInstall Hugo Extended (v0.148.1 or newer).\n\nRun:\n\n```bash\n# (in the root of the repository)\nmake docs_serve\n```\n\nor\n\n```bash\n# (in the root of the repository)\nmake website_expand_templates\n\ncd docs/\n\n# (inside the docs/ folder)\nmake serve\n```\n\nAnd navigate to `http://localhost:1313` after a successful build.\n\nThere is no need to restart the Hugo server for almost all changes: it supports hot reload.  \nAlso, there is no need to refresh a webpage: hot reload updates changed content on the open page.\n\n## Website Build\n\nTo do this, run:\n\n```bash\n# (in the root of the repository)\nmake docs_build\n```\nor\n\n```bash\n# (in the root of the repository)\nmake website_copy_jsonschema website_expand_templates\n\ncd docs/\n\n# (inside the docs/ folder)\nmake build\n```\n"
  },
  {
    "path": "docs/content/docs/contributing/workflow.md",
    "content": "---\ntitle: Workflow\nweight: 2\naliases:\n  - /contributing/workflow/\n---\n\nBy participating in this project, you agree to abide our [code of conduct](https://github.com/golangci/golangci-lint?tab=coc-ov-file).\n\n## Set up your machine\n\nGolangci-lint is written in [Go](https://go.dev).\n\nPrerequisites:\n\n- `make`\n- [Go](https://go.dev/doc/install)\n\nFork and clone [golangci-lint](https://github.com/golangci/golangci-lint) repository.\n\nA good way of making sure everything is all right is running the following:\n\n```bash\nmake build\n./golangci-lint run -v\n```\n\n## Test your change\n\nWhen you are satisfied with the changes, we suggest you run:\n\n```bash\nmake test\n```\n\nWhich runs all the linters and tests.\n\n## Create or update parameters for docs\n\nAdd your new or updated parameters to [.golangci.next.reference.yml](https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml) so they will be shown in the docs\n\n## Submit a pull request\n\nPush your branch to your golangci-lint fork and open a pull request against the\n`main` branch.\n\n## Pull request checks\n\nFirst, please, accept CLA - [CLA assistant](https://cla-assistant.io/) will make a comment on the pull request about it.\n\nAlso, we run a few checks in CI by using GitHub Actions, you can see them [here](https://github.com/golangci/golangci-lint/blob/HEAD/.github/workflows).\n\n## New releases\n\nFirst, see [our versioning policy](/docs/product/roadmap/#versioning-policy).\n\nTo make a new release create a tag `vX.Y.Z`.  \nDon't forget to add zero patch version for a new minor release, e.g. `v1.99.0`.\n\nA GitHub Action [workflow](https://github.com/golangci/golangci-lint/blob/HEAD/.github/workflows/release.yml) will start building and publishing release after that.\n\nAfter making a release, you need to update GitHub [Action config](https://github.com/golangci/golangci-lint/blob/HEAD/assets/github-action-config.json) by running:\n\n```bash\nmake assets/github-action-config.json\n```\n"
  },
  {
    "path": "docs/content/docs/donate/_index.md",
    "content": "---\ntitle: Support Us\nweight: 8\naliases:\n  - /donate/\n---\n\nGolangci-lint is a free and open-source project built by volunteers.\n\nIf you value it, consider supporting us, we appreciate it! ❤️\n\nYou can support us via:\n\n{{< cards class=\"support-cards\" cols=7 >}}\n    {{< card link=\"https://github.com/sponsors/golangci\" title=\"GitHub Sponsors\" subtitle=\"Credit card\" image=\"/images/github-sponsors.svg\" >}}\n    {{< card link=\"https://opencollective.com/golangci-lint\" title=\"Open Collective\" subtitle=\"Credit card, PayPal, etc.\" image=\"/images/open-collective.svg\" >}}\n    {{< card link=\"https://thanks.dev/u/gh/golangci\" title=\"Thanks.dev\" subtitle=\"Credit card\" image=\"/images/thanks-dev.svg\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/formatters/_index.md",
    "content": "---\ntitle: Formatters\nweight: 4\nexcludeSearch: true\naliases:\n  - /usage/formatters/\n---\n\nTo see a list of supported formatters and which formatters are enabled/disabled:\n\n```bash\ngolangci-lint help formatters\n```\n\nTo see a list of formatters enabled by your configuration, use:\n\n```bash\ngolangci-lint formatters\n```\n\n{{< cards cols=2 >}}\n    {{< card link=\"/docs/welcome/quick-start/#formatting\" title=\"Quick Start\" icon=\"terminal\" >}}\n    {{< card link=\"/docs/configuration/cli/#fmt\" title=\"CLI\" icon=\"terminal\" >}}\n    {{< card link=\"/docs/configuration/file/#formatters-configuration\" title=\"Global Configuration\" icon=\"adjustments\" >}}\n    {{< card link=\"/docs/formatters/configuration/\" title=\"Formatter Settings\" icon=\"adjustments\" >}}\n{{< /cards >}}\n\n## All formatters\n\n{{< golangci/items/filter >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"new\" icon=\"fire\" content=\"New\" color=\"yellow\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"deprecated\" icon=\"emoji-sad\" content=\"Deprecated\" color=\"blue\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter-reset gl-hidden\" icon=\"trash\" content=\"Reset\" color=\"red\" border=true >}}\n{{< /golangci/items/filter >}}\n\n{{< cards >}}\n    {{< golangci/items/cards path=\"formatters\" data=\"formatters_info\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/formatters/configuration.md",
    "content": "---\ntitle: Settings\nweight: 2\n---\n\n{{% golangci/items/settings info=\"formatters_info\" settings=\"formatter_settings\" %}}\n"
  },
  {
    "path": "docs/content/docs/linters/_index.md",
    "content": "---\ntitle: Linters\nweight: 3\nexcludeSearch: true\naliases:\n  - /usage/linters/\n---\n\nTo see a list of supported linters and which linters are enabled/disabled:\n\n```bash\ngolangci-lint help linters\n```\n\nTo see a list of linters enabled by your configuration, use:\n\n```bash\ngolangci-lint linters\n```\n\n{{< cards cols=2 >}}\n    {{< card link=\"/docs/welcome/quick-start/#linting\" title=\"Quick Start\" icon=\"terminal\" >}}\n    {{< card link=\"/docs/configuration/cli/#run\" title=\"CLI\" icon=\"terminal\" >}}\n    {{< card link=\"/docs/configuration/file/#linters-configuration\" title=\"Global Configuration\" icon=\"adjustments\" >}}\n    {{< card link=\"/docs/linters/configuration/\" title=\"Linter Settings\" icon=\"adjustments\" >}}\n{{< /cards >}}\n\n## All Linters\n\n{{< golangci/items/filter >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"default\" icon=\"inbox\" content=\"Default\" color=\"indigo\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"new\" icon=\"fire\" content=\"New\" color=\"yellow\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"autofix\" icon=\"sparkles\" content=\"Autofix\" color=\"blue\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"fast\" icon=\"fast-forward\" content=\"Fast\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"slow\" icon=\"play\" content=\"Slow\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter\" data=\"deprecated\" icon=\"emoji-sad\" content=\"Deprecated\" color=\"blue\" >}}\n    {{< golangci/items/filter-badge class=\"gl-filter-reset gl-hidden\" icon=\"trash\" content=\"Reset\" color=\"red\" border=true >}}\n{{< /golangci/items/filter >}}\n\n{{< cards >}}\n    {{< golangci/items/cards path=\"linters\" data=\"linters_info\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/linters/configuration.md",
    "content": "---\ntitle: Settings\nweight: 2\n---\n\n{{% golangci/items/settings info=\"linters_info\" settings=\"linter_settings\" %}}\n"
  },
  {
    "path": "docs/content/docs/linters/false-positives.md",
    "content": "---\ntitle: False Positives\nweight: 3\naliases:\n  - /usage/false-positives/\n---\n\nFalse positives are inevitable, but we did our best to reduce their count.\n\nIf a false positive occurred, you have several choices.\n\n## Specific Linter Excludes\n\nMost of the linters have a configuration, sometimes false-positives can be related to a bad configuration of a linter.\nSo it's recommended to check the linter configurations.\n\nOtherwise, some linters have dedicated configuration to exclude or disable rules.\n\nAn example with `staticcheck`:\n\n```yaml\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - all\n        - '-SA1000' # disable the rule SA1000\n        - '-SA1004' # disable the rule SA1004\n```\n\n## Exclude\n\n### Exclude Issue by Text\n\nYou can use `linters.exclusions.rules` config option for per-path or per-linter configuration.\n\nIn the following example, all the reports from the linters (`linters`) that contain the text (`text`) are excluded:\n\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - linters:\n          - mnd\n        text: \"Magic number: 9\"\n```\n\nIn the following example, all the reports from the linters (`linters`) that originated from the source (`source`) are excluded:\n\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - linters:\n          - lll\n        source: \"^//go:generate \"\n```\n\nIn the following example, all the reports that contain the text (`text`) in the path (`path`) are excluded:\n\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path: path/to/a/file.go\n        text: \"string `example` has (\\\\d+) occurrences, make it a constant\"\n```\n\n### Exclude Issues by Path\n\nExclude issues in path by `linters.exclusions.paths` or `linters.exclusions.rules` config options.\n\nIn the following example, all the reports from the linters (`linters`) that concern the path (`path`) are excluded:\n\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path: '(.+)_test\\.go'\n        linters:\n          - funlen\n          - goconst\n```\n\nThe opposite, excluding reports **except** for specific paths, is also possible.\nIn the following example, only test files get checked:\n\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path-except: '(.+)_test\\.go'\n        linters:\n          - funlen\n          - goconst\n```\n\nIn the following example, all the reports related to the files (`paths`) are excluded:\n\n```yaml\nlinters:\n  exclusions:\n    paths:\n      - path/to/a/file.go\n```\n\nIn the following example, all the reports related to the directories (`paths`) are excluded:\n\n```yaml\nlinters:\n  exclusions:\n    paths:\n      - path/to/a/dir/\n```\n\n## Nolint Directive\n\nTo exclude issues from all linters use `//nolint:all`.\nFor example, if it's used inline (not from the beginning of the line) it excludes issues only for this line.\n\n```go\nvar bad_name int //nolint:all\n```\n\nTo exclude issues from specific linters only:\n\n```go\nvar bad_name int //nolint:wsl,unused\n```\n\nTo exclude issues for the block of code, use this directive at the beginning of a line:\n\n```go\n//nolint:all\nfunc allIssuesInThisFunctionAreExcluded() *string {\n  // ...\n}\n\n//nolint:govet\nvar (\n  a int\n  b int\n)\n```\n\nAlso, you can exclude all issues in a file by:\n\n```go\n//nolint:unparam\npackage pkg\n```\n\nYou may add a comment explaining or justifying why a `nolint` directive is being used on the same line as the flag itself:\n\n```go\n//nolint:gocyclo // This legacy function is complex, but the team too busy to simplify it\nfunc someLegacyFunction() *string {\n  // ...\n}\n```\n\nYou can see more examples of using `nolint` directives in [our tests](https://github.com/golangci/golangci-lint/tree/HEAD/pkg/result/processors/testdata) for it.\n\n### Syntax\n\n`nolint` is not regular comment but a directive.\n\n> A directive comment is a line matching the regular expression `//(line |extern |export |[a-z0-9]+:[a-z0-9])`.\n> https://go.dev/doc/comment#syntax\n\nThis means that no spaces are allowed between:\n- `//` and `nolint`\n- `nolint` and `:`\n- `:` and the name of the linter.\n\nInvalid syntax:\n```go\n// nolint\n// nolint:xxx\n//nolint :xxx\n//nolint: xxx\n```\n\nValid syntax:\n```go\n//nolint:xxx\n```\n\n## Exclusion Presets\n\nSome exclusions are considered common.\nTo help golangci-lint users, those common exclusions are provided through presets.\n\n{{% golangci/exclusion-presets-snippet %}}\n\n{{% golangci/exclusion-preset-tables %}}\n"
  },
  {
    "path": "docs/content/docs/plugins/_index.md",
    "content": "---\ntitle: Plugins\nweight: 7\n---\n\n{{< cards >}}\n  {{< card link=\"/docs/plugins/module-plugins/\" title=\"Module Plugin System\" icon=\"puzzle\" tag=\"Recommended\" tagColor=\"icon-only:sparkles\" >}}\n  {{< card link=\"/docs/plugins/go-plugins/\" title=\"Go Plugin System\" icon=\"puzzle\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/plugins/go-plugins.md",
    "content": "---\ntitle: Go Plugin System\nweight: 2\naliases:\n  - /plugins/go-plugins/\n---\n\n{{< callout type=\"warning\" >}}\n  **We recommend using [Module Plugin System](/docs/plugins/module-plugins) instead of the Go Plugin System.**\n{{< /callout >}}\n\nPrivate linters can be added through [Go's plugin system](https://pkg.go.dev/plugin).\n\nFor a private linter (which acts as a plugin) to work properly,\nthe plugin as well as the golangci-lint binary **needs to be built for the same environment**.\n\n`CGO_ENABLED` is another requirement.\n\nThis means that `golangci-lint` needs to be built for whatever machine you intend to run it on\n(cloning the golangci-lint repository and running a `CGO_ENABLED=1 make build` should do the trick for your machine).\n\n## Create a Plugin\n\nYour linter must provide one or more `golang.org/x/tools/go/analysis.Analyzer` structs.\n\nYour project should also use `go.mod`.\n\nAll versions of libraries that overlap `golangci-lint` (including replaced libraries) MUST be set to the same version as `golangci-lint`.\nYou can see the versions by running `go version -m golangci-lint`.\n\nYou'll also need to create a Go file like `plugin/example.go`.\n\nThis file MUST be in the package `main`, and MUST define an exposed function called `New` with the following signature:\n```go\nfunc New(conf any) ([]*analysis.Analyzer, error) {\n\t// ...\n}\n```\n\nSee [plugin/example.go](https://github.com/golangci/example-plugin-linter/blob/HEAD/plugin/example.go) for more info.\n\nTo build the plugin, from the root project directory, run:\n```bash\ngo build -buildmode=plugin plugin/example.go\n```\n\nThis will create a plugin `*.so` file that can be copied into your project or another well-known location for usage in `golangci-lint`.\n\n## Configure a Plugin\n\nIf you already have a linter plugin available, you can follow these steps to define its usage in a projects `.golangci.yml` file.\n\nAn example linter can be found at [here](https://github.com/golangci/example-plugin-linter).\n\nIf you're looking for instructions on how to configure your own custom linter, they can be found further down.\n\n1. If the project you want to lint does not have one already, copy the [.golangci.yml](https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.yml) to the root directory.\n2. Adjust the YAML to appropriate `linters.settings.custom` entries as so:\n  ```yaml {filename=\".golangci.yml\"}\n  version: \"2\"\n\n  linters:\n    settings:\n      custom:\n        example:\n          path: /example.so\n          description: The description of the linter\n          original-url: github.com/golangci/example-linter\n          settings: # Settings are optional.\n            one: Foo\n            two:\n              - name: Bar\n            three:\n              name: Bar\n  ```\n\nThat is all the configuration that is required to run a custom linter in your project.\n\nCustom linters are enabled by default, but abide by the same rules as other linters.\n\nIf the 'disable all' option is specified either on command line or in `.golangci.yml` files `linters.default: none`, custom linters will be disabled;\nthey can be re-enabled by adding them to the `linters.enable` list,\nor providing the enabled option on the command line, `golangci-lint run -Eexample`.\n\nThe configuration inside the `linters.settings` field of linter has some limitations (these are NOT related to the plugin system itself):\nwe use Viper to handle the configuration, but Viper puts all the keys in lowercase, and `.` cannot be used inside a key.\n"
  },
  {
    "path": "docs/content/docs/plugins/module-plugins.md",
    "content": "---\ntitle: Module Plugin System\nweight: 1\naliases:\n  - /plugins/module-plugins/\n---\n\n> [!TIP]\n> An example linter can be found at [here](https://github.com/golangci/example-plugin-module-linter).\n\n## The Automatic Way\n\n- Define your building configuration into `.custom-gcl.yml`.\n- Run the command `golangci-lint custom` (or `golangci-lint custom -v` to have logs).\n- Define the plugin inside the `linters.settings.custom` section with the type `module`.\n- Run the resulting custom binary of golangci-lint (`./custom-gcl` by default).\n\nRequirements:\n- Go\n- git\n\n### Configuration Example\n\n```yaml {filename=\".custom-gcl.yml\"}\nversion: {{< golangci/latest-version >}}\nplugins:\n  # a plugin from a Go proxy\n  - module: 'github.com/golangci/plugin1'\n    import: 'github.com/golangci/plugin1/foo'\n    version: v1.0.0\n\n  # a plugin from local source\n  - module: 'github.com/golangci/plugin2'\n    path: /my/local/path/plugin2\n```\n\n```yaml {filename=\".golangci.yml\"}\nversion: \"2\"\n\nlinters:\n  default: none\n  enable:\n    - foo\n  settings:\n    custom:\n      foo:\n        type: \"module\"\n        description: This is an example usage of a plugin linter.\n        settings:\n          message: hello\n```\n\n## The Manual Way\n\n- Add a blank-import of your module inside `cmd/golangci-lint/plugins.go`.\n- Run `go mod tidy` (the module containing the plugin will be imported).\n- Run `make build`.\n- Define the plugin inside the `linters.settings.custom` section with the type `module`.\n- Run your custom version of golangci-lint.\n\n### Configuration Example\n\n```yaml {filename=\".golangci.yml\"}\nversion: \"2\"\n\nlinters:\n  default: none\n  enable:\n    - foo\n  settings:\n    custom:\n      foo:\n        type: \"module\"\n        description: This is an example usage of a plugin linter.\n        settings:\n          message: hello\n```\n\n## Reference\n\nThe configuration file can be validated with the JSON Schema: [custom-gcl.jsonschema.json](https://golangci-lint.run/jsonschema/custom-gcl.jsonschema.json)\n\n```yml {filename=\".custom-gcl.yml\"}\n{{% golangci/embed file=\".tmp/.custom-gcl.reference.yml\" %}}\n```\n"
  },
  {
    "path": "docs/content/docs/product/_index.md",
    "content": "---\ntitle: Product\nweight: 5\n---\n\n{{< cards cols=2 >}}\n  {{< card link=\"/docs/product/thanks/\" title=\"Thanks\" icon=\"heart\" >}}\n  {{< card link=\"/docs/product/migration-guide/\" title=\"Migration Guide\" icon=\"switch-horizontal\" >}}\n  {{< card link=\"/docs/product/changelog/\" title=\"Changelog\" icon=\"document-text\" >}}\n  {{< card link=\"/docs/product/roadmap/\" title=\"Roadmap\" icon=\"document-text\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/product/changelog-v1.md",
    "content": "---\ntitle: Changelog v1\nexcludeSearch: true\nsidebar:\n  exclude: true\n---\n\nFollow the news and releases on [Mastodon](https://fosstodon.org/@golangcilint) and on [Bluesky](https://bsky.app/profile/golangci-lint.run).\n\n`golangci-lint` is a free and open-source project built by volunteers.\n\nIf you value it, consider supporting us, we appreciate it!\n\n{{< golangci/button text=\"Donate ❤️\" link=\"/docs/donate\" >}}\n\n{{% golangci/embed file=\".tmp/raw_changelog_v1.tmp\" %}}\n"
  },
  {
    "path": "docs/content/docs/product/changelog.md",
    "content": "---\ntitle: Changelog\nweight: 2\nexcludeSearch: true\naliases:\n  - /product/changelog/\n---\n\nFollow the news and releases on [Mastodon](https://fosstodon.org/@golangcilint) and on [Bluesky](https://bsky.app/profile/golangci-lint.run).\n\n`golangci-lint` is a free and open-source project built by volunteers.\n\nIf you value it, consider supporting us, we appreciate it!\n\n{{< golangci/button text=\"Donate ❤️\" link=\"/docs/donate\" >}}\n\n{{% golangci/embed file=\".tmp/raw_changelog.tmp\" %}}\n\n## v1.x.x\n\n{{< cards cols=2 >}}\n    {{< card link=\"/docs/product/changelog-v1\" title=\"Changelog of golangci-lint v1\" icon=\"collection\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/product/migration-guide.md",
    "content": "---\ntitle: Migration guide\nweight: 3\naliases:\n  - /product/migration-guide/\n---\n\n## Command `migrate`\n\nYou can use golangci-lint to migrate your configuration with the `migrate` command:\n\n```bash\ngolangci-lint migrate\n```\n\nBe aware that **comments inside a configuration file are not migrated.** You need to add them manually after the migration.\n\n**Deprecated options from v1 or unknown fields are not migrated.**\n\nThe migration file format is based on the extension of the [configuration file](/docs/configuration/file).\nThe format can be overridden by using the `--format` flag:\n\n```bash\ngolangci-lint migrate --format json\n```\n\nBefore the migration, the previous configuration file is copied and saved to a file named `<config_file_name>.bck.<config_file_extension>`.\n\nBy default, before the migration process, the configuration file is validated against the JSON Schema of configuration v1.\nIf you want to skip this validation, you can use the `--skip-validation` flag:\n\n```bash\ngolangci-lint migrate --skip-validation\n```\n\nThe `migrate` command enforces the following default values:\n\n- `run.timeout`: the existing value is ignored because, in v2, there is no timeout by default.\n- `issues.show-stats`: the existing value is ignored because, in v2, stats are enabled by default.\n- `run.concurrency`: if the existing value was `0`, it is removed as `0` is the new default.\n- `run.relative-path-mode`: if the existing value was `cfg`, it is removed as `cfg` is the new default.\n\n`issues.exclude-generated` has a new default value (v1 `lax`, v2 `strict`), so this field will be added during the migration to maintain the previous behavior.\n\n`issues.exclude-dirs-use-default` has been removed, so it is converted to `linters.exclusions.paths` and, if needed, `formatters.exclusions.paths`.\n\nOther fields explicitly defined in the configuration file are migrated even if the value is the same as the default value.\n\nThe `migrate` command automatically migrates `linters.presets` in individual linters to `linters.enable`.\n\n{{% golangci/cli-output cmd=\"migrate\" %}}\n\n## Changes\n\n### `linters`\n\n#### `linters.disable-all`\n\nThis property has been replaced with `linters.default: none`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  disable-all: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  default: none\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters.enable-all`\n\nThis property has been replaced with `linters.default: all`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  enable-all: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  default: all\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters.enable[].<formatter_name>`\n\nThe linters `gci`, `gofmt`, `gofumpt`, and `goimports` have been moved to the `formatters` section.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters.enable[].{stylecheck,gosimple,staticcheck}`\n\nThe linters `stylecheck`, `gosimple`, and `staticcheck` has been merged inside the `staticcheck`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  enable:\n    - gosimple\n    - staticcheck\n    - stylecheck\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  enable:\n    - staticcheck\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters.fast`\n\nThis property has been removed.\n\nThere are 2 new options (they are not strictly equivalent to the previous option):\n\n1. `linters.default: fast`: set all \"fast\" linters as the default set of linters.\n    ```yaml\n    linters:\n      default: fast\n    ```\n2. `--fast-only`: filters all enabled linters to keep only \"fast\" linters.\n\n#### `linters.presets`\n\nThis property has been removed.\n\nThe `migrate` command automatically migrates `linters.presets` in individual linters to `linters.enable`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\nPresets:\n\n| name | linters |\n|------|---------|\n| bugs | `asasalint`, `asciicheck`, `bidichk`, `bodyclose`, `contextcheck`, `durationcheck`, `errcheck`, `errchkjson`, `errorlint`, `exhaustive`, `gocheckcompilerdirectives`, `gochecksumtype`, `gosec`, `gosmopolitan`, `govet`, `loggercheck`, `makezero`, `musttag`, `nilerr`, `nilnesserr`, `noctx`, `protogetter`, `reassign`, `recvcheck`, `rowserrcheck`, `spancheck`, `sqlclosecheck`, `staticcheck`, `testifylint`, `zerologlint` |\n| comment | `dupword`, `godot`, `godox`, `misspell` |\n| complexity | `cyclop`, `funlen`, `gocognit`, `gocyclo`, `maintidx`, `nestif` |\n| error | `err113`, `errcheck`, `errorlint`, `wrapcheck` |\n| format | `gci`, `gofmt`, `gofumpt`, `goimports` |\n| import | `depguard`, `gci`, `goimports`, `gomodguard` |\n| metalinter | `gocritic`, `govet`, `revive`, `staticcheck` |\n| module | `depguard`, `gomoddirectives`, `gomodguard` |\n| performance | `bodyclose`, `fatcontext`, `noctx`, `perfsprint`, `prealloc` |\n| sql | `rowserrcheck`, `sqlclosecheck` |\n| style | `asciicheck`, `canonicalheader`, `containedctx`, `copyloopvar`, `decorder`, `depguard`, `dogsled`, `dupl`, `err113`, `errname`, `exhaustruct`, `exptostd`, `forbidigo`, `forcetypeassert`, `ginkgolinter`, `gochecknoglobals`, `gochecknoinits`, `goconst`, `gocritic`, `godot`, `godox`, `goheader`, `gomoddirectives`, `gomodguard`, `goprintffuncname`, `gosimple`, `grouper`, `iface`, `importas`, `inamedparam`, `interfacebloat`, `intrange`, `ireturn`, `lll`, `loggercheck`, `makezero`, `mirror`, `misspell`, `mnd`, `musttag`, `nakedret`, `nilnil`, `nlreturn`, `nolintlint`, `nonamedreturns`, `nosprintfhostport`, `paralleltest`, `predeclared`, `promlinter`, `revive`, `sloglint`, `stylecheck`, `tagalign`, `tagliatelle`, `testpackage`, `tparallel`, `unconvert`, `usestdlibvars`, `varnamelen`, `wastedassign`, `whitespace`, `wrapcheck`, `wsl` |\n| test | `exhaustruct`, `paralleltest`, `testableexamples`, `testifylint`, `testpackage`, `thelper`, `tparallel`, `usetesting` |\n| unused | `ineffassign`, `unparam`, `unused` |\n\n{{< /tab >}}\n{{< tab >}}\n```yaml\n# Removed\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `typecheck`\n\nThis `typecheck` is not a linter, so it cannot be enabled or disabled:\n\n- [FAQ: Why do you have typecheck errors?](/docs/welcome/faq/#why-do-you-have-typecheck-errors)\n- [FAQ: Why is it not possible to skip/ignore typecheck errors?](/docs/welcome/faq/#why-is-it-not-possible-to-skipignore-typecheck-errors)\n\n#### Deprecated Linters\n\nThe following deprecated linters have been removed:\n\n- `deadcode`\n- `execinquery`\n- `exhaustivestruct`\n- `exportloopref`\n- `golint`\n- `ifshort`\n- `interfacer`\n- `maligned`\n- `nosnakecase`\n- `scopelint`\n- `structcheck`\n- `tenv`\n- `varcheck`\n\n#### Alternative Linter Names\n\nThe alternative linters has been removed.\n\n| Alt Name v1 | Name v2       |\n|-------------|---------------|\n| `gas`       | `gosec`       |\n| `goerr113`  | `err113`      |\n| `gomnd`     | `mnd`         |\n| `logrlint`  | `loggercheck` |\n| `megacheck` | `staticcheck` |\n| `vet`       | `govet`       |\n| `vetshadow` | `govet`       |\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  enable:\n    - gas\n    - goerr113\n    - gomnd\n    - logrlint\n    - megacheck\n    - vet\n    - vetshadow\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  enable:\n    - gosec\n    - err113\n    - mnd\n    - loggercheck\n    - staticcheck\n    - govet\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n### `linters-settings`\n\nThe `linters-settings` section has been split into `linters.settings` and `formatters.settings`.\n\nSettings for `gci`, `gofmt`, `gofumpt`, and `goimports` are moved to the `formatters.settings` section.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  govet:\n    enable-all: true\n  gofmt:\n    simplify: false\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    govet:\n      enable-all: true\n\nformatters:\n  settings:\n    gofmt:\n      simplify: false\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.asasalint.ignore-test`\n\nThis option has been removed.\n\nTo ignore test files, use `linters.exclusions.rules`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  asasalint:\n    ignore-test: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path: '(.+)_test\\.go'\n        linters:\n          - asasalint\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.copyloopvar.ignore-alias`\n\nThis option has been deprecated since v1.58.0 and has been replaced with `linters.settings.copyloopvar.check-alias`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  copyloopvar:\n    ignore-alias: false\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    copyloopvar:\n      check-alias: true\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.cyclop.skip-tests`\n\nThis option has been removed.\n\nTo ignore test files, use `linters.exclusions.rules`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  cyclop:\n    skip-test: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path: '(.+)_test\\.go'\n        linters:\n          - cyclop\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.errcheck.exclude`\n\nThis option has been deprecated since v1.42.0 and has been removed.\n\nTo exclude functions, use `linters.settings.errcheck.exclude-functions` instead.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  errcheck:\n    exclude: ./errcheck_excludes.txt\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    errcheck:\n      exclude-functions:\n        - io.ReadFile\n        - io.Copy(*bytes.Buffer)\n        - io.Copy(os.Stdout)\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.errcheck.ignore`\n\nThis option has been deprecated since v1.13.0 and has been removed.\n\nTo exclude functions, use `linters.settings.errcheck.exclude-functions` instead.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  errcheck:\n    ignore: 'io:.*'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    errcheck:\n      exclude-functions:\n        - 'io.ReadFile'\n        - 'io.Copy(*bytes.Buffer)'\n        - 'io.Copy(os.Stdout)'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.exhaustive.check-generated`\n\nThis option has been removed.\n\nTo analyze generated files, use `linters.exclusions.generated`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  exhaustive:\n    check-generated: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    generated: disable\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.forbidigo.forbid[].p`\n\nThis field has been replaced with `linters-settings.forbidigo.forbid[].pattern`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  forbidigo:\n    forbid:\n      - p: '^fmt\\.Print.*$'\n        msg: Do not commit print statements.\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    forbidigo:\n      forbid:\n        - pattern: '^fmt\\.Print.*$'\n          msg: Do not commit print statements.\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.forbidigo.forbid[]<pattern>`\n\nThe `pattern` has become mandatory for the `forbid` field.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  forbidigo:\n    forbid:\n      - '^print(ln)?$'\n      - '^spew\\.(ConfigState\\.)?Dump$'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    forbidigo:\n      forbid:\n        - pattern: '^print(ln)?$'\n        - pattern: '^spew\\.(ConfigState\\.)?Dump$'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.gci.local-prefixes`\n\nThis option has been deprecated since v1.44.0 and has been removed.\n\nUse `linters.settings.gci.sections` instead.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  gci:\n    local-prefixes: 'github.com/example/pkg'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    gci:\n      sections:\n        - standard\n        - default\n        - prefix(github.com/example/pkg)\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.gci.skip-generated`\n\nThis option has been removed.\n\nTo analyze generated files, use `linters.exclusions.generated`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    gci:\n      skip-generated: false\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    generated: disable\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.goconst.ignore-tests`\n\nThis option has been removed.\n\nTo ignore test files, use `linters.exclusions.rules`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  goconst:\n    ignore-tests: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path: '(.+)_test\\.go'\n        linters:\n          - goconst\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.gocritic.settings.ruleguard.rules`\n\nThe special variable `${configDir}` has been replaced with `${base-path}`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  gocritic:\n    settings:\n      ruleguard:\n        rules: '${configDir}/ruleguard/rules-*.go'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    gocritic:\n      settings:\n        ruleguard:\n          rules: '${base-path}/ruleguard/rules-*.go'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.govet.check-shadowing`\n\nThis option has been deprecated since v1.57.0 and has been removed.\n\nUse `linters.settings.govet.enable: shadow` instead.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  govet:\n    check-shadowing: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    govet:\n      enable:\n        - shadow\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.misspell.ignore-words`\n\nThis option has been replaced with `linters.settings.misspell.ignore-rules`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  misspell:\n    ignore-words:\n      - foo\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    misspell:\n      ignore-rules:\n        - foo\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.predeclared.ignore`\n\nThis string option has been replaced with the slice option with the same name.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  predeclared:\n    ignore: \"new,int\"\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    predeclared:\n      ignore:\n        - new\n        - int\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.predeclared.q`\n\nThis option has been replaced with `linters.settings.predeclared.qualified-name`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  predeclared:\n    q: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    predeclared:\n      qualified-name: true\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.revive.ignore-generated-header`\n\nThis option has been removed.\n\nUse `linters.exclusions.generated` instead.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  revive:\n    ignore-generated-header: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    generated: strict\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.sloglint.context-only`\n\nThis option has been deprecated since v1.58.0 and has been replaced with `linters.settings.sloglint.context`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  sloglint:\n    context-only: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    sloglint:\n      context: all\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.staticcheck.go`\n\nThis option has been deprecated since v1.47.0 and has been removed.\n\nUse `run.go` instead.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  staticcheck:\n    go: '1.22'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nrun:\n  go: '1.22'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.unused.exported-is-used`\n\nThis option has been deprecated since v1.60.0 and has been removed.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  unused:\n    exported-is-used: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\n# Removed\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.usestdlibvars.os-dev-null`\n\nThis option has been deprecated since v1.51.0 and has been removed.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  usestdlibvars:\n    os-dev-null: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\n# Removed\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.usestdlibvars.syslog-priority`\n\nThis option has been deprecated since v1.51.0 and has been removed.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  usestdlibvars:\n    syslog-priority: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\n# Removed\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.wrapcheck.ignoreInterfaceRegexps`\n\nThis option has been renamed to `linters.settings.wrapcheck.ignore-interface-regexps`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  wrapcheck:\n    ignoreInterfaceRegexps:\n      - '^(?i)c(?-i)ach(ing|e)'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    wrapcheck:\n      ignore-interface-regexps:\n        - '^(?i)c(?-i)ach(ing|e)'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.wrapcheck.ignorePackageGlobs`\n\nThis option has been renamed to `linters.settings.wrapcheck.ignore-package-globs`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  wrapcheck:\n    ignorePackageGlobs:\n      - 'encoding/*'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    wrapcheck:\n      ignore-package-globs:\n        - 'encoding/*'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.wrapcheck.ignoreSigRegexps`\n\nThis option has been renamed to `linters.settings.wrapcheck.ignore-sig-regexps`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\n  linters-settings:\n    wrapcheck:\n      ignoreSigRegexps:\n        - '\\.New.*Error\\('\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    wrapcheck:\n      ignore-sig-regexps:\n        - '\\.New.*Error\\('\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `linters-settings.wrapcheck.ignoreSigs`\n\nThis option has been renamed to `linters.settings.wrapcheck.ignore-sigs`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters-settings:\n  wrapcheck:\n    ignoreSigs:\n      - '.Errorf('\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  settings:\n    wrapcheck:\n      ignore-sigs:\n        - '.Errorf('\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n### `issues`\n\n#### `issues.exclude-case-sensitive`\n\nThis property has been removed.\n\n`issues.exclude`, `issues.exclude-rules.text`, and `issues.exclude-rules.source` are case-sensitive by default.\n\nTo ignore case, use `(?i)` at the beginning of a regex syntax.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude-case-sensitive: false\n  exclude:\n    - 'abcdef'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path: '(.+)\\.go$'\n        text: (?i)abcdef\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.exclude-dirs-use-default`\n\nThis property has been removed.\n\nUse `linters.exclusions.paths` and `formatters.exclusions.paths` to exclude directories.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude-dirs-use-default: true\n```\n{{< /tab >}}\n{{< tab >}}\n\n```yaml\nlinters:\n  exclusions:\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.exclude-dirs`\n\nThis property has been replaced with `linters.exclusions.paths` and `formatters.exclusions.paths`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude-dirs:\n    - src/external_libs\n    - autogenerated_by_my_lib\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    paths:\n      - src/external_libs\n      - autogenerated_by_my_lib\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.exclude-files`\n\nThis property has been replaced with `linters.exclusions.paths` and `formatters.exclusions.paths`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude-files:\n    - '.*\\.my\\.go$'\n    - lib/bad.go\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    paths:\n      - '.*\\.my\\.go$'\n      - lib/bad.go\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.exclude-generated-strict`\n\nThis property has been deprecated since v1.59.0 and has been replaced with `linters.exclusions.generated: strict`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclude-generated-strict: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    generated: strict\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.exclude-generated`\n\nThis property has been replaced with `linters.exclusions.generated`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclude-generated: lax\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    generated: lax\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.exclude-rules`\n\nThis property has been replaced with `linters.exclusions.rules`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude-rules:\n    - path: '_test\\.go'\n      linters:\n        - gocyclo\n        - errcheck\n        - dupl\n        - gosec\n    - path-except: '_test\\.go'\n      linters:\n        - staticcheck\n    - path: internal/hmac/\n      text: \"weak cryptographic primitive\"\n      linters:\n        - gosec\n    - linters:\n        - staticcheck\n      text: \"SA9003:\"\n    - linters:\n        - err113\n      source: \"foo\"\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    rules:\n      - path: '_test\\.go'\n        linters:\n          - dupl\n          - errcheck\n          - gocyclo\n          - gosec\n      - path-except: '_test\\.go'\n        linters:\n          - staticcheck\n      - path: internal/hmac/\n        text: weak cryptographic primitive\n        linters:\n          - gosec\n      - text: 'SA9003:'\n        linters:\n          - staticcheck\n      - source: foo\n        linters:\n          - err113\n  ```\n{{< /tab >}}\n{{< /tabs >}}\n\n\n#### `issues.exclude-use-default`\n\nThis property has been replaced with `linters.exclusions.presets`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude-use-default: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.exclude`\n\nThis property has been replaced with `linters.exclusions.rules`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude:\n    - abcdef\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n  rules:\n    - path: '(.+)\\.go$'\n      text: abcdef\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `issues.include`\n\nThis property has been replaced with `linters.exclusions.presets`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nissues:\n  include:\n    - EXC0014\n    - EXC0015\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    presets:\n      - common-false-positives\n      - legacy\n      - std-error-handling\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n### `output`\n\n#### `output.format`\n\nThis property has been deprecated since v1.57.0 and has been replaced with `output.formats`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  format: 'checkstyle:report.xml,json:stdout,colored-line-number'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    checkstyle:\n      path: 'report.xml'\n    json:\n      path: stdout\n    text:\n      path: stdout\n      color: true\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `output.formats[].format: <name>`\n\nThe property `output.formats[].format` has been replaced with `output.formats[].<format_name>`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    - format: json\n      path: stderr\n    - format: checkstyle\n      path: report.xml\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    json:\n      path: stderr\n    checkstyle:\n      path: report.xml\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `output.formats[].format: line-number`\n\nThis format has been replaced by the format `text`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    - format: line-number\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    text:\n      path: stdout\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `output.formats[].format: colored-line-number`\n\nThis format has been replaced by the format `text` with the option `colors` (`true` by default).\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    - format: colored-line-number\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    text:\n      path: stdout\n      colors: true\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `output.formats[].format: colored-tab`\n\nThis format has been replaced by the format `tab` with the option `colors` (`true` by default).\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    - format: colored-tab\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    tab:\n      path: stdout\n      colors: true\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `output.print-issued-lines`\n\nThis property has been removed.\n\nTo not print the lines with issues, use the `text` format with the option `print-issued-lines: false`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    - format: line-number\n      path: stdout\n  print-issued-lines: false\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    text:\n      path: stdout\n      print-issued-lines: false\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `output.print-linter-name`\n\nThis property has been removed.\n\nTo not print the linter name, use the `text` format with the option `print-linter-name: false`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    - format: line-number\n      path: stdout\n  print-linter-name: false\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  formats:\n    text:\n      path: stdout\n      print-linter-name: false\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `output.show-stats`\n\nThis property is `true` by default.\n\n#### `output.sort-order`\n\nThis property has a new default value `['linter', 'file']` instead of `['file']`.\n\n#### `output.sort-results`\n\nThe property has been removed.\n\nThe output results are always sorted.\n\n#### `output.uniq-by-line`\n\nThis property has been deprecated since v1.63.0 and has been replaced by `issues.uniq-by-line`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\noutput:\n  uniq-by-line: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nissues:\n  uniq-by-line: true\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n### `run`\n\n#### `run.go`\n\nThe new fallback value for this property is `1.22` instead of `1.17`.\n\n#### `run.concurrency`\n\nThis property value set to match Linux container CPU quota by default and fallback on the number of logical CPUs in the machine.\n\n#### `run.relative-path-mode`\n\nThis property has a new default value of `cfg` instead of `wd`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nrun:\n# When not specified, relative-path-mode is set to 'wd' by default\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nrun:\n  relative-path-mode: 'cfg'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `run.show-stats`\n\nThis property has been deprecated since v1.57.0 and has been replaced by `output.show-stats`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nrun:\n  show-stats: true\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\noutput:\n  show-stats: true\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `run.skip-dirs-use-default`\n\nThis property has been deprecated since v1.57.0 and has been replaced by `issues.exclude-dirs-use-default`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nrun:\n  skip-dirs-use-default: false\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nissues:\n  exclude-dirs-use-default: false\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `run.skip-dirs`\n\nThis property has been deprecated since v1.57.0 and has been removed.\n\nUse `linters.exclusions.paths` and `formatters.exclusions.paths` to exclude directories.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nrun:\n  skip-dirs:\n    - src/external_libs\n    - autogenerated_by_my_lib\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    paths:\n      - src/external_libs\n      - autogenerated_by_my_lib\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `run.skip-files`\n\nThis property has been deprecated since v1.57.0 and has been removed.\n\nUse `linters.exclusions.paths` and `formatters.exclusions.paths` to exclude files.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nrun:\n  skip-files:\n    - '.*\\.my\\.go$'\n    - lib/bad.go\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nlinters:\n  exclusions:\n    paths:\n      - '.*\\.my\\.go$'\n      - lib/bad.go\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `run.timeout`\n\nThis property value is disabled by default (`0`).\n\n### `severity`\n\n#### `severity.default-severity`\n\nThis property has been replaced with `severity.default`.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nseverity:\n  default-severity: error\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nseverity:\n  default: error\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n#### `severity.rules.case-sensitive`\n\n`severity.rules.text` and `severity.rules.source` are case-sensitive by default.\n\nTo ignore case, use `(?i)` at the beginning of a regex syntax.\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```yaml\nseverity:\n  case-sensitive: true\n  rules:\n    - severity: info\n      linters:\n        - foo\n      text: 'Example.*'\n```\n{{< /tab >}}\n{{< tab >}}\n```yaml\nseverity:\n  rules:\n    - severity: info\n      linters:\n        - foo\n      text: '(?i)Example.*'\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n### `version`\n\nThe `version` property has been added to the configuration file.\n\n```yaml\nversion: \"2\"\n```\n\n### Integration\n\n#### Visual Studio Code\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n```JSONata\n\"go.lintTool\": \"golangci-lint\",\n\"go.lintFlags\": [\n  \"--fast\"\n]\n```\n{{< /tab >}}\n{{< tab >}}\n```JSONata\n\"go.lintTool\": \"golangci-lint\",\n\"go.lintFlags\": [\n  \"--fast-only\"\n],\n\"go.formatTool\": \"custom\",\n\"go.alternateTools\": {\n  \"customFormatter\": \"golangci-lint\"\n},\n\"go.formatFlags\": [\n  \"fmt\",\n  \"--stdin\"\n]\n```\n{{< /tab >}}\n{{< /tabs >}}\n\n### Command Line Flags\n\nThe following flags have been removed:\n\n- `--disable-all`\n- `--enable-all`\n- `-p, --presets`\n- `--fast`\n- `-e, --exclude`\n- `--exclude-case-sensitive`\n- `--exclude-dirs-use-default`\n- `--exclude-dirs`\n- `--exclude-files`\n- `--exclude-generated`\n- `--exclude-use-default`\n- `--go string`\n- `--sort-order`\n- `--sort-results`\n- `--out-format`\n- `--print-issued-lines`\n- `--print-linter-name`\n\n#### `--out-format`\n\n`--out-format` has been replaced with the following flags:\n\n```bash\n# Previously 'colored-line-number' and 'line-number'\n--output.text.path\n--output.text.print-linter-name\n--output.text.print-issued-lines\n--output.text.colors\n```\n\n```bash\n# Previously 'json'\n--output.json.path\n```\n\n```bash\n# Previously 'colored-tab' and 'tab'\n--output.tab.path\n--output.tab.print-linter-name\n--output.tab.colors\n```\n\n```bash\n# Previously 'html'\n--output.html.path\n```\n\n```bash\n# Previously 'checkstyle'\n--output.checkstyle.path\n```\n\n```bash\n# Previously 'code-climate'\n--output.code-climate.path\n```\n\n```bash\n# Previously 'junit-xml' and 'junit-xml-extended'\n--output.junit-xml.path\n--output.junit-xml.extended\n```\n\n```bash\n# Previously 'teamcity'\n--output.teamcity.path\n```\n\n```bash\n# Previously 'sarif'\n--output.sarif.path\n```\n\n#### `--print-issued-lines`\n\n`--print-issued-lines` has been replaced with `--output.text.print-issued-lines`.\n\n#### `--print-linter-name`\n\n`--print-linter-name` has been replaced with `--output.text.print-linter-name` or `--output.tab.print-linter-name`.\n\n#### `--disable-all` and `--enable-all`\n\n`--disable-all` has been replaced with `--default=none`.\n\n`--enable-all` has been replaced with `--default=all`.\n\n#### Examples\n\nRun only the `govet` linter, output results to stdout in JSON format, and sort results:\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n\n```bash\ngolangci-lint run --disable-all --enable=govet --out-format=json --sort-order=linter --sort-results\n```\n{{< /tab >}}\n{{< tab >}}\n\n```bash\ngolangci-lint run --default=none --enable=govet --output.json.path=stdout\n```\n{{< /tab >}}\n{{< /tabs >}}\n\nDo not print issued lines, output results to stdout without colors in text format, and to `gl-code-quality-report.json` file in Code Climate's format:\n\n{{< tabs items=\"v1,v2\" >}}\n{{< tab >}}\n\n```bash\ngolangci-lint run --print-issued-lines=false --out-format code-climate:gl-code-quality-report.json,line-number\n```\n{{< /tab >}}\n{{< tab >}}\n\n```bash\ngolangci-lint run --output.text.path=stdout --output.text.colors=false --output.text.print-issued-lines=false --output.code-climate.path=gl-code-quality-report.json\n```\n{{< /tab >}}\n{{< /tabs >}}\n"
  },
  {
    "path": "docs/content/docs/product/roadmap.md",
    "content": "---\ntitle: Roadmap\nweight: 4\naliases:\n  - /product/roadmap/\n---\n\n## 💡 Feature Requests\n\nPlease file an issue to suggest new features. Vote on feature requests by adding a 👍. This helps maintainers prioritize what to work on.\n\n[See Feature Requests](https://github.com/golangci/golangci-lint/issues?utf8=✓&q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3Aenhancement)\n\n## 🐛 Bugs\n\nPlease file an issue for bugs, missing documentation or unexpected behavior.\n\n[See Bugs](https://github.com/golangci/golangci-lint/issues?utf8=✓&q=is%3Aissue+is%3Aopen+label%3A%22bug%22+sort%3Acreated-desc)\n\n## Versioning Policy\n\ngolangci-lint follows [semantic versioning](https://semver.org). However, due to the nature of golangci-lint as a code quality tool,\nit's not always clear when a minor or major version bump occurs.\nTo help clarify this for everyone, we've defined the following semantic versioning policy:\n\n- Patch release (intended to not break your lint build)\n  - A patch version update in a specific linter that results in golangci-lint reporting fewer errors.\n  - A bug fix to the CLI or core (packages loading, runner, postprocessors, etc).\n  - Improvements to documentation.\n  - Non-user-facing changes such as refactoring code, adding, deleting, or modifying tests, and increasing test coverage.\n  - Re-releasing after a failed release (i.e., publishing a release that doesn't work for anyone).\n- Minor release (might break your lint build because of newly found issues)\n  - A major or minor version update of a specific linter that results in golangci-lint reporting more errors.\n  - A new linter is added.\n  - An existing configuration option or linter is deprecated.\n  - A new CLI command is created.\n  - Backward incompatible change of configuration.\n- Major release (likely to break your lint build)\n  - Backward incompatible change of configuration with huge impact.\n\nAccording to our policy, any minor update may report more errors than the previous release (ex: from a bug fix).\nAs such, we recommend using the fixed minor version and fixed or the latest patch version to guarantee the results of your builds.\n\nFor example, in our [GitHub Action](https://github.com/golangci/golangci-lint-action) we require users to explicitly set the minor version of golangci-lint\nand we always use the latest patch version.\n\n## Linter Deprecation Cycle\n\nA linter can be deprecated for various reasons, e.g. the linter stops working with a newer version of Go or the author has abandoned its linter.\n\nThe deprecation of a linter will follow 3 phases:\n\n1. **Display of a warning message**: The linter can still be used (unless it's completely non-functional),\n  but it's recommended to remove it from your configuration.\n2. **Display of an error message**: At this point, you should remove the linter.\n  The original implementation is replaced by a placeholder that does nothing.\n  The linter is NOT enabled when using `default: all` and should be removed from the `disable` option.\n3. **Removal of the linter** from golangci-lint.\n\nEach phase corresponds to a minor version:\n\n- v1.0.0 -> warning message\n- v1.1.0 -> error message\n- v1.2.0 -> linter removed\n\nWe will provide clear information about those changes on different supports: changelog, logs, social network, etc.\n\nWe consider the removal of a linter as non-breaking changes for golangci-lint itself.\nNo major version will be created when a linter is removed.\n\n## Future Plans\n\n1. Upstream all changes of forked linters.\n2. Make it easy to write own linter/checker: it should take a minimum code, have perfect documentation, debugging and testing tooling.\n3. Speed up SSA loading: on-disk cache and existing code profiling-optimizing.\n4. Analyze (don't only filter) only new code: analyze only changed files and dependencies, make incremental analysis, caches.\n5. Smart new issues detector: don't print existing issues on changed lines.\n6. Minimize false-positives by fixing linters and improving testing tooling.\n7. Documentation for every issue type.\n"
  },
  {
    "path": "docs/content/docs/product/thanks.md",
    "content": "---\ntitle: Thanks\nweight: 1\naliases:\n  - /product/thanks/\n---\n\n## ❤️\n\n### Thanks to developers and authors of used linters\n\n{{< cards class=\"author-cards\" cols=7 >}}\n{{< golangci/authors >}}\n{{< /cards >}}\n\n### Thanks to all contributors\n\n[![golangci-lint contributors](https://opencollective.com/golangci-lint/contributors.svg?width=890&button=false&skip=golangcidev,CLAassistant,renovate,fossabot,golangcibot,kortschak,golangci-releaser,dependabot%5Bbot%5D)](https://github.com/golangci/golangci-lint/graphs/contributors)\n\n### Special thanks\n\nThanks to Ludovic Fernandez ([@ldez](https://github.com/ldez)) for actively maintaining the golangci-lint project.\n\nThanks to Denis Isaev ([@jirfag](https://github.com/jirfag)) for creating golangci-lint and the GitHub Action [golangci-lint-action](https://github.com/golangci/golangci-lint-action).\n\nThanks to Alec Thomas ([@alecthomas](https://github.com/alecthomas)) and [alecthomas/gometalinter](https://github.com/alecthomas/gometalinter) for inspiration and amazing work.\n\nThanks to Bradley Falzon ([@bradleyfalzon](https://github.com/bradleyfalzon)) and [bradleyfalzon/revgrep](https://github.com/bradleyfalzon/revgrep) for cool diff tool.\n\nThe golangci-lint logo is inspired by the Go gopher designed by Renee French [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/).\n"
  },
  {
    "path": "docs/content/docs/welcome/_index.md",
    "content": "---\ntitle: Welcome\nweight: 1\n---\n\nThis quickstart guide provides step-by-step instructions to help you install, configure, and begin using `golangci-lint` efficiently.\n\n<!--more-->\n\n{{< cards >}}\n  {{< card link=\"/docs/welcome/install/local\" title=\"Local Installation\" icon=\"archive\" >}}\n  {{< card link=\"/docs/welcome/install/ci\" title=\"CI Installation\" icon=\"archive\" >}}\n  {{< card link=\"/docs/welcome/integrations/\" title=\"Integrations\" icon=\"sparkles\" >}}\n  {{< card link=\"/docs/welcome/quick-start/#linting\" title=\"Quick Start: Linting\" icon=\"fast-forward\" >}}\n  {{< card link=\"/docs/welcome/quick-start/#formatting\" title=\"Quick Start: Formatting\" icon=\"fast-forward\" >}}\n  {{< card link=\"/docs/welcome/faq/\" title=\"FAQ\" icon=\"question-mark-circle\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/welcome/faq.md",
    "content": "---\ntitle: FAQ\ntoc: false\nweight: 5\naliases:\n  - /welcome/faq/\n---\n\n## Which Go versions are supported?\n\nThe same as the Go team (the 2 latest minor versions).\n\nBasically, golangci-lint supports Go versions lower or equal to the Go version used to compile it.\n\nNew versions of Go are not automatically supported because, in addition to the Go version used to build it,\nsome linters and/or internal pieces of golangci-lint could need to be adapted to support this new Go version.\n\n## How to use golangci-lint in CI\n\nRun golangci-lint in CI and check the exit code. If it's non-zero - fail the build.\n\nSee [how to properly install golangci-lint in CI](/docs/welcome/install/ci)\n\n## golangci-lint doesn't work\n\n1. Please ensure you are using the latest binary release.\n2. Run it with `-v` option and check the output.\n3. If it doesn't help, create a [GitHub issue](https://github.com/golangci/golangci-lint/issues/new/choose) with the output from the error and #2 above.\n\n## Why do you have `typecheck` errors?\n\n`typecheck` is like a front-end for the Go compiler errors.\nCompilation errors are identified/labeled as reports of `typecheck` but they are not produced by a linter called `typecheck`.\n\n`typecheck` is not a linter, it doesn't perform any analysis,\nit's just a way to identify, parse, and display compiling errors (produced by the `types.Checker`) and some linter errors.\n\nIt cannot be disabled because of that.\n\nOf course, this is just as good as the compiler itself, and a lot of compilation issues will not properly show where in the code your error lies.\n\nAs a consequence, the code to analyze should compile.\nIt means that if you try to run an analysis on a single file or a group of files or a package or a group of packages,\nwith dependencies on other files or packages of your project, as it doesn't compile (because of the missing pieces of code),\nit also cannot be analyzed.\n\nIf there are `typecheck` errors, golangci-lint will not be able to produce other reports because that kind of error doesn't allow it to perform any analysis.\n\nHow to troubleshoot:\n\n1. Ensure the version of golangci-lint is built with a compatible version of Go (`golangci-lint version`).\n2. Ensure dependencies are up to date with `go mod tidy`.\n3. Ensure building works with `go run ./...`/`go build ./...` - whole package.\n4. Ensure you are not running an analysis on code that depends on files/packages outside the scope of the analyzed elements.\n5. If using CGO, ensure all required system libraries are installed.\n6. If you are using private repositories/dependencies, ensure the [Go proxy](https://go.dev/ref/mod#module-proxy) (`GOPROXY`) and [checksum database](https://go.dev/ref/mod#checksum-database) (`GOSUMDB`) are right and/or your git configuration.\n\n## Why is it not possible to skip/ignore `typecheck` errors?\n\nFor mainly the same reasons that you cannot compile when you have a compiler error.\n\n`typecheck` errors are reported in the same style as linter reports/issues,\nbut are completely different because they are related to problems that block the analysis (`typecheck` is not a linter).\n\nWhen there are `typecheck` errors,\nmost linters are not able to perform the analysis,\nand they simply do not produce any reports,\nso it's not possible to skip/ignore `typecheck` errors.\n\n## Why running with `--fast-only` can be slow on the first run?\n\nBecause the first run caches type information.\nAll subsequent runs will be faster.\nUsually this option is used during development on a local machine and compilation was already performed.\n\n## How do you add a custom linter?\n\nYou can integrate it yourself, see this [manual](/docs/contributing/new-linters/).\nOr you can create a [GitHub Issue](https://github.com/golangci/golangci-lint/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.yml) and we will integrate when time permits.\n\n## How to integrate golangci-lint into a large project with thousands of issues\n\nWe are sure that every project can easily integrate golangci-lint, even the large one.\n\nThe idea is to not fix all existing issues.\nFix only newly added issue: issues in new code.\n\nTo do this, set up the CI to run golangci-lint with options `--new-from-merge-base=main` or `--new-from-rev=HEAD~1`.\n\nAlso, take a look at option `--new`,\nbut consider that CI scripts that generate unstaged files will make `--new` only point out issues in those files and not in the last commit.\nIn that regard `--new-from-merge-base=main` or `--new-from-rev=HEAD~1` are safer.\n\nBy doing this you won't create new issues in your code and can choose to fix existing issues (or not).\n\n## Why `--new-from-xxx` don't seem to be working in some cases?\n\nThe options `--new-from-merge-base`, `--new-from-rev`, and `--new-from-patch` work by comparing `git diff` output and issues.\n\nIf an issue is not reported as the same line as the changes then the issue will be skipped.\nThis is because the line of the issue is not inside the lines changed.\n\nTo fix that, you have to use the option `--whole-files`.\n\nThe side effect is the issues inside the file that contain changes but not directly related to the changes themselves will be reported.\n"
  },
  {
    "path": "docs/content/docs/welcome/install/_index.md",
    "content": "---\ntitle: \"Install\"\nweight: 1\naliases:\n  - /welcome/install/\n---\n\nWhere do you want to install golangci-lint?\n\n{{< cards >}}\n  {{< card link=\"/docs/welcome/install/local\" title=\"On my machine\" icon=\"archive\" >}}\n  {{< card link=\"/docs/welcome/install/ci\" title=\"On CI/CD systems\" icon=\"archive\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/welcome/install/ci.md",
    "content": "---\ntitle: \"CI Installation\"\nweight: 3\n---\n\nIt's important to have reproducible CI: don't start to fail all builds at the same time.\nWith golangci-lint this can happen if you use option `linters.default: all` and a new linter is added\nor even without `linters.default: all` when one upstream linter is upgraded.\n\n> [!IMPORTANT]\n> It's highly recommended installing a specific version of golangci-lint available on the [releases page](https://github.com/golangci/golangci-lint/releases).\n\n## GitHub Actions\n\nWe recommend using [our GitHub Action](https://github.com/golangci/golangci-lint-action) for running golangci-lint in CI for GitHub projects.\n\nIt's [fast and uses smart caching](https://github.com/golangci/golangci-lint-action#performance) inside,\nand it can be much faster than the simple binary installation.\n\nAlso, the action creates GitHub annotations for found issues (you don't need to dig into build log to see found by golangci-lint issues).\n\n{{< cards cols=2 >}}\n  {{< golangci/image-card src=\"/images/colored-line-number.png\" title=\"Console Output\" >}}\n  {{< golangci/image-card src=\"/images/annotations.png\" title=\"Annotations\" >}}\n{{< /cards >}}\n\n## GitLab CI\n\nGitLab provides a [guide for integrating golangci-lint into the Code Quality widget](https://docs.gitlab.com/ci/testing/code_quality/#golangci-lint).\nA simple quickstart is their [CI component](https://gitlab.com/explore/catalog/components/code-quality-oss/codequality-os-scanners-integration), which can be used like this:\n\n```yaml {filename=\".gitlab-ci.yml\"} \ninclude:\n  - component: $CI_SERVER_FQDN/components/code-quality-oss/codequality-os-scanners-integration/golangci@1.0.1\n```\n\nNote that you [can only reference components in the same GitLab instance as your project](https://docs.gitlab.com/ci/components/#use-a-component)\n\n## Buildkite\n\nBuildkite provides a [plugin](https://buildkite.com/resources/plugins/buildkite-plugins/golangci-lint-buildkite-plugin/) for running golangci-lint in Buildkite pipelines.\n\nIt utilizes the [Docker image of golangci-lint](/docs/welcome/install/local/#docker) by default, but can be set to use a binary if available on the agent.\n\nThe plugin will annotate builds with results, providing an easily readable summary of fixes.\n\n```yaml {filename=\".pipeline.yml\"}\nplugins:\n  - golangci-lint#v1.0.0:\n      config: .golangci.yml\n```\n\n## Other CI\n\nHere are the other ways to install golangci-lint:\n\n{{< cards >}}\n  {{< card link=\"/docs/welcome/install/local/#binaries\" title=\"Bash/Binaries\" icon=\"archive\" >}}\n  {{< card link=\"/docs/welcome/install/local/#docker\" title=\"Docker\" icon=\"archive\" >}}\n{{< /cards >}}\n"
  },
  {
    "path": "docs/content/docs/welcome/install/local.md",
    "content": "---\ntitle: \"Local Installation\"\nweight: 2\n---\n\n## Binaries\n\n```bash\n# binary will be $(go env GOPATH)/bin/golangci-lint\ncurl -sSfL https://golangci-lint.run/install.sh | sh -s -- -b $(go env GOPATH)/bin {{< golangci/latest-version >}}\n\n# or install it into ./bin/\ncurl -sSfL https://golangci-lint.run/install.sh | sh -s {{< golangci/latest-version >}}\n\n# In Alpine Linux (as it does not come with curl by default)\nwget -O- -nv https://golangci-lint.run/install.sh | sh -s {{< golangci/latest-version >}}\n\ngolangci-lint --version\n```\n\nOn Windows, you can run the above commands with Git Bash, which comes with [Git for Windows](https://git-scm.com/download/win).\n\n## Linux\n\nGolangci-lint is available inside the majority of the package managers.\n\n{{% details closed=\"true\" title=\"Packaging status\" %}}\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/golangci-lint.svg)](https://repology.org/project/golangci-lint/versions)\n\n{{% /details %}}\n\n## macOS\n\n### Homebrew\n\nNote: Homebrew can use an unexpected version of Go to build the binary,\nso we recommend either using our binaries or ensuring the version of Go used to build.\n\nYou can install a binary release on macOS using [brew](https://brew.sh/):\n\n```bash\nbrew install golangci-lint\nbrew upgrade golangci-lint\n```\n\nNote: Previously, we used a [Homebrew tap](https://github.com/golangci/homebrew-tap).\nWe recommend using the [official formula](https://formulae.brew.sh/formula/golangci-lint) instead of the tap,\nbut sometimes the most recent release isn't immediately available via Homebrew core due to manual updates that need to occur from Homebrew core maintainers.\nIn this case, the tap formula, which is updated automatically,\ncan be used to install the latest version of golangci-lint:\n\n```bash\nbrew tap golangci/tap\nbrew install golangci/tap/golangci-lint\n```\n\n### MacPorts\n\nIt can also be installed through [MacPorts](https://www.macports.org/)\nThe MacPorts installation mode is community-driven and not officially maintained by the golangci team.\n\n```bash\nsudo port install golangci-lint\n```\n\n## Windows\n\n### Chocolatey\n\nYou can install a binary on Windows using [chocolatey](https://community.chocolatey.org/packages/golangci-lint).\n\n```bash\nchoco install golangci-lint\n```\n\n### Scoop\n\nYou can install a binary on Windows using [scoop](https://scoop.sh).\n\n```bash\nscoop install main/golangci-lint\n```\n\nThe scoop package is not officially maintained by golangci team.\n\n## Docker\n\nThe Docker image is available on [Docker Hub](https://hub.docker.com/r/golangci/golangci-lint).\n\n```bash\ndocker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:{{< golangci/latest-version >}} golangci-lint run\n```\n\nColored output:\n```bash\ndocker run -t --rm -v $(pwd):/app -w /app golangci/golangci-lint:{{< golangci/latest-version >}} golangci-lint run\n```\n\nPreserving caches between consecutive runs:\n```bash\ndocker run --rm -t -v $(pwd):/app -w /app \\\n--user $(id -u):$(id -g) \\\n-v $(go env GOCACHE):/.cache/go-build -e GOCACHE=/.cache/go-build \\\n-v $(go env GOMODCACHE):/.cache/mod -e GOMODCACHE=/.cache/mod \\\n-v ~/.cache/golangci-lint:/.cache/golangci-lint -e GOLANGCI_LINT_CACHE=/.cache/golangci-lint \\\ngolangci/golangci-lint:{{< golangci/latest-version >}} golangci-lint run\n```\n\n## mise\n\nNote: `mise` is using the [aqua](https://aquaproj.github.io/) backend for this tool, so binaries installed came from GitHub assets (recommended).\n\nYou can install golangci-lint by using [`mise`](https://github.com/jdx/mise).\n\n```bash\nmise use -g golangci-lint@{{< golangci/latest-version >}}\n```\n\nThe `mise` integration is not officially maintained by golangci team.\n\n## Install from Sources\n\n> [!WARNING]\n> Using `go install`/`go get`, \"tools pattern\", and `tool` command/directives installations aren't guaranteed to work.  \n> We recommend using binary installation.\n\nThese installations aren't recommended because of the following points:\n\n1. These installations compile golangci-lint locally. The Go version used to build will depend on your local Go version.\n2. Some users use the `-u` flag for `go get`, which upgrades our dependencies. The resulting binary was not tested and is not guaranteed to work.\n3. When using the \"tools pattern\" or `tool` command/directives, the dependencies of a tool can modify the dependencies of another tool or your project. The resulting binary was not tested and is not guaranteed to work.\n4. We've encountered issues with Go module hashes due to the unexpected recreation of dependency tags.\n5. `go.mod` replacement directives don't apply transitively. It means a user will be using a patched version of golangci-lint if we use such replacements.\n6. It allows installation from the main branch, which can't be considered stable.\n7. It's slower than binary installation.\n\n```bash\ngo install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{< golangci/latest-version >}}\n```\n\n{{% details title=\"`go tool` usage recommendations\" closed=\"true\" %}}\n\n> [!WARNING]\n> We don't recommend using `go tool`.\n\nBut if you want to use `go tool` to install and run golangci-lint (**once again we don't recommend that**),\nthe best approach is to use a dedicated module or module file to isolate golangci-lint from other tools or dependencies.\n\nThis approach avoids modifying your project dependencies and the golangci-lint dependencies.\n\n> [!CAUTION]\n> You should never update golangci-lint dependencies manually.\n\n**Method 1: dedicated module file**\n\n```sh\n# Create a dedicated module file\ngo mod init -modfile=golangci-lint.mod <your_module_path>/golangci-lint\n# Example: go mod init -modfile=golangci-lint.mod github.com/org/repo/golangci-lint\n```\n\n```sh\n# Add golangci-lint as a tool\ngo get -tool -modfile=golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{< golangci/latest-version >}}\n```\n\n```sh\n# Run golangci-lint as a tool\ngo tool -modfile=golangci-lint.mod golangci-lint run\n```\n\n```sh\n# Update golangci-lint\ngo get -tool -modfile=golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest\n```\n\n**Method 2: dedicated module**\n\n```sh\n# Create a dedicated directory\nmkdir golangci-lint\n```\n\n```sh\n# Create a dedicated module file\ngo mod init -modfile=tools/go.mod <your_module_path>/golangci-lint\n# Example: go mod init -modfile=golangci-lint/go.mod github.com/org/repo/golangci-lint\n```\n\n```sh\n# Setup a Go workspace\ngo work init . golangci-lint\n```\n\n```sh\n# Add golangci-lint as a tool\ngo get -tool -modfile=golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint\n```\n\n```sh\n# Run golangci-lint as a tool\ngo tool golangci-lint run\n```\n\n```sh\n# Update golangci-lint\ngo get -tool -modfile=golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest\n```\n\n{{% /details %}}\n"
  },
  {
    "path": "docs/content/docs/welcome/integrations.md",
    "content": "---\ntitle: Integrations\nweight: 3\naliases:\n  - /welcome/integrations/\n---\n\n## Editor Integration\n\n### GoLand\n\nStarting from version 2025.1, GoLand has built-in support of golangci-lint.\nFor IntelliJ IDEA with the Go plugin, please install the [plugin](https://plugins.jetbrains.com/plugin/12496-go-linter).\n\nBoth v1 and v2 versions are supported.\n\n### Visual Studio Code\n\nInstall the [extension](https://marketplace.visualstudio.com/items?itemName=golang.Go).\n\n{{% details title=\"Recommended settings for those who installed golangci-lint manually\" closed=\"true\" %}}\n\n```JSONata\n\"go.lintTool\": \"golangci-lint\",\n\"go.lintFlags\": [\n  \"--path-mode=abs\",\n  \"--fast-only\"\n],\n\"go.formatTool\": \"custom\",\n\"go.alternateTools\": {\n  \"customFormatter\": \"golangci-lint\"\n},\n\"go.formatFlags\": [\n  \"fmt\",\n  \"--stdin\"\n]\n```\n\nUsing it in an editor without `--fast-only` can freeze your editor.\nGolangci-lint automatically discovers the `.golangci.yml` config for the edited file, so you don't need to configure it in VS Code settings.\n\n{{% /details %}}\n\n{{% details title=\"Recommended settings for those who installed golangci-lint via extension\" closed=\"true\" %}}\n\nInstall `golangci-lint-v2` via the `Go: Install/Update Tools` command after setting these configs.\nThis will enable golangci-lint v1 to co-exist with v2.\nAnd use the following settings:\n\n```JSONata\n\"go.lintTool\": \"golangci-lint-v2\",\n\"go.lintFlags\": [\n  \"--path-mode=abs\",\n  \"--fast-only\"\n],\n\"go.formatTool\": \"custom\",\n\"go.alternateTools\": {\n  \"customFormatter\": \"golangci-lint-v2\"\n},\n\"go.formatFlags\": [\n  \"fmt\",\n  \"--stdin\"\n]\n```\n\nUsing it in an editor without `--fast-only` can freeze your editor.\nGolangci-lint automatically discovers the `.golangci.yml` config for the edited file, so you don't need to configure it in VS Code settings.\n\n{{% /details %}}\n\n### GNU Emacs\n\nThere are available plugins:\n\n- [Spacemacs](https://github.com/syl20bnr/spacemacs/blob/develop/layers/+lang/go/README.org#linting)\n- [Flycheck checker](https://github.com/weijiangan/flycheck-golangci-lint)\n\n### Vim\n\nThe following plugins support golangci-lint:\n\n- [vim-go](https://github.com/fatih/vim-go)\n- [ALE](https://github.com/w0rp/ale)\n\n### LSP Server\n\n[golangci-lint-langserver](https://github.com/nametake/golangci-lint-langserver) (NeoVim, Vim, Emacs, ...)\n\n### Sublime Text\n\nThere is a [plugin](https://github.com/SublimeLinter/SublimeLinter-golangcilint) for SublimeLinter.\n\n## Shell Completion\n\nGolangci-lint can generate Bash, fish, PowerShell, and Zsh completion files.\n\nSee the instructions on `golangci-lint completion <YOUR_SHELL> --help` (replace `<YOUR_SHELL>` with your favorite one).\n\n{{% details title=\"Bash & macOS\" closed=\"true\" %}}\n\nThere are two versions of `bash-completion`, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+.\n\nThe golangci-lint completion script doesn’t work correctly with bash-completion v1 and Bash 3.2. It requires bash-completion v2 and Bash 4.1+.\n\nThus, to be able to correctly use golangci-lint completion on macOS, you have to install and use Bash 4.1+ ([instructions](https://itnext.io/upgrading-bash-on-macos-7138bd1066ba)).\n\nThe following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).\n\nInstall `bash-completion v2`:\n\n```bash\nbrew install bash-completion@2\necho 'export BASH_COMPLETION_COMPAT_DIR=\"/usr/local/etc/bash_completion.d\"' >>~/.bashrc\necho '[[ -r \"/usr/local/etc/profile.d/bash_completion.sh\" ]] && . \"/usr/local/etc/profile.d/bash_completion.sh\"' >>~/.bashrc\nexec bash # reload and replace (if it was updated) shell\ntype _init_completion && echo \"completion is OK\" # verify that bash-completion v2 is correctly installed\n```\n\nAdd golangci-lint bash completion:\n\n```bash\necho 'source <(golangci-lint completion bash)' >>~/.bashrc\nsource ~/.bashrc\n```\n\n{{% /details %}}\n\n## CI Integration\n\nCheck out our [documentation for CI integrations](/docs/welcome/install#ci-installation).\n\n"
  },
  {
    "path": "docs/content/docs/welcome/quick-start.md",
    "content": "---\ntitle: Quick Start\nweight: 2\naliases:\n  - /welcome/quick-start/\n---\n\n## Linting\n\nTo run golangci-lint:\n\n```bash\ngolangci-lint run\n```\n\nIt's an equivalent of:\n\n```bash\ngolangci-lint run ./...\n```\n\nYou can choose which directories or files to analyze:\n\n```bash\ngolangci-lint run dir1 dir2/...\ngolangci-lint run file1.go\n```\n\nDirectories are NOT analyzed recursively.\nTo analyze them recursively append `/...` to their path.\nIt's not possible to mix files and packages/directories, and files must come from the same package.\n\nGolangci-lint can be used with zero configuration. By default, the following linters are enabled:\n\n{{% golangci/cli-output section=\"defaultEnabledLinters\" cmd=\"help linters\" %}}\n\nPass `-E/--enable` to enable linter and `-D/--disable` to disable:\n\n```bash\ngolangci-lint run --default=none -E errcheck\n```\n\nMore information about available linters can be found in the [linters page](/docs/linters/).\n\n## Formatting\n\nTo format your code:\n\n```bash\ngolangci-lint fmt\n```\n\nYou can choose which directories or files to analyze:\n\n```bash\ngolangci-lint fmt dir1 dir2/...\ngolangci-lint fmt file1.go\n```\n\nMore information about available formatters can be found in the [formatters page](/docs/formatters/).\n"
  },
  {
    "path": "docs/data/cli_help.json",
    "content": "{\n  \"defaultEnabledLinters\": \"Enabled by default linters:\\nerrcheck: Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases.\\ngovet: Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes. [auto-fix]\\nineffassign: Detects when assignments to existing variables are not used. [fast]\\nstaticcheck: It's the set of rules from staticcheck. [auto-fix]\\nunused: Checks Go code for unused constants, variables, functions and types.\",\n  \"rootOutput\": \"Smart, fast linters runner.\\n\\nUsage:\\n  golangci-lint [flags]\\n  golangci-lint [command]\\n\\nAvailable Commands:\\n  cache       Cache control and information.\\n  completion  Generate the autocompletion script for the specified shell\\n  config      Configuration file information and verification.\\n  custom      Build a version of golangci-lint with custom linters.\\n  fmt         Format Go source files.\\n  formatters  List current formatters configuration.\\n  help        Display extra help\\n  linters     List current linters configuration.\\n  migrate     Migrate configuration file from v1 to v2.\\n  run         Lint the code.\\n  version     Display the golangci-lint version.\\n\\nFlags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n      --version        Print version\\n\\nUse \\\"golangci-lint [command] --help\\\" for more information about a command.\\n\",\n  \"runOutput\": \"Lint the code.\\n\\nUsage:\\n  golangci-lint run [flags]\\n\\nFlags:\\n  -c, --config PATH                       Read config from file path PATH\\n      --no-config                         Don't read config file\\n      --default string                    Default set of linters to enable (default \\\"standard\\\")\\n  -D, --disable strings                   Disable specific linter\\n  -E, --enable strings                    Enable specific linter\\n      --enable-only strings               Override linters configuration section to only run the specific linter(s)\\n      --fast-only                         Filter enabled linters to run only fast linters\\n  -j, --concurrency int                   Number of CPUs to use (Default: Automatically set to match Linux container CPU quota and fall back to the number of logical CPUs in the machine)\\n      --modules-download-mode string      Modules download mode. If not empty, passed as -mod=\\u003cmode\\u003e to go tools\\n      --issues-exit-code int              Exit code when issues were found (default 1)\\n      --build-tags strings                Build tags\\n      --timeout duration                  Timeout for total work. Disabled by default\\n      --tests                             Analyze tests (*_test.go) (default true)\\n      --allow-parallel-runners            Allow multiple parallel golangci-lint instances running.\\n                                          If false (default) - golangci-lint acquires file lock on start.\\n      --allow-serial-runners              Allow multiple golangci-lint instances running, but serialize them around a lock.\\n                                          If false (default) - golangci-lint exits with an error if it fails to acquire file lock on start.\\n      --path-prefix string                Path prefix to add to output\\n      --path-mode string                  Path mode to use (empty, or 'abs')\\n      --show-stats                        Show statistics per linter (default true)\\n      --output.text.path stdout           Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.text.print-linter-name     Print linter name in the end of issue text. (default true)\\n      --output.text.print-issued-lines    Print lines of code with issue. (default true)\\n      --output.text.colors                Use colors. (default true)\\n      --output.json.path stdout           Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.tab.path stdout            Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.tab.print-linter-name      Print linter name in the end of issue text. (default true)\\n      --output.tab.colors                 Use colors. (default true)\\n      --output.html.path stdout           Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.checkstyle.path stdout     Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.code-climate.path stdout   Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.junit-xml.path stdout      Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.junit-xml.extended         Support extra JUnit XML fields.\\n      --output.teamcity.path stdout       Output path can be either stdout, `stderr` or path to the file to write to.\\n      --output.sarif.path stdout          Output path can be either stdout, `stderr` or path to the file to write to.\\n      --max-issues-per-linter int         Maximum issues count per one linter. Set to 0 to disable (default 50)\\n      --max-same-issues int               Maximum count of issues with the same text. Set to 0 to disable (default 3)\\n      --uniq-by-line                      Make issues output unique by line (default true)\\n  -n, --new                               Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\\n                                          It's a super-useful option for integration of golangci-lint into existing large codebase.\\n                                          It's not practical to fix all existing issues at the moment of integration: much better to not allow issues in new code.\\n                                          For CI setups, prefer --new-from-rev=HEAD~, as --new can skip linting the current patch if any scripts generate unstaged files before golangci-lint runs.\\n      --new-from-rev REV                  Show only new issues created after git revision REV\\n      --new-from-patch PATH               Show only new issues created in git patch with file path PATH\\n      --new-from-merge-base string        Show only new issues created after the best common ancestor (merge-base against HEAD)\\n      --whole-files                       Show issues in any part of update files (requires new-from-rev or new-from-patch)\\n      --fix                               Apply the fixes detected by the linters and formatters (if it's supported by the linter)\\n      --cpu-profile-path string           Path to CPU profile output file\\n      --mem-profile-path string           Path to memory profile output file\\n      --trace-path string                 Path to trace output file\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\",\n  \"lintersOutput\": \"List current linters configuration.\\n\\nUsage:\\n  golangci-lint linters [flags]\\n\\nFlags:\\n  -c, --config PATH           Read config from file path PATH\\n      --no-config             Don't read config file\\n      --default string        Default set of linters to enable (default \\\"standard\\\")\\n  -D, --disable strings       Disable specific linter\\n  -E, --enable strings        Enable specific linter\\n      --enable-only strings   Override linters configuration section to only run the specific linter(s)\\n      --fast-only             Filter enabled linters to run only fast linters\\n      --json                  Display as JSON\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\",\n  \"fmtOutput\": \"Format Go source files.\\n\\nUsage:\\n  golangci-lint fmt [flags]\\n\\nFlags:\\n  -c, --config PATH      Read config from file path PATH\\n      --no-config        Don't read config file\\n  -E, --enable strings   Enable specific formatter\\n  -d, --diff             Display diffs instead of rewriting files\\n      --diff-colored     Display diffs instead of rewriting files (with colors)\\n      --stdin            Use standard input for piping source files\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\",\n  \"formattersOutput\": \"List current formatters configuration.\\n\\nUsage:\\n  golangci-lint formatters [flags]\\n\\nFlags:\\n  -c, --config PATH      Read config from file path PATH\\n      --no-config        Don't read config file\\n  -E, --enable strings   Enable specific formatter\\n      --json             Display as JSON\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\",\n  \"helpOutput\": \"Display extra help\\n\\nUsage:\\n  golangci-lint help [flags]\\n  golangci-lint help [command]\\n\\nAvailable Commands:\\n  formatters  Display help for formatters.\\n  linters     Display help for linters.\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\\nUse \\\"golangci-lint help [command] --help\\\" for more information about a command.\\n\",\n  \"migrateOutput\": \"Migrate configuration file from v1 to v2.\\n\\nUsage:\\n  golangci-lint migrate [flags]\\n\\nFlags:\\n  -c, --config PATH       Read config from file path PATH\\n      --no-config         Don't read config file\\n      --format string     Output file format.\\n                          By default, the format of the input configuration file is used.\\n                          It can be 'yml', 'yaml', 'toml', or 'json'.\\n      --skip-validation   Skip validation of the configuration file against the JSON Schema for v1.\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\",\n  \"configOutput\": \"Configuration file information and verification.\\n\\nUsage:\\n  golangci-lint config [flags]\\n  golangci-lint config [command]\\n\\nAvailable Commands:\\n  path        Print used configuration path.\\n  verify      Verify configuration against JSON schema.\\n\\nFlags:\\n  -c, --config PATH   Read config from file path PATH\\n      --no-config     Don't read config file\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\\nUse \\\"golangci-lint config [command] --help\\\" for more information about a command.\\n\",\n  \"customOutput\": \"Build a version of golangci-lint with custom linters.\\n\\nUsage:\\n  golangci-lint custom [flags]\\n\\nFlags:\\n      --destination string   The directory path used to store the custom binary\\n      --name string          The name of the custom binary\\n      --version string       The golangci-lint version used to build the custom binary\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\",\n  \"cacheOutput\": \"Cache control and information.\\n\\nUsage:\\n  golangci-lint cache [flags]\\n  golangci-lint cache [command]\\n\\nAvailable Commands:\\n  clean       Clean cache\\n  status      Show cache status\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\\nUse \\\"golangci-lint cache [command] --help\\\" for more information about a command.\\n\",\n  \"versionOutput\": \"Display the golangci-lint version.\\n\\nUsage:\\n  golangci-lint version [flags]\\n\\nFlags:\\n      --debug   Add build information\\n      --json    Display as JSON\\n      --short   Display only the version number\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\",\n  \"completionOutput\": \"Generate the autocompletion script for golangci-lint for the specified shell.\\nSee each sub-command's help for details on how to use the generated script.\\n\\nUsage:\\n  golangci-lint completion [command]\\n\\nAvailable Commands:\\n  bash        Generate the autocompletion script for bash\\n  fish        Generate the autocompletion script for fish\\n  powershell  Generate the autocompletion script for powershell\\n  zsh         Generate the autocompletion script for zsh\\n\\nGlobal Flags:\\n      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default \\\"auto\\\")\\n  -h, --help           Help for a command\\n  -v, --verbose        Verbose output\\n\\nUse \\\"golangci-lint completion [command] --help\\\" for more information about a command.\\n\"\n}\n"
  },
  {
    "path": "docs/data/configuration_file.json",
    "content": "{\n  \"formatters\": \"formatters:\\n  # Enable specific formatter.\\n  # Default: [] (uses standard Go formatting)\\n  enable:\\n    - gci\\n    - gofmt\\n    - gofumpt\\n    - goimports\\n    - golines\\n    - swaggo\\n  # Formatters settings.\\n  settings:\\n    # See the dedicated \\\"formatters.settings\\\" documentation section.\\n    option: value\\n  exclusions:\\n    # Log a warning if an exclusion path is unused.\\n    # Default: false\\n    warn-unused: true\\n    # Mode of the generated files analysis.\\n    #\\n    # - `strict`: sources are excluded by strictly following the Go generated file convention.\\n    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\\\.$`\\n    #    This line must appear before the first non-comment, non-blank text in the file.\\n    #    https://go.dev/s/generatedcode\\n    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.\\n    # - `disable`: disable the generated files exclusion.\\n    #\\n    # Default: lax\\n    generated: strict\\n    # Which file paths to exclude.\\n    # This option is ignored when using `--stdin` as the path is unknown.\\n    # Default: []\\n    paths:\\n      - \\\".*\\\\\\\\.my\\\\\\\\.go$\\\"\\n      - lib/bad.go\\n\",\n  \"issues\": \"issues:\\n  # Maximum issues count per one linter.\\n  # Set to 0 to disable.\\n  # Default: 50\\n  max-issues-per-linter: 0\\n  # Maximum count of issues with the same text.\\n  # Set to 0 to disable.\\n  # Default: 3\\n  max-same-issues: 0\\n  # Make issues output unique by line.\\n  # Default: true\\n  uniq-by-line: false\\n  # Show only new issues: if there are unstaged changes or untracked files,\\n  # only those changes are analyzed, else only changes in HEAD~ are analyzed.\\n  # It's a super-useful option for integration of golangci-lint into existing large codebase.\\n  # It's not practical to fix all existing issues at the moment of integration:\\n  # much better don't allow issues in new code.\\n  #\\n  # Default: false\\n  new: true\\n  # Show only new issues created after the best common ancestor (merge-base against HEAD).\\n  # Default: \\\"\\\"\\n  new-from-merge-base: main\\n  # Show only new issues created after git revision `REV`.\\n  # Default: \\\"\\\"\\n  new-from-rev: HEAD\\n  # Show only new issues created in git patch with set file path.\\n  # Default: \\\"\\\"\\n  new-from-patch: path/to/patch/file\\n  # Show issues in any part of update files (requires new-from-rev or new-from-patch).\\n  # Default: false\\n  whole-files: true\\n  # Apply the fixes detected by the linters and formatters (if it's supported by the linter).\\n  # Default: false\\n  fix: true\\n\",\n  \"linters\": \"linters:\\n  # Default set of linters.\\n  # The value can be:\\n  # - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default\\n  # - `all`: enables all linters by default.\\n  # - `none`: disables all linters by default.\\n  # - `fast`: enables only linters considered as \\\"fast\\\" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`).\\n  # Default: standard\\n  default: all\\n  # Enable specific linter.\\n  enable:\\n    - arangolint\\n    - asasalint\\n    - asciicheck\\n    - bidichk\\n    - bodyclose\\n    - canonicalheader\\n    - containedctx\\n    - contextcheck\\n    - copyloopvar\\n    - cyclop\\n    - decorder\\n    - depguard\\n    - dogsled\\n    - dupl\\n    - dupword\\n    - durationcheck\\n    - embeddedstructfieldcheck\\n    - err113\\n    - errcheck\\n    - errchkjson\\n    - errname\\n    - errorlint\\n    - exhaustive\\n    - exhaustruct\\n    - exptostd\\n    - fatcontext\\n    - forbidigo\\n    - forcetypeassert\\n    - funcorder\\n    - funlen\\n    - ginkgolinter\\n    - gocheckcompilerdirectives\\n    - gochecknoglobals\\n    - gochecknoinits\\n    - gochecksumtype\\n    - gocognit\\n    - goconst\\n    - gocritic\\n    - gocyclo\\n    - godoclint\\n    - godot\\n    - godox\\n    - goheader\\n    - gomoddirectives\\n    - gomodguard\\n    - goprintffuncname\\n    - gosec\\n    - gosmopolitan\\n    - govet\\n    - grouper\\n    - iface\\n    - importas\\n    - inamedparam\\n    - ineffassign\\n    - interfacebloat\\n    - intrange\\n    - iotamixing\\n    - ireturn\\n    - lll\\n    - loggercheck\\n    - maintidx\\n    - makezero\\n    - mirror\\n    - misspell\\n    - mnd\\n    - modernize\\n    - musttag\\n    - nakedret\\n    - nestif\\n    - nilerr\\n    - nilnesserr\\n    - nilnil\\n    - nlreturn\\n    - noctx\\n    - noinlineerr\\n    - nolintlint\\n    - nonamedreturns\\n    - nosprintfhostport\\n    - paralleltest\\n    - perfsprint\\n    - prealloc\\n    - predeclared\\n    - promlinter\\n    - protogetter\\n    - reassign\\n    - recvcheck\\n    - revive\\n    - rowserrcheck\\n    - sloglint\\n    - spancheck\\n    - sqlclosecheck\\n    - staticcheck\\n    - tagalign\\n    - tagliatelle\\n    - testableexamples\\n    - testifylint\\n    - testpackage\\n    - thelper\\n    - tparallel\\n    - unconvert\\n    - unparam\\n    - unqueryvet\\n    - unused\\n    - usestdlibvars\\n    - usetesting\\n    - varnamelen\\n    - wastedassign\\n    - whitespace\\n    - wrapcheck\\n    - wsl\\n    - wsl_v5\\n    - zerologlint\\n  # Disable specific linters.\\n  disable:\\n    - arangolint\\n    - asasalint\\n    - asciicheck\\n    - bidichk\\n    - bodyclose\\n    - canonicalheader\\n    - containedctx\\n    - contextcheck\\n    - copyloopvar\\n    - cyclop\\n    - decorder\\n    - depguard\\n    - dogsled\\n    - dupl\\n    - dupword\\n    - durationcheck\\n    - embeddedstructfieldcheck\\n    - err113\\n    - errcheck\\n    - errchkjson\\n    - errname\\n    - errorlint\\n    - exhaustive\\n    - exhaustruct\\n    - exptostd\\n    - fatcontext\\n    - forbidigo\\n    - forcetypeassert\\n    - funcorder\\n    - funlen\\n    - ginkgolinter\\n    - gocheckcompilerdirectives\\n    - gochecknoglobals\\n    - gochecknoinits\\n    - gochecksumtype\\n    - gocognit\\n    - goconst\\n    - gocritic\\n    - gocyclo\\n    - godoclint\\n    - godot\\n    - godox\\n    - goheader\\n    - gomoddirectives\\n    - gomodguard\\n    - goprintffuncname\\n    - gosec\\n    - gosmopolitan\\n    - govet\\n    - grouper\\n    - iface\\n    - importas\\n    - inamedparam\\n    - ineffassign\\n    - interfacebloat\\n    - intrange\\n    - iotamixing\\n    - ireturn\\n    - lll\\n    - loggercheck\\n    - maintidx\\n    - makezero\\n    - mirror\\n    - misspell\\n    - mnd\\n    - modernize\\n    - musttag\\n    - nakedret\\n    - nestif\\n    - nilerr\\n    - nilnesserr\\n    - nilnil\\n    - nlreturn\\n    - noctx\\n    - noinlineerr\\n    - nolintlint\\n    - nonamedreturns\\n    - nosprintfhostport\\n    - paralleltest\\n    - perfsprint\\n    - prealloc\\n    - predeclared\\n    - promlinter\\n    - protogetter\\n    - reassign\\n    - recvcheck\\n    - revive\\n    - rowserrcheck\\n    - sloglint\\n    - spancheck\\n    - sqlclosecheck\\n    - staticcheck\\n    - tagalign\\n    - tagliatelle\\n    - testableexamples\\n    - testifylint\\n    - testpackage\\n    - thelper\\n    - tparallel\\n    - unconvert\\n    - unparam\\n    - unqueryvet\\n    - unused\\n    - usestdlibvars\\n    - usetesting\\n    - varnamelen\\n    - wastedassign\\n    - whitespace\\n    - wrapcheck\\n    - wsl\\n    - wsl_v5\\n    - zerologlint\\n  # All available settings of specific linters.\\n  settings:\\n    # See the dedicated \\\"linters.settings\\\" documentation section.\\n    option: value\\n  # Defines a set of rules to ignore issues.\\n  # It does not skip the analysis, and so does not ignore \\\"typecheck\\\" errors.\\n  exclusions:\\n    # Mode of the generated files analysis.\\n    #\\n    # - `strict`: sources are excluded by strictly following the Go generated file convention.\\n    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\\\.$`\\n    #    This line must appear before the first non-comment, non-blank text in the file.\\n    #    https://go.dev/s/generatedcode\\n    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.\\n    # - `disable`: disable the generated files exclusion.\\n    #\\n    # Default: strict\\n    generated: lax\\n    # Log a warning if an exclusion rule is unused.\\n    # Default: false\\n    warn-unused: true\\n    # Predefined exclusion rules.\\n    # Default: []\\n    presets:\\n      - comments\\n      - std-error-handling\\n      - common-false-positives\\n      - legacy\\n    # Excluding configuration per-path, per-linter, per-text and per-source.\\n    rules:\\n      # Exclude some linters from running on tests files.\\n      - path: _test\\\\.go\\n        linters:\\n          - gocyclo\\n          - errcheck\\n          - dupl\\n          - gosec\\n      # Run some linter only for test files by excluding its issues for everything else.\\n      - path-except: _test\\\\.go\\n        linters:\\n          - forbidigo\\n      # Exclude known linters from partially hard-vendored code,\\n      # which is impossible to exclude via `nolint` comments.\\n      # `/` will be replaced by the current OS file path separator to properly work on Windows.\\n      - path: internal/hmac/\\n        text: \\\"weak cryptographic primitive\\\"\\n        linters:\\n          - gosec\\n      # Exclude some `staticcheck` messages.\\n      - linters:\\n          - staticcheck\\n        text: \\\"SA9003:\\\"\\n      # Exclude `lll` issues for long lines with `go:generate`.\\n      - linters:\\n          - lll\\n        source: \\\"^//go:generate \\\"\\n    # Which file paths to exclude: they will be analyzed, but issues from them won't be reported.\\n    # \\\"/\\\" will be replaced by the current OS file path separator to properly work on Windows.\\n    # Default: []\\n    paths:\\n      - \\\".*\\\\\\\\.my\\\\\\\\.go$\\\"\\n      - lib/bad.go\\n    # Which file paths to not exclude.\\n    # Default: []\\n    paths-except:\\n      - \\\".*\\\\\\\\.my\\\\\\\\.go$\\\"\\n      - lib/bad.go\\n\",\n  \"output\": \"# Output configuration options.\\noutput:\\n  # The formats used to render issues.\\n  formats:\\n    # Prints issues in a text format with colors, line number, and linter name.\\n    # This format is the default format.\\n    text:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.txt\\n      # Print linter name in the end of issue text.\\n      # Default: true\\n      print-linter-name: false\\n      # Print lines of code with issue.\\n      # Default: true\\n      print-issued-lines: false\\n      # Use colors.\\n      # Default: true\\n      colors: false\\n    # Prints issues in a JSON representation.\\n    json:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.json\\n    # Prints issues in columns representation separated by tabulations.\\n    tab:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.txt\\n      # Print linter name in the end of issue text.\\n      # Default: true\\n      print-linter-name: true\\n      # Use colors.\\n      # Default: true\\n      colors: false\\n    # Prints issues in an HTML page.\\n    # It uses the Cloudflare CDN (cdnjs) and React.\\n    html:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.html\\n    # Prints issues in the Checkstyle format.\\n    checkstyle:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.xml\\n    # Prints issues in the Code Climate format.\\n    code-climate:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.json\\n    # Prints issues in the JUnit XML format.\\n    junit-xml:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.xml\\n      # Support extra JUnit XML fields.\\n      # Default: false\\n      extended: true\\n    # Prints issues in the TeamCity format.\\n    teamcity:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.txt\\n    # Prints issues in the SARIF format.\\n    sarif:\\n      # Output path can be either `stdout`, `stderr` or path to the file to write to.\\n      # Default: stdout\\n      path: ./path/to/output.json\\n  # Add a prefix to the output file references.\\n  # This option is ignored when using `output.path-mode: abs` mode.\\n  # Default: \\\"\\\"\\n  path-prefix: \\\"\\\"\\n  # By default, the report are related to the path obtained by `run.relative-path-mode`.\\n  # The mode `abs` allows to show absolute file paths instead of relative file paths.\\n  # The option `output.path-prefix` is ignored when using `abs` mode.\\n  # Default: \\\"\\\"\\n  path-mode: \\\"abs\\\"\\n  # Order to use when sorting results.\\n  # Possible values: `file`, `linter`, and `severity`.\\n  #\\n  # If the severity values are inside the following list, they are ordered in this order:\\n  #   1. error\\n  #   2. warning\\n  #   3. high\\n  #   4. medium\\n  #   5. low\\n  # Either they are sorted alphabetically.\\n  #\\n  # Default: [\\\"linter\\\", \\\"file\\\"]\\n  sort-order:\\n    - linter\\n    - severity\\n    - file # filepath, line, and column.\\n  # Show statistics per linter.\\n  # Default: true\\n  show-stats: false\\n\",\n  \"root\": \"# See the dedicated \\\"version\\\" documentation section.\\nversion: \\\"2\\\"\\nlinters:\\n  # See the dedicated \\\"linters\\\" documentation section.\\n  option: value\\nformatters:\\n  # See the dedicated \\\"formatters\\\" documentation section.\\n  option: value\\nissues:\\n  # See the dedicated \\\"issues\\\" documentation section.\\n  option: value\\n# Output configuration options.\\noutput:\\n  # See the dedicated \\\"output\\\" documentation section.\\n  option: value\\n# Options for analysis running.\\nrun:\\n  # See the dedicated \\\"run\\\" documentation section.\\n  option: value\\nseverity:\\n  # See the dedicated \\\"severity\\\" documentation section.\\n  option: value\\n\",\n  \"run\": \"# Options for analysis running.\\nrun:\\n  # Timeout for total work, e.g. 30s, 5m, 5m30s.\\n  # If the value is lower or equal to 0, the timeout is disabled.\\n  # Default: 0 (disabled)\\n  timeout: 5m\\n  # The mode used to evaluate relative paths.\\n  # It's used by exclusions, Go plugins, and some linters.\\n  # The value can be:\\n  # - `gomod`: the paths will be relative to the directory of the `go.mod` file.\\n  # - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`).\\n  # - `cfg`: the paths will be relative to the configuration file.\\n  # - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run.\\n  # Default: cfg\\n  relative-path-mode: gomod\\n  # Exit code when at least one issue was found.\\n  # Default: 1\\n  issues-exit-code: 2\\n  # Include test files or not.\\n  # Default: true\\n  tests: false\\n  # List of build tags, all linters use it.\\n  # Default: []\\n  build-tags:\\n    - mytag\\n  # If set, we pass it to \\\"go list -mod={option}\\\". From \\\"go help modules\\\":\\n  # If invoked with -mod=readonly, the go command is disallowed from the implicit\\n  # automatic updating of go.mod described above. Instead, it fails when any changes\\n  # to go.mod are needed. This setting is most useful to check that go.mod does\\n  # not need updates, such as in a continuous integration and testing system.\\n  # If invoked with -mod=vendor, the go command assumes that the vendor\\n  # directory holds the correct copies of dependencies and ignores\\n  # the dependency descriptions in go.mod.\\n  #\\n  # Allowed values: readonly|vendor|mod\\n  # Default: \\\"\\\"\\n  modules-download-mode: readonly\\n  # Uses version control information during the loading of packages.\\n  # Default: false (implies `-buildvcs=false`)\\n  enable-build-vcs: true\\n  # Allow multiple parallel golangci-lint instances running.\\n  # If false, golangci-lint acquires file lock on start.\\n  # Default: false\\n  allow-parallel-runners: true\\n  # Allow multiple golangci-lint instances running, but serialize them around a lock.\\n  # If false, golangci-lint exits with an error if it fails to acquire file lock on start.\\n  # Default: false\\n  allow-serial-runners: true\\n  # Define the Go version limit.\\n  # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22.\\n  go: '1.23'\\n  # Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously.\\n  # Default: 0 (automatically set to match Linux container CPU quota and\\n  # fall back to the number of logical CPUs in the machine)\\n  concurrency: 4\\n\",\n  \"severity\": \"severity:\\n  # Set the default severity for issues.\\n  #\\n  # If severity rules are defined and the issues do not match or no severity is provided to the rule\\n  # this will be the default severity applied.\\n  # Severities should match the supported severity names of the selected out format.\\n  # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity\\n  # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel\\n  # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message\\n  # - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance\\n  #\\n  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)\\n  #\\n  # Default: \\\"\\\"\\n  default: error\\n  # When a list of severity rules are provided, severity information will be added to lint issues.\\n  # Severity rules have the same filtering capability as exclude rules\\n  # except you are allowed to specify one matcher per severity rule.\\n  #\\n  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)\\n  #\\n  # Only affects out formats that support setting severity information.\\n  #\\n  # Default: []\\n  rules:\\n    - linters:\\n        - dupl\\n      severity: info\\n\",\n  \"version\": \"# Defines the configuration version.\\n# The only possible value is \\\"2\\\".\\nversion: \\\"2\\\"\\n\"\n}\n"
  },
  {
    "path": "docs/data/exclusion_presets.json",
    "content": "{\n  \"comments\": [\n    {\n      \"linters\": [\n        \"staticcheck\"\n      ],\n      \"text\": \"(ST1000|ST1020|ST1021|ST1022)\"\n    },\n    {\n      \"linters\": [\n        \"revive\"\n      ],\n      \"text\": \"exported (.+) should have comment( \\\\(or a comment on this block\\\\))? or be unexported\"\n    },\n    {\n      \"linters\": [\n        \"revive\"\n      ],\n      \"text\": \"package comment should be of the form \\\"(.+)...\\\"\"\n    },\n    {\n      \"linters\": [\n        \"revive\"\n      ],\n      \"text\": \"comment on exported (.+) should be of the form \\\"(.+)...\\\"\"\n    },\n    {\n      \"linters\": [\n        \"revive\"\n      ],\n      \"text\": \"should have a package comment\"\n    }\n  ],\n  \"common-false-positives\": [\n    {\n      \"linters\": [\n        \"gosec\"\n      ],\n      \"text\": \"G103: Use of unsafe calls should be audited\"\n    },\n    {\n      \"linters\": [\n        \"gosec\"\n      ],\n      \"text\": \"G204: Subprocess launched with variable\"\n    },\n    {\n      \"linters\": [\n        \"gosec\"\n      ],\n      \"text\": \"G304: Potential file inclusion via variable\"\n    }\n  ],\n  \"legacy\": [\n    {\n      \"linters\": [\n        \"govet\"\n      ],\n      \"text\": \"(possible misuse of unsafe.Pointer|should have signature)\"\n    },\n    {\n      \"linters\": [\n        \"staticcheck\"\n      ],\n      \"text\": \"SA4011\"\n    },\n    {\n      \"linters\": [\n        \"gosec\"\n      ],\n      \"text\": \"G104\"\n    },\n    {\n      \"linters\": [\n        \"gosec\"\n      ],\n      \"text\": \"(G301|G302|G307): Expect (directory permissions to be 0750|file permissions to be 0600) or less\"\n    }\n  ],\n  \"std-error-handling\": [\n    {\n      \"linters\": [\n        \"errcheck\"\n      ],\n      \"text\": \"(?i)Error return value of .((os\\\\.)?std(out|err)\\\\..*|.*Close|.*Flush|os\\\\.Remove(All)?|.*print(f|ln)?|os\\\\.(Un)?Setenv). is not checked\"\n    }\n  ]\n}\n"
  },
  {
    "path": "docs/data/formatters_info.json",
    "content": "[\n  {\n    \"name\": \"gci\",\n    \"desc\": \"Check if code and import statements are formatted, with additional rules.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/daixiang0/gci\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.30.0\"\n  },\n  {\n    \"name\": \"gofmt\",\n    \"desc\": \"Check if the code is formatted according to 'gofmt' command.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://pkg.go.dev/cmd/gofmt\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"gofumpt\",\n    \"desc\": \"Check if code and import statements are formatted, with additional rules.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/mvdan/gofumpt\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.28.0\"\n  },\n  {\n    \"name\": \"golines\",\n    \"desc\": \"Checks if code is formatted, and fixes long lines\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/segmentio/golines\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v2.0.0\"\n  },\n  {\n    \"name\": \"goimports\",\n    \"desc\": \"Checks if the code and import statements are formatted according to the 'goimports' command.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://pkg.go.dev/golang.org/x/tools/cmd/goimports\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.20.0\"\n  },\n  {\n    \"name\": \"swaggo\",\n    \"desc\": \"Check if swaggo comments are formatted\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/swaggo/swag\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v2.2.0\"\n  }\n]\n"
  },
  {
    "path": "docs/data/icons.yaml",
    "content": "heart-red: <svg xmlns=\"http://www.w3.org/2000/svg\" color=\"red\" fill=\"red\" viewBox=\"0 0 24 24\" stroke-width=\"2\" stroke=\"currentColor\" aria-hidden=\"true\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\"/></svg>\n"
  },
  {
    "path": "docs/data/linters_info.json",
    "content": "[\n  {\n    \"name\": \"arangolint\",\n    \"desc\": \"opinionated best practices for arangodb client\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/Crocmagnon/arangolint\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v2.2.0\"\n  },\n  {\n    \"name\": \"asasalint\",\n    \"desc\": \"check for pass []any as any in variadic func(...any)\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/alingse/asasalint\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.47.0\"\n  },\n  {\n    \"name\": \"asciicheck\",\n    \"desc\": \"checks that all code identifiers does not have non-ASCII symbols in the name\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/golangci/asciicheck\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.26.0\"\n  },\n  {\n    \"name\": \"bidichk\",\n    \"desc\": \"Checks for dangerous unicode character sequences\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/breml/bidichk\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.43.0\"\n  },\n  {\n    \"name\": \"bodyclose\",\n    \"desc\": \"checks whether HTTP response body is closed successfully\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/timakin/bodyclose\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.18.0\"\n  },\n  {\n    \"name\": \"canonicalheader\",\n    \"desc\": \"canonicalheader checks whether net/http.Header uses canonical header\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/lasiar/canonicalheader\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.58.0\"\n  },\n  {\n    \"name\": \"containedctx\",\n    \"desc\": \"containedctx is a linter that detects struct contained context.Context field\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/sivchari/containedctx\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.44.0\"\n  },\n  {\n    \"name\": \"contextcheck\",\n    \"desc\": \"check whether the function uses a non-inherited context\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/kkHAIKE/contextcheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.43.0\"\n  },\n  {\n    \"name\": \"copyloopvar\",\n    \"desc\": \"a linter detects places where loop variables are copied\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/karamaru-alpha/copyloopvar\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.57.0\"\n  },\n  {\n    \"name\": \"cyclop\",\n    \"desc\": \"checks function and package cyclomatic complexity\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/bkielbasa/cyclop\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.37.0\"\n  },\n  {\n    \"name\": \"decorder\",\n    \"desc\": \"check declaration order and count of types, constants, variables and functions\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://gitlab.com/bosi/decorder\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.44.0\"\n  },\n  {\n    \"name\": \"depguard\",\n    \"desc\": \"Go linter that checks if package imports are in a list of acceptable packages\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/OpenPeeDeeP/depguard\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.4.0\"\n  },\n  {\n    \"name\": \"dogsled\",\n    \"desc\": \"Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/alexkohler/dogsled\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.19.0\"\n  },\n  {\n    \"name\": \"dupl\",\n    \"desc\": \"Detects duplicate fragments of code.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/mibk/dupl\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"dupword\",\n    \"desc\": \"Checks for duplicate words in the source code\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/Abirdcfly/dupword\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.50.0\"\n  },\n  {\n    \"name\": \"durationcheck\",\n    \"desc\": \"check for two durations multiplied together\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/charithe/durationcheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.37.0\"\n  },\n  {\n    \"name\": \"embeddedstructfieldcheck\",\n    \"desc\": \"Embedded types should be at the top of the field list of a struct, and there must be an empty line separating embedded fields from regular fields.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/manuelarte/embeddedstructfieldcheck\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v2.2.0\"\n  },\n  {\n    \"name\": \"errcheck\",\n    \"desc\": \"errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases\",\n    \"groups\": [\n      \"standard\"\n    ],\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/kisielk/errcheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"errchkjson\",\n    \"desc\": \"Checks types passed to the json encoding functions. Reports unsupported types and reports occurrences where the check for the returned error can be omitted.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/breml/errchkjson\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.44.0\"\n  },\n  {\n    \"name\": \"errname\",\n    \"desc\": \"Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/Antonboom/errname\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.42.0\"\n  },\n  {\n    \"name\": \"errorlint\",\n    \"desc\": \"Find code that can cause problems with the error wrapping scheme introduced in Go 1.13.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://codeberg.org/polyfloyd/go-errorlint\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.32.0\"\n  },\n  {\n    \"name\": \"exhaustive\",\n    \"desc\": \"check exhaustiveness of enum switch statements\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/nishanths/exhaustive\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.28.0\"\n  },\n  {\n    \"name\": \"exhaustruct\",\n    \"desc\": \"Checks if all structure fields are initialized\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/GaijinEntertainment/go-exhaustruct\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.46.0\"\n  },\n  {\n    \"name\": \"exptostd\",\n    \"desc\": \"Detects functions from golang.org/x/exp/ that can be replaced by std functions.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ldez/exptostd\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.63.0\"\n  },\n  {\n    \"name\": \"forbidigo\",\n    \"desc\": \"Forbids identifiers\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ashanbrown/forbidigo\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.34.0\"\n  },\n  {\n    \"name\": \"forcetypeassert\",\n    \"desc\": \"Find forced type assertions\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/gostaticanalysis/forcetypeassert\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.38.0\"\n  },\n  {\n    \"name\": \"funcorder\",\n    \"desc\": \"checks the order of functions, methods, and constructors\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/manuelarte/funcorder\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v2.1.0\"\n  },\n  {\n    \"name\": \"fatcontext\",\n    \"desc\": \"detects nested contexts in loops and function literals\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/Crocmagnon/fatcontext\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.58.0\"\n  },\n  {\n    \"name\": \"funlen\",\n    \"desc\": \"Checks for long functions.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/ultraware/funlen\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.18.0\"\n  },\n  {\n    \"name\": \"ginkgolinter\",\n    \"desc\": \"enforces standards of using ginkgo and gomega\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/nunnatsa/ginkgolinter\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.51.0\"\n  },\n  {\n    \"name\": \"gocheckcompilerdirectives\",\n    \"desc\": \"Checks that go compiler directive comments (//go:) are valid.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/leighmcculloch/gocheckcompilerdirectives\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.51.0\"\n  },\n  {\n    \"name\": \"gochecknoglobals\",\n    \"desc\": \"Check that no global variables exist.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/leighmcculloch/gochecknoglobals\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.12.0\"\n  },\n  {\n    \"name\": \"gochecknoinits\",\n    \"desc\": \"Checks that no init functions are present in Go code\",\n    \"loadMode\": 8199,\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.12.0\"\n  },\n  {\n    \"name\": \"gochecksumtype\",\n    \"desc\": \"Run exhaustiveness checks on Go \\\"sum types\\\"\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/alecthomas/go-check-sumtype\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.55.0\"\n  },\n  {\n    \"name\": \"gocognit\",\n    \"desc\": \"Computes and checks the cognitive complexity of functions\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/uudashr/gocognit\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.20.0\"\n  },\n  {\n    \"name\": \"goconst\",\n    \"desc\": \"Finds repeated strings that could be replaced by a constant\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/jgautheron/goconst\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"gocritic\",\n    \"desc\": \"Provides diagnostics that check for bugs, performance and style issues.\\nExtensible without recompilation through dynamic rules.\\nDynamic rules are written declaratively with AST patterns, filters, report message and optional suggestion.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/go-critic/go-critic\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.12.0\"\n  },\n  {\n    \"name\": \"gocyclo\",\n    \"desc\": \"Computes and checks the cyclomatic complexity of functions\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/fzipp/gocyclo\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"godoclint\",\n    \"desc\": \"Checks Golang's documentation practice (godoc)\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/godoc-lint/godoc-lint\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v2.5.0\"\n  },\n  {\n    \"name\": \"godot\",\n    \"desc\": \"Check if comments end in a period\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/tetafro/godot\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.25.0\"\n  },\n  {\n    \"name\": \"godox\",\n    \"desc\": \"Detects usage of FIXME, TODO and other keywords inside comments\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/matoous/godox\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.19.0\"\n  },\n  {\n    \"name\": \"err113\",\n    \"desc\": \"Check errors handling expressions\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/Djarvur/go-err113\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.26.0\"\n  },\n  {\n    \"name\": \"goheader\",\n    \"desc\": \"Check if file header matches to pattern\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/denis-tingaikin/go-header\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.28.0\"\n  },\n  {\n    \"name\": \"mnd\",\n    \"desc\": \"An analyzer to detect magic numbers.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/tommy-muehle/go-mnd\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.22.0\"\n  },\n  {\n    \"name\": \"modernize\",\n    \"desc\": \"A suite of analyzers that suggest simplifications to Go code, using modern language and library features.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/modernize\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v2.6.0\"\n  },\n  {\n    \"name\": \"gomoddirectives\",\n    \"desc\": \"Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/ldez/gomoddirectives\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.39.0\"\n  },\n  {\n    \"name\": \"gomodguard\",\n    \"desc\": \"Allow and blocklist linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/ryancurrah/gomodguard\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.25.0\"\n  },\n  {\n    \"name\": \"goprintffuncname\",\n    \"desc\": \"Checks that printf-like functions are named with `f` at the end.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/golangci/go-printf-func-name\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.23.0\"\n  },\n  {\n    \"name\": \"gosec\",\n    \"desc\": \"Inspects source code for security problems\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/securego/gosec\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"gosmopolitan\",\n    \"desc\": \"Report certain i18n/l10n anti-patterns in your Go codebase\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/xen0n/gosmopolitan\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.53.0\"\n  },\n  {\n    \"name\": \"govet\",\n    \"desc\": \"Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes.\",\n    \"groups\": [\n      \"standard\"\n    ],\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://pkg.go.dev/cmd/vet\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"grouper\",\n    \"desc\": \"Analyze expression groups.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/leonklingele/grouper\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.44.0\"\n  },\n  {\n    \"name\": \"iface\",\n    \"desc\": \"Detect the incorrect use of interfaces, helping developers avoid interface pollution.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/uudashr/iface\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.62.0\"\n  },\n  {\n    \"name\": \"importas\",\n    \"desc\": \"Enforces consistent import aliases\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/julz/importas\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.38.0\"\n  },\n  {\n    \"name\": \"inamedparam\",\n    \"desc\": \"reports interfaces with unnamed method parameters\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/macabu/inamedparam\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.55.0\"\n  },\n  {\n    \"name\": \"ineffassign\",\n    \"desc\": \"detects when assignments to existing variables are not used\",\n    \"groups\": [\n      \"standard\"\n    ],\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/gordonklaus/ineffassign\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"interfacebloat\",\n    \"desc\": \"A linter that checks the number of methods inside an interface.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/sashamelentyev/interfacebloat\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.49.0\"\n  },\n  {\n    \"name\": \"intrange\",\n    \"desc\": \"intrange is a linter to find places where for loops could make use of an integer range.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/ckaznocha/intrange\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.57.0\"\n  },\n  {\n    \"name\": \"iotamixing\",\n    \"desc\": \"checks if iotas are being used in const blocks with other non-iota declarations.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/AdminBenni/iota-mixing\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v2.5.0\"\n  },\n  {\n    \"name\": \"ireturn\",\n    \"desc\": \"Accept Interfaces, Return Concrete Types\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/butuzov/ireturn\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.43.0\"\n  },\n  {\n    \"name\": \"lll\",\n    \"desc\": \"Reports long lines\",\n    \"loadMode\": 8199,\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.8.0\"\n  },\n  {\n    \"name\": \"loggercheck\",\n    \"desc\": \"Checks key value pairs for common logger libraries (kitlog,klog,logr,slog,zap).\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/timonwong/loggercheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.49.0\"\n  },\n  {\n    \"name\": \"maintidx\",\n    \"desc\": \"maintidx measures the maintainability index of each function.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/yagipy/maintidx\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.44.0\"\n  },\n  {\n    \"name\": \"makezero\",\n    \"desc\": \"Find slice declarations with non-zero initial length\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ashanbrown/makezero\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.34.0\"\n  },\n  {\n    \"name\": \"mirror\",\n    \"desc\": \"reports wrong mirror patterns of bytes/strings usage\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/butuzov/mirror\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.53.0\"\n  },\n  {\n    \"name\": \"misspell\",\n    \"desc\": \"Finds commonly misspelled English words\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/golangci/misspell\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.8.0\"\n  },\n  {\n    \"name\": \"musttag\",\n    \"desc\": \"enforce field tags in (un)marshaled structs\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/go-simpler/musttag\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.51.0\"\n  },\n  {\n    \"name\": \"nakedret\",\n    \"desc\": \"Checks that functions with naked returns are not longer than a maximum size (can be zero).\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/alexkohler/nakedret\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.19.0\"\n  },\n  {\n    \"name\": \"nestif\",\n    \"desc\": \"Reports deeply nested if statements\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/nakabonne/nestif\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.25.0\"\n  },\n  {\n    \"name\": \"nilerr\",\n    \"desc\": \"Find the code that returns nil even if it checks that the error is not nil.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/gostaticanalysis/nilerr\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.38.0\"\n  },\n  {\n    \"name\": \"nilnesserr\",\n    \"desc\": \"Reports constructs that checks for err != nil, but returns a different nil value error.\\nPowered by nilness and nilerr.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/alingse/nilnesserr\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.63.0\"\n  },\n  {\n    \"name\": \"nilnil\",\n    \"desc\": \"Checks that there is no simultaneous return of `nil` error and an invalid value.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/Antonboom/nilnil\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.43.0\"\n  },\n  {\n    \"name\": \"nlreturn\",\n    \"desc\": \"Checks for a new line before return and branch statements to increase code clarity\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/ssgreg/nlreturn\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.30.0\"\n  },\n  {\n    \"name\": \"noctx\",\n    \"desc\": \"Detects function and method with missing usage of context.Context\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/sonatard/noctx\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.28.0\"\n  },\n  {\n    \"name\": \"noinlineerr\",\n    \"desc\": \"Disallows inline error handling (`if err := ...; err != nil {`)\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/AlwxSin/noinlineerr\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v2.2.0\"\n  },\n  {\n    \"name\": \"nonamedreturns\",\n    \"desc\": \"Reports all named returns\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/firefart/nonamedreturns\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.46.0\"\n  },\n  {\n    \"name\": \"nosprintfhostport\",\n    \"desc\": \"Checks for misuse of Sprintf to construct a host with port in a URL.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/stbenjam/no-sprintf-host-port\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.46.0\"\n  },\n  {\n    \"name\": \"paralleltest\",\n    \"desc\": \"Detects missing usage of t.Parallel() method in your Go test\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/kunwardeep/paralleltest\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.33.0\"\n  },\n  {\n    \"name\": \"perfsprint\",\n    \"desc\": \"Checks that fmt.Sprintf can be replaced with a faster alternative.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/catenacyber/perfsprint\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.55.0\"\n  },\n  {\n    \"name\": \"prealloc\",\n    \"desc\": \"Find slice declarations that could potentially be pre-allocated\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/alexkohler/prealloc\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.19.0\"\n  },\n  {\n    \"name\": \"predeclared\",\n    \"desc\": \"find code that shadows one of Go's predeclared identifiers\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/nishanths/predeclared\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.35.0\"\n  },\n  {\n    \"name\": \"promlinter\",\n    \"desc\": \"Check Prometheus metrics naming via promlint\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/yeya24/promlinter\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.40.0\"\n  },\n  {\n    \"name\": \"protogetter\",\n    \"desc\": \"Reports direct reads from proto message fields when getters should be used\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ghostiam/protogetter\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.55.0\"\n  },\n  {\n    \"name\": \"reassign\",\n    \"desc\": \"Checks that package variables are not reassigned\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/curioswitch/go-reassign\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.49.0\"\n  },\n  {\n    \"name\": \"recvcheck\",\n    \"desc\": \"checks for receiver type consistency\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/raeperd/recvcheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.62.0\"\n  },\n  {\n    \"name\": \"revive\",\n    \"desc\": \"Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/mgechev/revive\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.37.0\"\n  },\n  {\n    \"name\": \"rowserrcheck\",\n    \"desc\": \"checks whether Rows.Err of rows is checked successfully\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/jingyugao/rowserrcheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.23.0\"\n  },\n  {\n    \"name\": \"sloglint\",\n    \"desc\": \"ensure consistent code style when using log/slog\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/go-simpler/sloglint\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.55.0\"\n  },\n  {\n    \"name\": \"sqlclosecheck\",\n    \"desc\": \"Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ryanrolds/sqlclosecheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.28.0\"\n  },\n  {\n    \"name\": \"spancheck\",\n    \"desc\": \"Checks for mistakes with OpenTelemetry/Census spans.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/jjti/go-spancheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.56.0\"\n  },\n  {\n    \"name\": \"staticcheck\",\n    \"desc\": \"It's the set of rules from staticcheck.\",\n    \"groups\": [\n      \"standard\"\n    ],\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/dominikh/go-tools\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"tagalign\",\n    \"desc\": \"check that struct tags are well aligned\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/4meepo/tagalign\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.53.0\"\n  },\n  {\n    \"name\": \"tagliatelle\",\n    \"desc\": \"Checks the struct tags.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ldez/tagliatelle\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.40.0\"\n  },\n  {\n    \"name\": \"testableexamples\",\n    \"desc\": \"linter checks if examples are testable (have an expected output)\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/maratori/testableexamples\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.50.0\"\n  },\n  {\n    \"name\": \"testifylint\",\n    \"desc\": \"Checks usage of github.com/stretchr/testify.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/Antonboom/testifylint\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.55.0\"\n  },\n  {\n    \"name\": \"testpackage\",\n    \"desc\": \"linter that makes you use a separate _test package\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/maratori/testpackage\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v1.25.0\"\n  },\n  {\n    \"name\": \"thelper\",\n    \"desc\": \"thelper detects tests helpers which do not start with the t.Helper() method.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/kulti/thelper\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.34.0\"\n  },\n  {\n    \"name\": \"tparallel\",\n    \"desc\": \"tparallel detects inappropriate usage of t.Parallel() method in your Go test codes.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/moricho/tparallel\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.32.0\"\n  },\n  {\n    \"name\": \"typecheck\",\n    \"desc\": \"Like the front-end of a Go compiler, parses and type-checks Go code\",\n    \"loadMode\": 8199,\n    \"internal\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.3.0\"\n  },\n  {\n    \"name\": \"unconvert\",\n    \"desc\": \"Remove unnecessary type conversions\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/mdempsky/unconvert\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.0.0\"\n  },\n  {\n    \"name\": \"unparam\",\n    \"desc\": \"Reports unused function parameters\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/mvdan/unparam\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.9.0\"\n  },\n  {\n    \"name\": \"unqueryvet\",\n    \"desc\": \"detects SELECT * in SQL queries and SQL builders, preventing performance issues and encouraging explicit column selection\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/MirrexOne/unqueryvet\",\n    \"internal\": false,\n    \"isSlow\": false,\n    \"since\": \"v2.5.0\"\n  },\n  {\n    \"name\": \"unused\",\n    \"desc\": \"Checks Go code for unused constants, variables, functions and types\",\n    \"groups\": [\n      \"standard\"\n    ],\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/dominikh/go-tools/tree/HEAD/unused\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"doesChangeTypes\": true,\n    \"since\": \"v1.20.0\"\n  },\n  {\n    \"name\": \"usestdlibvars\",\n    \"desc\": \"A linter that detect the possibility to use variables/constants from the Go standard library.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/sashamelentyev/usestdlibvars\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.48.0\"\n  },\n  {\n    \"name\": \"usetesting\",\n    \"desc\": \"Reports uses of functions with replacement inside the testing package.\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ldez/usetesting\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v1.63.0\"\n  },\n  {\n    \"name\": \"varnamelen\",\n    \"desc\": \"checks that the length of a variable's name matches its scope\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/blizzy78/varnamelen\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.43.0\"\n  },\n  {\n    \"name\": \"wastedassign\",\n    \"desc\": \"Finds wasted assignment statements\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/sanposhiho/wastedassign\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.38.0\"\n  },\n  {\n    \"name\": \"whitespace\",\n    \"desc\": \"Whitespace is a linter that checks for unnecessary newlines at the start and end of functions, if, for, etc.\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/ultraware/whitespace\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.19.0\"\n  },\n  {\n    \"name\": \"wrapcheck\",\n    \"desc\": \"Checks that errors returned from external packages are wrapped\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/tomarrell/wrapcheck\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.32.0\"\n  },\n  {\n    \"name\": \"wsl\",\n    \"desc\": \"add or remove empty lines\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/bombsimon/wsl\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.20.0\",\n    \"deprecation\": {\n      \"since\": \"v2.2.0\",\n      \"message\": \"new major version.\",\n      \"replacement\": \"wsl_v5\"\n    }\n  },\n  {\n    \"name\": \"wsl_v5\",\n    \"desc\": \"add or remove empty lines\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/bombsimon/wsl\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": true,\n    \"since\": \"v2.2.0\"\n  },\n  {\n    \"name\": \"zerologlint\",\n    \"desc\": \"Detects the wrong usage of `zerolog` that a user forgets to dispatch with `Send` or `Msg`\",\n    \"loadMode\": 8767,\n    \"originalURL\": \"https://github.com/ykadowak/zerologlint\",\n    \"internal\": false,\n    \"isSlow\": true,\n    \"since\": \"v1.53.0\"\n  },\n  {\n    \"name\": \"nolintlint\",\n    \"desc\": \"Reports ill-formed or insufficient nolint directives\",\n    \"loadMode\": 8199,\n    \"originalURL\": \"https://github.com/golangci/golangci-lint/tree/HEAD/pkg/golinters/nolintlint/internal\",\n    \"internal\": false,\n    \"canAutoFix\": true,\n    \"isSlow\": false,\n    \"since\": \"v1.26.0\"\n  }\n]\n"
  },
  {
    "path": "docs/data/thanks.json",
    "content": "[\n  {\n    \"name\": \"4meepo\",\n    \"linters\": [\n      \"tagalign\"\n    ],\n    \"profile\": \"https://github.com/sponsors/4meepo\",\n    \"avatar\": \"https://github.com/4meepo.png\"\n  },\n  {\n    \"name\": \"Abirdcfly\",\n    \"linters\": [\n      \"dupword\"\n    ],\n    \"profile\": \"https://github.com/sponsors/Abirdcfly\",\n    \"avatar\": \"https://github.com/Abirdcfly.png\"\n  },\n  {\n    \"name\": \"AdminBenni\",\n    \"linters\": [\n      \"iotamixing\"\n    ],\n    \"profile\": \"https://github.com/sponsors/AdminBenni\",\n    \"avatar\": \"https://github.com/AdminBenni.png\"\n  },\n  {\n    \"name\": \"alecthomas\",\n    \"linters\": [\n      \"gochecksumtype\"\n    ],\n    \"profile\": \"https://github.com/sponsors/alecthomas\",\n    \"avatar\": \"https://github.com/alecthomas.png\"\n  },\n  {\n    \"name\": \"alexkohler\",\n    \"linters\": [\n      \"dogsled\",\n      \"nakedret\",\n      \"prealloc\"\n    ],\n    \"profile\": \"https://github.com/sponsors/alexkohler\",\n    \"avatar\": \"https://github.com/alexkohler.png\"\n  },\n  {\n    \"name\": \"alingse\",\n    \"linters\": [\n      \"asasalint\",\n      \"nilnesserr\"\n    ],\n    \"profile\": \"https://github.com/sponsors/alingse\",\n    \"avatar\": \"https://github.com/alingse.png\"\n  },\n  {\n    \"name\": \"AlwxSin\",\n    \"linters\": [\n      \"noinlineerr\"\n    ],\n    \"profile\": \"https://github.com/sponsors/AlwxSin\",\n    \"avatar\": \"https://github.com/AlwxSin.png\"\n  },\n  {\n    \"name\": \"Antonboom\",\n    \"linters\": [\n      \"errname\",\n      \"nilnil\",\n      \"testifylint\"\n    ],\n    \"profile\": \"https://github.com/sponsors/Antonboom\",\n    \"avatar\": \"https://github.com/Antonboom.png\"\n  },\n  {\n    \"name\": \"ashanbrown\",\n    \"linters\": [\n      \"forbidigo\",\n      \"makezero\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ashanbrown\",\n    \"avatar\": \"https://github.com/ashanbrown.png\"\n  },\n  {\n    \"name\": \"babakks\",\n    \"linters\": [\n      \"godoclint\"\n    ],\n    \"profile\": \"https://github.com/sponsors/babakks\",\n    \"avatar\": \"https://github.com/babakks.png\"\n  },\n  {\n    \"name\": \"bkielbasa\",\n    \"linters\": [\n      \"cyclop\"\n    ],\n    \"profile\": \"https://github.com/sponsors/bkielbasa\",\n    \"avatar\": \"https://github.com/bkielbasa.png\"\n  },\n  {\n    \"name\": \"blizzy78\",\n    \"linters\": [\n      \"varnamelen\"\n    ],\n    \"profile\": \"https://github.com/sponsors/blizzy78\",\n    \"avatar\": \"https://github.com/blizzy78.png\"\n  },\n  {\n    \"name\": \"bombsimon\",\n    \"linters\": [\n      \"wsl\",\n      \"wsl_v5\"\n    ],\n    \"profile\": \"https://github.com/sponsors/bombsimon\",\n    \"avatar\": \"https://github.com/bombsimon.png\"\n  },\n  {\n    \"name\": \"bosi\",\n    \"linters\": [\n      \"decorder\"\n    ],\n    \"profile\": \"https://gitlab.com/bosi\",\n    \"avatar\": \"https://github.com/bosix.png\"\n  },\n  {\n    \"name\": \"breml\",\n    \"linters\": [\n      \"bidichk\",\n      \"errchkjson\"\n    ],\n    \"profile\": \"https://github.com/sponsors/breml\",\n    \"avatar\": \"https://github.com/breml.png\"\n  },\n  {\n    \"name\": \"butuzov\",\n    \"linters\": [\n      \"ireturn\",\n      \"mirror\"\n    ],\n    \"profile\": \"https://github.com/sponsors/butuzov\",\n    \"avatar\": \"https://github.com/butuzov.png\"\n  },\n  {\n    \"name\": \"catenacyber\",\n    \"linters\": [\n      \"perfsprint\"\n    ],\n    \"profile\": \"https://github.com/sponsors/catenacyber\",\n    \"avatar\": \"https://github.com/catenacyber.png\"\n  },\n  {\n    \"name\": \"charithe\",\n    \"linters\": [\n      \"durationcheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/charithe\",\n    \"avatar\": \"https://github.com/charithe.png\"\n  },\n  {\n    \"name\": \"chokoswitch\",\n    \"linters\": [\n      \"reassign\"\n    ],\n    \"profile\": \"https://github.com/sponsors/chokoswitch\",\n    \"avatar\": \"https://github.com/chokoswitch.png\"\n  },\n  {\n    \"name\": \"ckaznocha\",\n    \"linters\": [\n      \"intrange\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ckaznocha\",\n    \"avatar\": \"https://github.com/ckaznocha.png\"\n  },\n  {\n    \"name\": \"client9\",\n    \"linters\": [\n      \"misspell\"\n    ],\n    \"profile\": \"https://github.com/sponsors/client9\",\n    \"avatar\": \"https://github.com/client9.png\"\n  },\n  {\n    \"name\": \"Crocmagnon\",\n    \"linters\": [\n      \"arangolint\",\n      \"fatcontext\"\n    ],\n    \"profile\": \"https://github.com/sponsors/Crocmagnon\",\n    \"avatar\": \"https://github.com/Crocmagnon.png\"\n  },\n  {\n    \"name\": \"daixiang0\",\n    \"linters\": [\n      \"gci\"\n    ],\n    \"profile\": \"https://github.com/sponsors/daixiang0\",\n    \"avatar\": \"https://github.com/daixiang0.png\"\n  },\n  {\n    \"name\": \"denis-tingaikin\",\n    \"linters\": [\n      \"goheader\"\n    ],\n    \"profile\": \"https://github.com/sponsors/denis-tingaikin\",\n    \"avatar\": \"https://github.com/denis-tingaikin.png\"\n  },\n  {\n    \"name\": \"dixonwille\",\n    \"linters\": [\n      \"depguard\"\n    ],\n    \"profile\": \"https://github.com/sponsors/dixonwille\",\n    \"avatar\": \"https://github.com/dixonwille.png\"\n  },\n  {\n    \"name\": \"Djarvur\",\n    \"linters\": [\n      \"err113\"\n    ],\n    \"profile\": \"https://github.com/sponsors/Djarvur\",\n    \"avatar\": \"https://github.com/Djarvur.png\"\n  },\n  {\n    \"name\": \"dominikh\",\n    \"linters\": [\n      \"staticcheck\",\n      \"unused\"\n    ],\n    \"profile\": \"https://github.com/sponsors/dominikh\",\n    \"avatar\": \"https://github.com/dominikh.png\"\n  },\n  {\n    \"name\": \"firefart\",\n    \"linters\": [\n      \"nonamedreturns\"\n    ],\n    \"profile\": \"https://github.com/sponsors/firefart\",\n    \"avatar\": \"https://github.com/firefart.png\"\n  },\n  {\n    \"name\": \"fzipp\",\n    \"linters\": [\n      \"gocyclo\"\n    ],\n    \"profile\": \"https://github.com/sponsors/fzipp\",\n    \"avatar\": \"https://github.com/fzipp.png\"\n  },\n  {\n    \"name\": \"ghostiam\",\n    \"linters\": [\n      \"protogetter\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ghostiam\",\n    \"avatar\": \"https://github.com/ghostiam.png\"\n  },\n  {\n    \"name\": \"go-critic\",\n    \"linters\": [\n      \"gocritic\"\n    ],\n    \"profile\": \"https://github.com/sponsors/go-critic\",\n    \"avatar\": \"https://github.com/go-critic.png\"\n  },\n  {\n    \"name\": \"golang\",\n    \"linters\": [\n      \"gofmt\",\n      \"goimports\",\n      \"modernize\",\n      \"govet\"\n    ],\n    \"profile\": \"https://github.com/sponsors/golang\",\n    \"avatar\": \"https://github.com/golang.png\"\n  },\n  {\n    \"name\": \"gordonklaus\",\n    \"linters\": [\n      \"ineffassign\"\n    ],\n    \"profile\": \"https://github.com/sponsors/gordonklaus\",\n    \"avatar\": \"https://github.com/gordonklaus.png\"\n  },\n  {\n    \"name\": \"jgautheron\",\n    \"linters\": [\n      \"goconst\"\n    ],\n    \"profile\": \"https://github.com/sponsors/jgautheron\",\n    \"avatar\": \"https://github.com/jgautheron.png\"\n  },\n  {\n    \"name\": \"jingyugao\",\n    \"linters\": [\n      \"rowserrcheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/jingyugao\",\n    \"avatar\": \"https://github.com/jingyugao.png\"\n  },\n  {\n    \"name\": \"jirfag\",\n    \"linters\": [\n      \"goprintffuncname\"\n    ],\n    \"profile\": \"https://github.com/sponsors/jirfag\",\n    \"avatar\": \"https://github.com/jirfag.png\"\n  },\n  {\n    \"name\": \"jjti\",\n    \"linters\": [\n      \"spancheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/jjti\",\n    \"avatar\": \"https://github.com/jjti.png\"\n  },\n  {\n    \"name\": \"julz\",\n    \"linters\": [\n      \"importas\"\n    ],\n    \"profile\": \"https://github.com/sponsors/julz\",\n    \"avatar\": \"https://github.com/julz.png\"\n  },\n  {\n    \"name\": \"karamaru-alpha\",\n    \"linters\": [\n      \"copyloopvar\"\n    ],\n    \"profile\": \"https://github.com/sponsors/karamaru-alpha\",\n    \"avatar\": \"https://github.com/karamaru-alpha.png\"\n  },\n  {\n    \"name\": \"kisielk\",\n    \"linters\": [\n      \"errcheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/kisielk\",\n    \"avatar\": \"https://github.com/kisielk.png\"\n  },\n  {\n    \"name\": \"kkHAIKE\",\n    \"linters\": [\n      \"contextcheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/kkHAIKE\",\n    \"avatar\": \"https://github.com/kkHAIKE.png\"\n  },\n  {\n    \"name\": \"kulti\",\n    \"linters\": [\n      \"thelper\"\n    ],\n    \"profile\": \"https://github.com/sponsors/kulti\",\n    \"avatar\": \"https://github.com/kulti.png\"\n  },\n  {\n    \"name\": \"kunwardeep\",\n    \"linters\": [\n      \"paralleltest\"\n    ],\n    \"profile\": \"https://github.com/sponsors/kunwardeep\",\n    \"avatar\": \"https://github.com/kunwardeep.png\"\n  },\n  {\n    \"name\": \"lasiar\",\n    \"linters\": [\n      \"canonicalheader\"\n    ],\n    \"profile\": \"https://github.com/sponsors/lasiar\",\n    \"avatar\": \"https://github.com/lasiar.png\"\n  },\n  {\n    \"name\": \"ldez\",\n    \"linters\": [\n      \"exptostd\",\n      \"gomoddirectives\",\n      \"tagliatelle\",\n      \"usetesting\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ldez\",\n    \"avatar\": \"https://github.com/ldez.png\"\n  },\n  {\n    \"name\": \"leighmcculloch\",\n    \"linters\": [\n      \"gocheckcompilerdirectives\",\n      \"gochecknoglobals\"\n    ],\n    \"profile\": \"https://github.com/sponsors/leighmcculloch\",\n    \"avatar\": \"https://github.com/leighmcculloch.png\"\n  },\n  {\n    \"name\": \"leonklingele\",\n    \"linters\": [\n      \"grouper\"\n    ],\n    \"profile\": \"https://github.com/sponsors/leonklingele\",\n    \"avatar\": \"https://github.com/leonklingele.png\"\n  },\n  {\n    \"name\": \"macabu\",\n    \"linters\": [\n      \"inamedparam\"\n    ],\n    \"profile\": \"https://github.com/sponsors/macabu\",\n    \"avatar\": \"https://github.com/macabu.png\"\n  },\n  {\n    \"name\": \"manuelarte\",\n    \"linters\": [\n      \"embeddedstructfieldcheck\",\n      \"funcorder\"\n    ],\n    \"profile\": \"https://github.com/sponsors/manuelarte\",\n    \"avatar\": \"https://github.com/manuelarte.png\"\n  },\n  {\n    \"name\": \"maratori\",\n    \"linters\": [\n      \"testableexamples\",\n      \"testpackage\"\n    ],\n    \"profile\": \"https://github.com/sponsors/maratori\",\n    \"avatar\": \"https://github.com/maratori.png\"\n  },\n  {\n    \"name\": \"matoous\",\n    \"linters\": [\n      \"godox\"\n    ],\n    \"profile\": \"https://github.com/sponsors/matoous\",\n    \"avatar\": \"https://github.com/matoous.png\"\n  },\n  {\n    \"name\": \"mdempsky\",\n    \"linters\": [\n      \"unconvert\"\n    ],\n    \"profile\": \"https://github.com/sponsors/mdempsky\",\n    \"avatar\": \"https://github.com/mdempsky.png\"\n  },\n  {\n    \"name\": \"mgechev\",\n    \"linters\": [\n      \"revive\"\n    ],\n    \"profile\": \"https://github.com/sponsors/mgechev\",\n    \"avatar\": \"https://github.com/mgechev.png\"\n  },\n  {\n    \"name\": \"mibk\",\n    \"linters\": [\n      \"dupl\"\n    ],\n    \"profile\": \"https://github.com/sponsors/mibk\",\n    \"avatar\": \"https://github.com/mibk.png\"\n  },\n  {\n    \"name\": \"MirrexOne\",\n    \"linters\": [\n      \"unqueryvet\"\n    ],\n    \"profile\": \"https://github.com/sponsors/MirrexOne\",\n    \"avatar\": \"https://github.com/MirrexOne.png\"\n  },\n  {\n    \"name\": \"moricho\",\n    \"linters\": [\n      \"tparallel\"\n    ],\n    \"profile\": \"https://github.com/sponsors/moricho\",\n    \"avatar\": \"https://github.com/moricho.png\"\n  },\n  {\n    \"name\": \"mvdan\",\n    \"linters\": [\n      \"gofumpt\",\n      \"unparam\"\n    ],\n    \"profile\": \"https://github.com/sponsors/mvdan\",\n    \"avatar\": \"https://github.com/mvdan.png\"\n  },\n  {\n    \"name\": \"nakabonne\",\n    \"linters\": [\n      \"nestif\"\n    ],\n    \"profile\": \"https://github.com/sponsors/nakabonne\",\n    \"avatar\": \"https://github.com/nakabonne.png\"\n  },\n  {\n    \"name\": \"nishanths\",\n    \"linters\": [\n      \"exhaustive\",\n      \"predeclared\"\n    ],\n    \"profile\": \"https://github.com/sponsors/nishanths\",\n    \"avatar\": \"https://github.com/nishanths.png\"\n  },\n  {\n    \"name\": \"nunnatsa\",\n    \"linters\": [\n      \"ginkgolinter\"\n    ],\n    \"profile\": \"https://github.com/sponsors/nunnatsa\",\n    \"avatar\": \"https://github.com/nunnatsa.png\"\n  },\n  {\n    \"name\": \"polyfloyd\",\n    \"linters\": [\n      \"errorlint\"\n    ],\n    \"profile\": \"https://codeberg.org/polyfloyd\",\n    \"avatar\": \"https://codeberg.org/polyfloyd.png\"\n  },\n  {\n    \"name\": \"raeperd\",\n    \"linters\": [\n      \"recvcheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/raeperd\",\n    \"avatar\": \"https://github.com/raeperd.png\"\n  },\n  {\n    \"name\": \"ryancurrah\",\n    \"linters\": [\n      \"gomodguard\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ryancurrah\",\n    \"avatar\": \"https://github.com/ryancurrah.png\"\n  },\n  {\n    \"name\": \"ryanrolds\",\n    \"linters\": [\n      \"sqlclosecheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ryanrolds\",\n    \"avatar\": \"https://github.com/ryanrolds.png\"\n  },\n  {\n    \"name\": \"sanposhiho\",\n    \"linters\": [\n      \"wastedassign\"\n    ],\n    \"profile\": \"https://github.com/sponsors/sanposhiho\",\n    \"avatar\": \"https://github.com/sanposhiho.png\"\n  },\n  {\n    \"name\": \"sashamelentyev\",\n    \"linters\": [\n      \"interfacebloat\",\n      \"usestdlibvars\"\n    ],\n    \"profile\": \"https://github.com/sponsors/sashamelentyev\",\n    \"avatar\": \"https://github.com/sashamelentyev.png\"\n  },\n  {\n    \"name\": \"securego\",\n    \"linters\": [\n      \"gosec\"\n    ],\n    \"profile\": \"https://github.com/sponsors/securego\",\n    \"avatar\": \"https://github.com/securego.png\"\n  },\n  {\n    \"name\": \"segmentio\",\n    \"linters\": [\n      \"golines\"\n    ],\n    \"profile\": \"https://github.com/sponsors/segmentio\",\n    \"avatar\": \"https://github.com/segmentio.png\"\n  },\n  {\n    \"name\": \"sivchari\",\n    \"linters\": [\n      \"containedctx\"\n    ],\n    \"profile\": \"https://github.com/sponsors/sivchari\",\n    \"avatar\": \"https://github.com/sivchari.png\"\n  },\n  {\n    \"name\": \"sonatard\",\n    \"linters\": [\n      \"noctx\"\n    ],\n    \"profile\": \"https://github.com/sponsors/sonatard\",\n    \"avatar\": \"https://github.com/sonatard.png\"\n  },\n  {\n    \"name\": \"ssgreg\",\n    \"linters\": [\n      \"nlreturn\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ssgreg\",\n    \"avatar\": \"https://github.com/ssgreg.png\"\n  },\n  {\n    \"name\": \"stbenjam\",\n    \"linters\": [\n      \"nosprintfhostport\"\n    ],\n    \"profile\": \"https://github.com/sponsors/stbenjam\",\n    \"avatar\": \"https://github.com/stbenjam.png\"\n  },\n  {\n    \"name\": \"swaggo\",\n    \"linters\": [\n      \"swaggo\"\n    ],\n    \"profile\": \"https://github.com/sponsors/swaggo\",\n    \"avatar\": \"https://github.com/swaggo.png\"\n  },\n  {\n    \"name\": \"tenntenn\",\n    \"linters\": [\n      \"forcetypeassert\",\n      \"nilerr\"\n    ],\n    \"profile\": \"https://github.com/sponsors/tenntenn\",\n    \"avatar\": \"https://github.com/tenntenn.png\"\n  },\n  {\n    \"name\": \"tetafro\",\n    \"linters\": [\n      \"godot\"\n    ],\n    \"profile\": \"https://github.com/sponsors/tetafro\",\n    \"avatar\": \"https://github.com/tetafro.png\"\n  },\n  {\n    \"name\": \"timakin\",\n    \"linters\": [\n      \"bodyclose\"\n    ],\n    \"profile\": \"https://github.com/sponsors/timakin\",\n    \"avatar\": \"https://github.com/timakin.png\"\n  },\n  {\n    \"name\": \"timonwong\",\n    \"linters\": [\n      \"loggercheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/timonwong\",\n    \"avatar\": \"https://github.com/timonwong.png\"\n  },\n  {\n    \"name\": \"tmzane\",\n    \"linters\": [\n      \"musttag\",\n      \"sloglint\"\n    ],\n    \"profile\": \"https://github.com/sponsors/tmzane\",\n    \"avatar\": \"https://github.com/tmzane.png\"\n  },\n  {\n    \"name\": \"tomarrell\",\n    \"linters\": [\n      \"wrapcheck\"\n    ],\n    \"profile\": \"https://github.com/sponsors/tomarrell\",\n    \"avatar\": \"https://github.com/tomarrell.png\"\n  },\n  {\n    \"name\": \"tommy-muehle\",\n    \"linters\": [\n      \"mnd\"\n    ],\n    \"profile\": \"https://github.com/sponsors/tommy-muehle\",\n    \"avatar\": \"https://github.com/tommy-muehle.png\"\n  },\n  {\n    \"name\": \"ultraware\",\n    \"linters\": [\n      \"funlen\",\n      \"whitespace\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ultraware\",\n    \"avatar\": \"https://github.com/ultraware.png\"\n  },\n  {\n    \"name\": \"uudashr\",\n    \"linters\": [\n      \"gocognit\",\n      \"iface\"\n    ],\n    \"profile\": \"https://github.com/sponsors/uudashr\",\n    \"avatar\": \"https://github.com/uudashr.png\"\n  },\n  {\n    \"name\": \"xen0n\",\n    \"linters\": [\n      \"gosmopolitan\"\n    ],\n    \"profile\": \"https://github.com/sponsors/xen0n\",\n    \"avatar\": \"https://github.com/xen0n.png\"\n  },\n  {\n    \"name\": \"xobotyi\",\n    \"linters\": [\n      \"exhaustruct\"\n    ],\n    \"profile\": \"https://github.com/sponsors/xobotyi\",\n    \"avatar\": \"https://github.com/xobotyi.png\"\n  },\n  {\n    \"name\": \"yagipy\",\n    \"linters\": [\n      \"maintidx\"\n    ],\n    \"profile\": \"https://github.com/sponsors/yagipy\",\n    \"avatar\": \"https://github.com/yagipy.png\"\n  },\n  {\n    \"name\": \"yeya24\",\n    \"linters\": [\n      \"promlinter\"\n    ],\n    \"profile\": \"https://github.com/sponsors/yeya24\",\n    \"avatar\": \"https://github.com/yeya24.png\"\n  },\n  {\n    \"name\": \"ykadowak\",\n    \"linters\": [\n      \"zerologlint\"\n    ],\n    \"profile\": \"https://github.com/sponsors/ykadowak\",\n    \"avatar\": \"https://github.com/ykadowak.png\"\n  }\n]\n"
  },
  {
    "path": "docs/go.mod",
    "content": "module github.com/golangci/docs\n\ngo 1.24.0\n\nrequire github.com/imfing/hextra v0.11.0 // indirect\n"
  },
  {
    "path": "docs/go.sum",
    "content": "github.com/imfing/hextra v0.11.0 h1:2HswtfKD/TFg2VWp0hvsH5F3/WoEugiz8s3n2JFouqY=\ngithub.com/imfing/hextra v0.11.0/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI=\n"
  },
  {
    "path": "docs/golangci-lint.tape",
    "content": "Output docs/static/images/demo.gif\n\n# NOTE: it should be run at the root of the repository.\n# vhs docs/golangci-lint.tape\n\nRequire golangci-lint\n\nSet Shell zsh\n\nSet Theme Dracula\nSet FontSize 25\nSet Width 2000\nSet Height 900\n\nSet WindowBar Colorful\nSet WindowBarSize 50\n\nSet Padding 20\n\nSet MarginFill \"#17afc2\"\nSet Margin 20\n\nSet BorderRadius 30\n\nType \"golangci-lint run\" Sleep 500ms Enter\nSleep 2s\nSleep 1s\n\n\n# VHS documentation\n# https://github.com/charmbracelet/vhs\n#\n# Output:\n#   Output <path>.gif               Create a GIF output at the given <path>\n#   Output <path>.mp4               Create an MP4 output at the given <path>\n#   Output <path>.webm              Create a WebM output at the given <path>\n#\n# Require:\n#   Require <string>                Ensure a program is on the $PATH to proceed\n#\n# Settings:\n#   Set FontSize <number>           Set the font size of the terminal\n#   Set FontFamily <string>         Set the font family of the terminal\n#   Set Height <number>             Set the height of the terminal\n#   Set Width <number>              Set the width of the terminal\n#   Set LetterSpacing <float>       Set the font letter spacing (tracking)\n#   Set LineHeight <float>          Set the font line height\n#   Set LoopOffset <float>%         Set the starting frame offset for the GIF loop\n#   Set Theme <json|string>         Set the theme of the terminal\n#   Set Padding <number>            Set the padding of the terminal\n#   Set Framerate <number>          Set the framerate of the recording\n#   Set PlaybackSpeed <float>       Set the playback speed of the recording\n#   Set MarginFill <file|#000000>   Set the file or color the margin will be filled with.\n#   Set Margin <number>             Set the size of the margin. Has no effect if MarginFill isn't set.\n#   Set BorderRadius <number>       Set terminal border radius, in pixels.\n#   Set WindowBar <string>          Set window bar type. (one of: Rings, RingsRight, Colorful, ColorfulRight)\n#   Set WindowBarSize <number>      Set window bar size, in pixels. Default is 40.\n#   Set TypingSpeed <time>          Set the typing speed of the terminal. Default is 50ms.\n#\n# Sleep:\n#   Sleep <time>                    Sleep for a set amount of <time> in seconds\n#\n# Type:\n#   Type[@<time>] \"<characters>\"    Type <characters> into the terminal with a\n#                                   <time> delay between each character\n#\n# Keys:\n#   Escape[@<time>] [number]        Press the Escape key\n#   Backspace[@<time>] [number]     Press the Backspace key\n#   Delete[@<time>] [number]        Press the Delete key\n#   Insert[@<time>] [number]        Press the Insert key\n#   Down[@<time>] [number]          Press the Down key\n#   Enter[@<time>] [number]         Press the Enter key\n#   Space[@<time>] [number]         Press the Space key\n#   Tab[@<time>] [number]           Press the Tab key\n#   Left[@<time>] [number]          Press the Left Arrow key\n#   Right[@<time>] [number]         Press the Right Arrow key\n#   Up[@<time>] [number]            Press the Up Arrow key\n#   Down[@<time>] [number]          Press the Down Arrow key\n#   PageUp[@<time>] [number]        Press the Page Up key\n#   PageDown[@<time>] [number]      Press the Page Down key\n#   Ctrl+<key>                      Press the Control key + <key> (e.g. Ctrl+C)\n#\n# Display:\n#   Hide                            Hide the subsequent commands from the output\n#   Show                            Show the subsequent commands in the output\n"
  },
  {
    "path": "docs/hugo.yaml",
    "content": "baseURL: https://golangci-lint.run\nlanguageCode: en-us\ntitle: Golangci-lint\n\nenableRobotsTXT: true\n\nenableGitInfo: true\n\nmarkup:\n  highlight:\n    noClasses: false\n  goldmark:\n    renderer:\n      unsafe: true\n    extensions:\n      passthrough:\n        delimiters:\n          block: [['\\[', '\\]'], ['$$', '$$']]\n          inline: [['\\(', '\\)']]\n        enable: true\n\nenableInlineShortcodes: true\n\ndefaultContentLanguage: en\n\nmodule:\n  hugoVersion:\n    extended: true\n    min: \"0.148.1\"\n\n  imports:\n    - path: github.com/imfing/hextra\n\noutputs:\n  home: [HTML]\n  page: [HTML]\n  section: [HTML, RSS]\n\nmenu:\n  main:\n    - name: Documentation\n      pageRef: /docs\n      weight: 1\n    - identifier: donate\n      name: \"Support us\"\n      pageRef: /docs/donate/\n      weight: 2\n      params:\n        icon: \"heart-red\"\n    - identifier: linters\n      name: Linters\n      pageRef: /docs/linters/\n      weight: 3\n    - name: Formatters\n      pageRef: /docs/formatters/\n      weight: 4\n    - name: Search\n      weight: 5\n      params:\n        type: search\n    - name: Theme Toggle\n      weight: 6\n      params:\n        type: theme-toggle\n    - name: GitHub\n      weight: 7\n      url: \"https://github.com/golangci/golangci-lint\"\n      params:\n        icon: github\n  sidebar:\n    - identifier: more\n      name: More\n      params:\n        type: separator\n      weight: 2\n    - identifier: doc-v1\n      name: \"Documentation v1 ↗\"\n      url: \"https://golangci.github.io/legacy-v1-doc/\"\n      weight: 3\n\n\nparams:\n  description: Golangci-lint is a fast linters runner for Go.\n\n  banner:\n    key: 'banner-2025-001'\n    message: |\n      If golangci-lint is useful for you, please consider [supporting us](/docs/donate/)! \n      You are the only one who can make a difference!\n\n  navbar:\n    displayTitle: true\n    displayLogo: true\n    logo:\n      path: images/logo-circle.svg\n      dark: images/logo-nocircle.svg\n    width: wide\n\n  theme:\n    # light | dark | system\n    default: system\n    displayToggle: true\n\n  footer:\n    enable: true\n    displayCopyright: false\n    displayPoweredBy: true\n    width: wide\n    links:\n      - title: Bluesky\n        url: \"https://bsky.app/profile/golangci-lint.run\"\n        icon: bluesky\n      - title: Mastodon\n        url: \"https://fosstodon.org/@golangcilint\"\n        icon: mastodon\n      - title: Twitter\n        url: \"https://twitter.com/golangci\"\n        icon: twitter\n      - title: Slack\n        url: \"https://gophers.slack.com/archives/CS0TBRKPC\"\n        icon: slack\n      - title: GitHub\n        url: \"https://github.com/golangci/golangci-lint\"\n        icon: github\n\n  # Display the last modification date\n  displayUpdatedDate: true\n  dateFormat: \"2006-01-02 03:04:05\"\n\n  # Search\n  # flexsearch is enabled by default\n  search:\n    enable: true\n    type: flexsearch\n\n    flexsearch:\n      # index page by: content | summary | heading | title\n      index: content\n      # full | forward | reverse | strict\n      # https://github.com/nextapps-de/flexsearch/#tokenizer-prefix-search\n      tokenize: forward\n\n  editURL:\n    enable: true\n    base: \"https://github.com/golangci/golangci-lint/edit/main/docs/content\"\n\n  blog:\n    list:\n      displayTags: true\n      # date | lastmod | publishDate | title | weight\n      sortBy: date\n      sortOrder: desc # or \"asc\"\n      # Pagination\n      pagerSize: 20\n\n    article:\n      displayPagination: true\n\n  toc:\n    displayTags: true\n\n  highlight:\n    copy:\n      enable: true\n      # hover | always\n      display: hover\n\n  page:\n    # full (100%), wide (90rem), normal (80rem)\n    width: full\n    tabs:\n      sync: false\n"
  },
  {
    "path": "docs/i18n/en.yaml",
    "content": "copyright: \"© 2025 Golangci\"\n"
  },
  {
    "path": "docs/layouts/404.html",
    "content": "{{ define \"main\" }}\n<div class='hx:mx-auto hx:flex hextra-max-page-width'>\n    {{ partial \"sidebar.html\" (dict \"context\" . \"disableSidebar\" true \"displayPlaceholder\" true) }}\n    {{ partial \"toc.html\" . }}\n    <article class=\"hx:w-full hx:break-words hx:flex hx:min-h-[calc(100vh-var(--navbar-height))] hx:min-w-0 hx:justify-center hx:pb-8 hx:pr-[calc(env(safe-area-inset-right)-1.5rem)]\">\n        <main\n                class=\"hx:w-full hx:min-w-0 hx:max-w-6xl hx:flex hx:flex-col hx:items-center hx:justify-center\">\n            <div class=\"hx:flex hx:flex-col hx:items-center hx:justify-center\">\n                <a href=\"/\" ><img src=\"/images/logo-circle.svg\" alt=\"logo\" width=\"200\" height=\"200\"></a>\n                <h1 id=\"error-heading\"\n                    class=\"not-prose hx:text-4xl font-bold leading-none tracking-tighter md:text-5xl py-2 bg-clip-text text-transparent bg-gradient-to-r from-gray-900 to-gray-600 dark:from-gray-100 dark:to-gray-400\">\n                    404\n                </h1>\n                <p class=\"hx:mb-6\">\n                    The page could not be found.\n                </p>\n                <a href=\"/\" class=\"hx:font-medium hx:px-6 hx:py-3 hx:text-center inline-block\">\n                    Go to the home page\n                </a>\n            </div>\n        </main>\n    </article>\n</div>\n{{ end }}\n"
  },
  {
    "path": "docs/layouts/_partials/custom/head-end.html",
    "content": "<script defer src=\"https://cdn.jsdelivr.net/npm/quicklink@3.0.1/dist/quicklink.umd.js\"></script>\n<script>\n  window.addEventListener('load', () => {\n    quicklink.listen();\n  });\n</script>\n<script>\n  window.addEventListener('load', () => {\n    const resetButton = document.querySelector('.gl-filter-reset');\n\n    if (!resetButton) {\n      return\n    }\n\n    const borderClass = 'hx:border'\n    const hiddenClass = 'gl-hidden'\n\n    document.querySelectorAll('.gl-filter').forEach(button => {\n      button.addEventListener('click', event => {\n        let clean = event.currentTarget.querySelectorAll('.hx\\\\:border').length > 0\n\n        document.querySelectorAll('.gl-item').forEach(element => element.classList.remove(hiddenClass));\n        document.querySelectorAll('.gl-filter > *').forEach(element => element.classList.remove(borderClass));\n\n        if (clean) {\n          resetButton.classList.add(hiddenClass);\n        } else {\n          resetButton.classList.remove(hiddenClass);\n\n          document.querySelectorAll('.gl-filter').forEach(element => element.classList.remove(borderClass))\n\n          event.currentTarget.querySelector('*').classList.add(borderClass);\n\n          let selector = ''\n          switch (event.currentTarget.dataset.badge) {\n            case 'default':\n              selector = '.gl-item:not(.gl-default)'\n              break;\n            case 'new':\n              selector = '.gl-item:not(.gl-new)'\n              break;\n            case 'autofix':\n              selector = '.gl-item:not(.gl-autofix)'\n              break;\n            case 'fast':\n              selector = '.gl-item:not(.gl-fast)'\n              break;\n            case 'slow':\n              selector = '.gl-item:not(.gl-slow)'\n              break;\n            case 'deprecated':\n              selector = '.gl-item:not(.gl-deprecated)'\n              break;\n          }\n\n          if (selector) {\n            document.querySelectorAll(selector).forEach(element => element.classList.add(hiddenClass));\n          }\n        }\n      });\n    });\n\n    resetButton.addEventListener('click', (event) => {\n      event.currentTarget.classList.add(hiddenClass);\n\n      document.querySelectorAll('.gl-item').forEach(element => element.classList.remove(hiddenClass));\n      document.querySelectorAll('.gl-filter > *').forEach(element => element.classList.remove(borderClass));\n    });\n  });\n</script>\n"
  },
  {
    "path": "docs/layouts/_partials/footer.html",
    "content": "{{- /* Modified version of https://github.com/imfing/hextra/blob/v0.10.0/layouts/_partials/footer.html */ -}}\n{{- /* This file overrides the footer partial of the theme */ -}}\n\n{{- $enableFooterSwitches := .Scratch.Get \"enableFooterSwitches\" | default false -}}\n{{- $displayThemeToggle := site.Params.theme.displayToggle | default true -}}\n{{- $footerSwitchesVisible := and $enableFooterSwitches (or hugo.IsMultilingual $displayThemeToggle) -}}\n{{- $copyrightSectionVisible := or (.Site.Params.footer.displayPoweredBy | default true) .Site.Params.footer.displayCopyright -}}\n\n{{- $copyright := (T \"copyright\") | default \"© 2024 Hextra.\" -}}\n{{- $poweredBy := (T \"poweredBy\") | default \"Powered by Hextra\" -}}\n\n<footer class=\"hextra-footer hx:bg-gray-100 hx:pb-[env(safe-area-inset-bottom)] hx:dark:bg-neutral-900 hx:print:bg-transparent\">\n  {{- if $footerSwitchesVisible -}}\n    <div class=\"hx:mx-auto hx:flex hx:gap-2 hx:py-2 hx:px-4 hextra-max-footer-width\">\n      {{- partial \"language-switch.html\" (dict \"context\" .) -}}\n      {{- with $displayThemeToggle }}{{ partial \"theme-toggle.html\" }}{{ end -}}\n    </div>\n    {{- if or hugo.IsMultilingual $displayThemeToggle -}}\n      <hr class=\"hx:border-gray-200 hx:dark:border-neutral-800\" />\n    {{- end -}}\n  {{- end -}}\n\n  {{- if $copyrightSectionVisible -}}\n    <div class=\"hextra-max-footer-width hx:mx-auto  hx:mx-auto hx:flex hx:items-center hx:justify-end hx:gap-2 hx:h-16 hx:px-6 hx:text-gray-600 hx:dark:text-gray-400 hx:md:justify-start\">\n\n      <div class=\"hx:flex hx:w-full hx:flex-col hx:items-center hx:sm:items-start\" >\n\n        {{- if .Site.Params.footer.displayCopyright }}\n        <span class=\"hx:mr-2 hx:inline\">{{ $copyright | markdownify }}</span>\n        {{- end -}}\n\n        {{- if (.Site.Params.footer.displayPoweredBy | default true) }}\n        <span class=\"hx:mr-2 hx:inline\">{{ template \"theme-credit\" $poweredBy }}</span>\n        {{- end -}}\n\n      </div>\n\n      {{- range .Site.Params.footer.links -}}\n      {{- $external := strings.HasPrefix .url \"http\" -}}\n      <a title=\"{{ .title }}\" href=\"{{ .url }}\" {{ if $external }}target=\"_blank\"{{ end }} class=\"social-media hx:text-sm hx:contrast-more:text-gray-700 hx:contrast-more:dark:text-gray-100 hx:relative -hx:ml-2 hx:whitespace-nowrap hx:p-1 hx:md:inline-block hx:text-gray-600 hx:hover:text-gray-800 hx:dark:text-gray-400 hx:dark:hover:text-gray-200\">\n        <span class=\"hx:text-center\">\n           {{- partial \"utils/icon.html\" (dict \"name\" .icon \"attributes\" \"height=20\") -}}\n        </span>\n      </a>\n      {{- end -}}\n\n    </div>\n  {{- end -}}\n</footer>\n\n{{- define \"theme-credit\" -}}\n<a class=\"hx:flex hx:text-sm hx:items-center hx:gap-1 hx:text-current\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Hextra GitHub Homepage\" href=\"https://github.com/imfing/hextra\">\n    <span>\n      {{- . | markdownify -}}\n      {{- if strings.Contains . \"Hextra\" -}}\n        {{- partial \"utils/icon.html\" (dict \"name\" \"hextra\" \"attributes\" `height=1em class=\"hx:inline-block hx:ltr:ml-1 hx:rtl:mr-1 hx:align-[-2.5px]\"`) -}}\n      {{- end -}}\n    </span>\n</a>\n{{- end -}}\n"
  },
  {
    "path": "docs/layouts/_partials/golangci/items/compare-versions.html",
    "content": "{{- /*\nCompares two versions.\n\n@param {string} a Version A\n@param {string} b Version B\n@returns {boolean}\n\n@example {{ partial \"golangci/items/compare-versions\" (dict \"a\" \"v1.2.3\" \"b\" \"v1.2.4\") }}\n*/ -}}\n\n{{- $aVersion := path.Dir (replace .a \".\" \"/\") -}}\n{{- $bVersion := path.Dir (replace .b \".\" \"/\") -}}\n\n{{- return (eq $aVersion $bVersion) -}}\n"
  },
  {
    "path": "docs/layouts/_partials/golangci/items/format-description.html",
    "content": "{{- /*\nFormats a item (linter/formatter) description.\n\n@param {string} (positional parameter 0) Description\n@returns {string}\n\n@example {{ partial \"golangci/items/format-description\" \"message\" }}\n*/ -}}\n\n{{- $desc := . -}}\n{{- $desc = strings.FirstUpper $desc -}}\n{{- if not (hasSuffix $desc \".\") -}}\n    {{- $desc = print $desc \".\"  -}}\n{{- end -}}\n{{- return $desc -}}\n"
  },
  {
    "path": "docs/layouts/_partials/golangci/items/tag.html",
    "content": "{{- /*\nCreates tag information for an item (linter/formatter).\n\n@param {string} (positional parameter 0) Description\n@returns {map[tag: string, tagType: string]}\n\n@example {{ partial \"golangci/items/tag\" (dict \"gcilVersion\" \"v1.2.3\" \"item\" .) }}\n*/ -}}\n\n{{- $gcilVersion := .gcilVersion -}}\n{{- $item := .item -}}\n\n{{- $tag := newScratch -}}\n\n{{- if $item.deprecation -}}\n    {{- $replacement := \"\" -}}\n    {{- if $item.deprecation.replacement -}}\n        {{- $replacement = print \" Use `\" $item.deprecation.replacement \"` instead.\" -}}\n    {{- end -}}\n\n    {{- $tag.SetInMap \"options\" \"subtitle\" (print (strings.FirstUpper $item.deprecation.message) $replacement) -}}\n    {{- $tag.SetInMap \"options\" \"tag\" (print \"Deprecated since \" $item.deprecation.since) -}}\n    {{- $tag.SetInMap \"options\" \"tagType\" \"error\" -}}\n{{- else if (partial \"golangci/items/compare-versions\" (dict \"a\" $gcilVersion \"b\" $item.since)) -}}\n    {{- $tag.SetInMap \"options\" \"tag\" \"New\" -}}\n    {{- $tag.SetInMap \"options\" \"tagType\" \"warning\" -}}\n{{- else if $item.canAutoFix -}}\n    {{- $tag.SetInMap \"options\" \"tag\" \"Autofix\" -}}\n    {{- $tag.SetInMap \"options\" \"tagType\" \"info\" -}}\n{{- end -}}\n\n{{- return ($tag.Get \"options\") -}}\n"
  },
  {
    "path": "docs/layouts/_partials/shortcodes/badge.html",
    "content": "{{- /* Modified version of https://github.com/imfing/hextra/blob/v0.11.0/layouts/_partials/shortcodes/badge.html */ -}}\n{{- /* This file overrides the badge partial of the theme */ -}}\n\n{{- $content := .content -}}\n{{- $color := .color | default .type | default \"\" -}}{{- /* Compatibility with previous parameter. */ -}}\n{{- $class := .class | default \"\" -}}\n{{- $border := .border | default false -}}\n{{- $icon := .icon | default \"\" -}}\n\n{{- /* Compatibility with previous names. */ -}}\n{{- $mapping := (dict\n  \"default\" \"gray\"\n  \"tip\" \"green\"\n  \"info\" \"blue\"\n  \"warning\" \"yellow\"\n  \"error\" \"red\"\n  \"important\" \"purple\"\n  )\n-}}\n{{- $color = index $mapping $color | default $color | default \"gray\" -}}\n\n{{- $styleClass := newScratch -}}\n{{- $styleClass.Set \"gray\" \"hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700\" -}}\n{{- $styleClass.Set \"purple\" \"hx:border-purple-200 hx:bg-purple-100 hx:text-purple-900 hx:dark:border-purple-200/30 hx:dark:bg-purple-900/30 hx:dark:text-purple-200\" -}}\n{{- $styleClass.Set \"indigo\" \"hx:border-indigo-200 hx:bg-indigo-100 hx:text-indigo-900 hx:dark:border-indigo-200/30 hx:dark:bg-indigo-900/30 hx:dark:text-indigo-200\" -}}\n{{- $styleClass.Set \"blue\" \"hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200\" -}}\n{{- $styleClass.Set \"green\" \"hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200\" -}}\n{{- $styleClass.Set \"yellow\" \"hx:border-yellow-100 hx:bg-yellow-50 hx:text-yellow-900 hx:dark:border-yellow-200/30 hx:dark:bg-yellow-700/30 hx:dark:text-yellow-200\" -}}\n{{- $styleClass.Set \"orange\" \"hx:border-orange-100 hx:bg-orange-50 hx:text-orange-800 hx:dark:border-orange-400/30 hx:dark:bg-orange-400/20 hx:dark:text-orange-300\" -}}\n{{- $styleClass.Set \"amber\" \"hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200\" -}}\n{{- $styleClass.Set \"red\" \"hx:border-red-200 hx:bg-red-100 hx:text-red-900 hx:dark:border-red-200/30 hx:dark:bg-red-900/30 hx:dark:text-red-200\" -}}\n\n{{- $borderClass := cond (eq $border true) \"hx:border\" \"\" -}}\n{{- $badgeClass := or ($styleClass.Get $color) ($styleClass.Get \"gray\") -}}\n\n{{- /* Custom section to handle icon-only badges. */ -}}\n{{- $iconOnly := hasPrefix $color \"icon-only\" -}}\n{{- if $iconOnly -}}\n  {{- $icon = (strings.TrimPrefix \"icon-only:\" $color) -}}\n  {{- $borderClass = \"\" -}}\n  {{- $badgeClass = \"hx:p-2\" -}}\n{{- end -}}\n\n{{- /* Custom section to set attributes. */ -}}\n{{- $data := .data | default \"\" -}}\n{{- $attributes := slice -}}\n{{- if $iconOnly -}}\n  {{- $attributes = $attributes | append (printf `title=\"%s\"` $content) -}}\n{{- end -}}\n{{- if $data -}}\n  {{- $attributes = $attributes | append (printf `data-badge=\"%s\"` $data) -}}\n{{- end -}}\n\n<div class=\"hextra-badge {{ $class }}\" {{ (delimit $attributes \" \") | safeHTMLAttr }}>\n  <div class=\"hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] {{ $borderClass }} {{ $badgeClass }}\">\n    {{- with $icon -}}{{- partial \"utils/icon\" (dict \"name\" . \"attributes\" \"height=12\") -}}{{- end -}}\n    {{- if not $iconOnly -}}{{- $content -}}{{- end -}}\n  </div>\n</div>\n{{- /* Strip trailing newline. */ -}}\n"
  },
  {
    "path": "docs/layouts/_partials/shortcodes/cards.html",
    "content": "{{/* Modified version of https://github.com/imfing/hextra/blob/v0.10.0/layouts/_partials/shortcodes/cards.html */}}\n{{- /* This file overrides the details shortcode of the theme */ -}}\n\n{{- $cols := .cols | default 3 -}}\n{{- $content := .content -}}\n{{- $class := .class | default \"hextra-cards\" -}}\n\n<div class=\"{{ $class }} hx:mt-4 hx:gap-4 hx:grid not-prose\" style=\"--hextra-cards-grid-cols: {{ $cols }};\">\n  {{- $content -}}\n</div>\n"
  },
  {
    "path": "docs/layouts/_shortcodes/cards.html",
    "content": "{{- /* Modified version of https://github.com/imfing/hextra/blob/v0.10.0/layouts/_shortcodes/cards.html */ -}}\n{{- /* This file overrides the cards shortcode of the theme */ -}}\n\n{{- /*\nA shortcode for creating cards.\n\n@param {string} cols The number of columns.\n@param {string} class The class of the cards.\n\n@example {{< cards cols=\"3\" >}}{{< /cards >}}\n*/ -}}\n\n{{- $cols := .Get \"cols\" | default 3 -}}\n{{- $class := .Get \"class\" | default \"hextra-cards\" -}}\n\n{{- partial \"shortcodes/cards\" (dict \"cols\" $cols \"class\" $class \"content\" .Inner) -}}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/details.html",
    "content": "{{- /* Modified version of https://github.com/imfing/hextra/blob/v0.10.0/layouts/_shortcodes/details.html */ -}}\n{{- /* This file overrides the details shortcode of the theme */ -}}\n\n{{- $title := .Get \"title\" | default \"\" -}}\n{{- $closed := eq (.Get \"closed\") \"true\" | default false -}}\n\n<details class=\"hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group\" {{ if not $closed }}open{{ end }}>\n  <summary class=\"hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90\">\n    <span class=\"hx:text-lg\">{{ $title | markdownify }}</span>\n  </summary>\n  <div class=\"hx:p-2 hx:overflow-hidden\">\n    {{ .InnerDeindent | markdownify }}\n  </div>\n</details>\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/authors.html",
    "content": "{{- /*\nCreates a card for each author of a linter/formatter.\n\n@example {{< golangci/authors >}}\n*/ -}}\n\n{{- $thanks := index $.Site.Data.thanks -}}\n{{- range $thanks }}\n\n{{ $v := slice }}\n{{- range .linters -}}\n{{- $v = $v | append (printf \"<code>%s</code>\" .) -}}\n{{- end -}}\n\n{{- partial \"shortcodes/card\" (dict\n  \"page\"        .Page\n  \"link\"        .profile\n  \"title\"       .name\n  \"subtitle\"    (delimit $v \"<br>\")\n  \"image\"       .avatar\n  )\n-}}\n{{- end -}}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/button.html",
    "content": "{{- $link := .Get \"link\" -}}\n{{- $text := .Get \"text\" -}}\n{{- $style := .Get \"style\" -}}\n\n{{- $external := hasPrefix $link \"http\" -}}\n{{- $href := cond (hasPrefix $link \"/\") ($link | relURL) $link -}}\n\n<div class=\"hx:mt-6 hx:mb-6\">\n<a\n  href=\"{{ $href }}\"\n  class=\"not-prose hx:font-medium hx:cursor-pointer hx:px-6 hx:py-3 hx:rounded-full hx:text-center hx:text-white hx:inline-block hx:bg-primary-600 hx:hover:bg-primary-700 hx:focus:outline-hidden hx:focus:ring-4 hx:focus:ring-primary-300 hx:dark:bg-primary-600 hx:dark:hover:bg-primary-700 hx:dark:focus:ring-primary-800 hx:transition-all hx:ease-in hx:duration-200\"\n  {{ with $style }}style=\"{{ . | safeCSS }}\"{{ end }}\n  {{ if $external }}target=\"_blank\" rel=\"noreferrer\"{{ end -}}\n>\n  {{- $text -}}\n</a>\n</div>\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/cli-output.html",
    "content": "{{- /*\nCreates a code block with the output of the CLI.\n\n@param {string} cmd The name of the command.\n@param {string} section The name of the section inside the data file.\n\n@example {{% golangci/cli-output %}}\n@example {{% golangci/cli-output cmd=\"foo\" %}}\n@example {{% golangci/cli-output section=\"sectionName\" cmd=\"foo bar\" %}}\n*/ -}}\n\n{{- $cmdName := .Get \"cmd\" -}}\n{{- $section := .Get \"section\" -}}\n\n{{- $cliData := index $.Site.Data.cli_help -}}\n\n```console\n{{ if $section -}}\n\n$ golangci-lint {{ $cmdName }}\n\n{{- else -}}\n    {{- $section = print (or $cmdName \"root\") \"Output\" -}}\n\n$ golangci-lint{{ if $cmdName }} {{ $cmdName }}{{ end }} -h\n\n{{- end }}\n{{ index $cliData $section | safeHTML }}\n```\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/configuration-file-snippet.html",
    "content": "{{- /*\nCreates a code block with the contents of a configuration file section.\n\n@param {string} section The name of the section inside the data file.\n@returns {string}\n\n@example {{% golangci/configuration-file-snippet section=\"sectionName\" %}}\n*/ -}}\n\n{{- $sectionName := .Get \"section\" -}}\n\n{{- $file := index $.Site.Data.configuration_file -}}\n\n```yaml\n{{ index $file $sectionName | safeHTML }}\n```\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/embed.html",
    "content": "{{- /*\nEmbeds a file.\n\n@param {string} file The path to the file.\n@returns {string}\n\n@example {{% golangci/embed file=\"path/to/file.txt\" %}}\n*/ -}}\n\n{{- $file := .Get \"file\" -}}\n\n{{ readFile $file | safeHTML}}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/exclusion-preset-tables.html",
    "content": "{{- /*\nCreates a table of exclusion presets.\n\n@example {{% golangci/exclusion-preset-tables %}}\n*/ -}}\n\n{{- $presets := index $.Site.Data.exclusion_presets -}}\n\n{{ range $key, $values := $presets }}\n### Preset {{ print \"`\" $key \"`\" }}\n\n<table>\n    <thead>\n    <tr>\n        <th>Linter</th>\n        <th>Issue Text</th>\n    </tr>\n    </thead>\n    <tbody>\n    {{- range $i, $value := $values -}}\n    <tr>\n        <td>{{ index $value \"linters\" 0 }}</td>\n        <td><code>{{ index $value \"text\" }}</code></td>\n    </tr>\n    {{- end -}}\n    </tbody>\n</table>\n{{ end }}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/exclusion-presets-snippet.html",
    "content": "{{- /*\nCreates an exclusion presets configuration snippet.\n\n@example {{% golangci/exclusion-presets-snippet %}}\n*/ -}}\n\n{{- $presets := index $.Site.Data.exclusion_presets -}}\n\n```yaml\nlinters:\n  exclusions:\n    presets:\n{{- range $key, $values := $presets }}\n      - {{ $key }}\n{{- end }}\n```\n\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/image-card.html",
    "content": "{{- /*\nCreates a card for an image.\n\n@param {string} src The path to the image.\n@param {string} title The title text for the image.\n\n@example {{< golangci/image-card src=\"path/to/image.png\" title=\"Image description\" >}}\n*/ -}}\n\n{{- $src := .Get \"src\" -}}\n{{- $title := .Get \"title\" -}}\n\n<div class=\"hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden\">\n  <img class=\"hextra-card-image\" src=\"{{ $src }}\" alt=\"{{ $title }}\" title=\"{{ $title }}\"/>\n</div>\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/items/cards.html",
    "content": "{{- /*\nCreates a card for each item (linter/formatter) in a data file.\n\n@param {string} data The name of the data file.\n@param {string} path The path to the data file.\n@param {string} group The group to filter items by (use the prefix `!` to exclude items from the group).\n@returns {string}\n\n@example {{< golangci/items/cards path=\"formatters\" data=\"formatters_info\" >}}\n@example {{< golangci/items/cards path=\"linters\" data=\"linters_info\" group=\"!standard\" >}}\n*/ -}}\n\n{{- $file := .Get \"data\" -}}\n{{- $path := .Get \"path\" -}}\n{{- $group := .Get \"group\" | default \"\" -}}\n\n{{- $info := index $.Site.Data $file -}}\n\n{{- /* Determine if we should exclude items from the group */ -}}\n{{- $notInGroup := hasPrefix $group \"!\" -}}\n{{- if $notInGroup -}}\n    {{- $group = strings.TrimPrefix \"!\" $group -}}\n{{- end -}}\n\n{{- /* Filter items by group */ -}}\n{{ $items := slice }}\n{{- range sort $info \"name\" -}}\n    {{- if $group -}}\n        {{- if in .groups $group -}}\n            {{- if not $notInGroup -}}\n                {{- $items = $items | append . -}}\n            {{- end -}}\n        {{- else -}}\n            {{- if $notInGroup -}}\n                {{- $items = $items | append . -}}\n            {{- end -}}\n        {{- end -}}\n    {{- else -}}\n        {{- $items = $items | append . -}}\n    {{- end -}}\n{{- end -}}\n\n{{- $gcilVersion := index $.Site.Data.version.version -}}\n\n{{- /* Create cards */ -}}\n{{- range $items -}}\n    {{- if .internal -}}\n        {{- continue -}}\n    {{- end -}}\n\n    {{- $s := newScratch -}}\n    {{- $s.SetInMap \"options\" \"page\" .Page -}}\n    {{- $s.SetInMap \"options\" \"link\" (print \"/docs/\" $path \"/configuration/#\" .name) -}}\n    {{- $s.SetInMap \"options\" \"title\" .name -}}\n    {{- $s.SetInMap \"options\" \"subtitle\" (partial \"golangci/items/format-description\" .desc) -}}\n\n    {{- /* Create tag information */ -}}\n    {{- $tagOptions := partial \"golangci/items/tag\" (dict \"gcilVersion\" $gcilVersion \"item\" .) -}}\n    {{- range $k, $v := $tagOptions -}}\n        {{- $s.SetInMap \"options\" $k $v -}}\n    {{- end -}}\n\n    {{- /* CSS classes */ -}}\n    {{- $class := slice \"gl-item\" -}}\n    {{- if .canAutoFix -}}\n        {{- $class = $class | append \"gl-autofix\" -}}\n    {{- end -}}\n    {{- if .deprecation -}}\n        {{- $class = $class | append \"gl-deprecated\" -}}\n    {{- end -}}\n    {{- if .isSlow -}}\n        {{- $class = $class | append \"gl-slow\" -}}\n    {{- else -}}\n        {{- $class = $class | append \"gl-fast\" -}}\n    {{- end -}}\n    {{- if in .groups \"standard\" -}}\n        {{- $class = $class | append \"gl-default\" -}}\n    {{- end -}}\n    {{- if (partial \"golangci/items/compare-versions\" (dict \"a\" $gcilVersion \"b\" .since)) -}}\n        {{- $class = $class | append \"gl-new\" -}}\n    {{- end -}}\n\n<div class=\"{{ delimit $class \" \" | safeHTMLAttr }}\">\n    {{- partial \"shortcodes/card\" ($s.Get \"options\") -}}\n</div>\n\n{{- end -}}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/items/filter-badge.html",
    "content": "{{- /* Modified version of https://github.com/imfing/hextra/blob/v0.10.0/layouts/_shortcodes/badge.html */ -}}\n{{- /*\nCreates a badge with the given \"data-filter\" value.\n\n@param {string} content The content of the badge.\n@param {string} type The type of the badge.\n@param {string} data The \"data-filter\" value for the badge.\n@param {string} class The class of the badge.\n@param {boolean} border Whether to render a border around the badge.\n@param {string} icon The icon of the badge.\n\n@example {{< golangci/items/filter-badge icon=\"inbox\" data=\"my-data\" content=\"Text\" class=\"my-class\" type=\"info\" border=true >}}\n*/}}\n\n{{- $content := .Get \"content\" -}}\n{{- $color := .Get \"color\" | default \"\" -}}\n{{- $data := .Get \"data\" | default \"\" -}}\n{{- $class := .Get \"class\" | default \"\" -}}\n{{- $icon := .Get \"icon\" | default \"\" -}}\n{{- $border := .Get \"border\" | default false -}}\n\n{{- partial \"shortcodes/badge\" (dict\n  \"data\" $data\n  \"class\" (printf \"hx:mt-2 hx:mx-1 hx:cursor-pointer %s\" $class)\n  \"content\" $content\n  \"color\" $color\n  \"border\" $border\n  \"icon\" $icon\n  )\n-}}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/items/filter.html",
    "content": "{{- /*\nThis shortcode is used to create a filter bar.\n\n@example {{< golangci/items/filter >}}{{< golangci/items/filter-badge content=\"Example\">}}{{< golangci/items/filter >}}\n*/ -}}\n\n<div class=\"hx:mt-6\">\n  <span class=\"hx:inline-block hx:align-text-bottom icon\" title=\"Filter\">\n    {{- partial \"utils/icon\" (dict \"name\" \"filter\" \"attributes\" \"height=1.2em\") -}}\n  </span>\n  {{ .Inner }}\n</div>\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/items/settings.html",
    "content": "{{- /*\nCreates a section for each setting of a linter/formatter.\n\n@param {string} info The name of the data file containing the linter/formatter information.\n@param {string} settings The name of the data file containing the linter/formatter settings.\n\n@example {{% golangci/items/settings info=\"formatters_info\" settings=\"formatter_settings\" %}}\n*/ -}}\n\n{{- $fileInfo := .Get \"info\" -}}\n{{- $fileSettings := .Get \"settings\" -}}\n\n{{- $gcilVersion := index $.Site.Data.version.version -}}\n{{- $info := index $.Site.Data $fileInfo -}}\n{{- $settings := index $.Site.Data $fileSettings -}}\n\n{{- range sort $info \"name\" -}}\n{{- if .internal -}}\n    {{- continue -}}\n{{- end -}}\n\n## {{ .name }}\n\n{{/* Description */}}\n{{ if .deprecation -}}\n{{- $replacement := \"\" -}}\n{{- if .deprecation.replacement -}}\n{{- $replacement = print \" Use `\" .deprecation.replacement \"` instead.\" -}}\n{{- end -}}\n{{ print (partial \"golangci/items/format-description\" .deprecation.message) $replacement }}\n{{ else }}\n{{ partial \"golangci/items/format-description\" .desc }}\n{{ end }}\n\n{{/* Badges */}}\n<p>\n{{ partial \"shortcodes/badge\" (dict\n    \"border\" false\n    \"icon\" \"calendar\"\n    \"class\" \"hx:mx-1\"\n    \"content\" (print \"Since golangci-lint \" .since)\n    )\n}}\n{{ if .deprecation -}}\n{{ partial \"shortcodes/badge\" (dict\n    \"border\" true\n    \"icon\" \"sparkles\"\n    \"class\" \"hx:mx-1\"\n    \"content\" (print \"Deprecated since \" .deprecation.since)\n    \"color\" \"red\"\n    )\n    }}\n{{ else }}\n    {{ if (partial \"golangci/items/compare-versions\" (dict \"a\" $gcilVersion \"b\" .since)) }}\n{{ partial \"shortcodes/badge\" (dict\n    \"border\" false\n    \"icon\" \"sparkles\"\n    \"class\" \"hx:mx-1\"\n    \"content\" \"New\"\n    \"color\" \"yellow\"\n    )\n}}\n    {{ end }}\n    {{ if .canAutoFix }}\n{{ partial \"shortcodes/badge\" (dict\n    \"border\" false\n    \"icon\" \"sparkles\"\n    \"class\" \"hx:mx-1\"\n    \"content\" \"Autofix\"\n    \"color\" \"blue\"\n    )\n}}\n    {{ end }}\n{{ end }}\n{{- if .originalURL -}}\n<a href=\"{{ .originalURL }}\" title=\"Repository\" target=\"_blank\">\n{{ partial \"shortcodes/badge\" (dict\n    \"border\" true\n    \"icon\" \"github\"\n    \"class\" \"hx:mx-1\"\n    \"content\" \"Repository\"\n    \"link\" .originalURL\n    )\n}}\n</a>\n{{- end -}}\n</p>\n\n{{/* Settings */}}\n{{- $setting := index $settings .name -}}\n{{- if $setting -}}\n```yaml\n{{ $setting | safeHTML}}\n```\n{{- else -}}\n_No settings available._\n{{- end }}\n\n{{ end -}}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/latest-version.html",
    "content": "{{- /*\nDisplays the latest version of golangci-lint.\nBased on the data file `data/version.json`.\n\n@example {{< golangci/latest-version >}}\n*/ -}}\n\n{{- $v := index $.Site.Data.version.version -}}\n{{- if $v -}}\n  {{- $v -}}\n{{- else if .Page.GitInfo -}}\n  {{- .Page.GitInfo.AbbreviatedCommit -}}\n{{- else -}}\n  devel\n{{- end -}}\n"
  },
  {
    "path": "docs/layouts/_shortcodes/golangci/starcharts.html",
    "content": "{{- /*\nDisplays a starchart for a GitHub repository.\nSupports both light and dark mode.\n\n@param {string} repo The name of the GitHub repository.\n\n@example {{< golangci/starcharts repo=\"golangci/golangci-lint\" >}}\n\n*/ -}}\n{{- $repo := .Get \"repo\" -}}\n\n<a href=\"https://starchart.cc/{{ $repo }}\" target=\"_blank\">\n  <img\n    alt=\"Stargazers over time\"\n    src=\"https://starchart.cc/{{ $repo }}.svg\"\n    class=\"hx:block hx:dark:hidden\"\n  />\n  <img\n    alt=\"Stargazers over time\"\n    src=\"https://starchart.cc/{{ $repo }}.svg?variant=dark\"\n    class=\"hx:hidden hx:dark:block\"\n  />\n</a>\n"
  },
  {
    "path": "docs/static/CNAME",
    "content": "golangci-lint.run\n"
  },
  {
    "path": "docs/static/site.webmanifest",
    "content": "{\n  \"name\": \"golangci-lint\",\n  \"short_name\": \"golangci-lint\",\n  \"start_url\": \"index.html\",\n  \"icons\": [\n    {\n      \"src\": \"android-chrome-192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"android-chrome-512x512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ],\n  \"theme_color\": \"#000000\",\n  \"background_color\": \"#000000\",\n  \"display\": \"standalone\"\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/golangci/golangci-lint/v2\n\n// The minimum Go version must always be latest-1.\n// This version should never be changed outside of the PR to add the support of newer Go version.\n// Only golangci-lint maintainers are allowed to change it.\ngo 1.25.0\n\nignore (\n\t./docs\n\t./jsonschema\n)\n\nrequire (\n\t4d63.com/gocheckcompilerdirectives v1.3.0\n\t4d63.com/gochecknoglobals v0.2.2\n\tcodeberg.org/polyfloyd/go-errorlint v1.9.0\n\tdev.gaijin.team/go/exhaustruct/v4 v4.0.0\n\tgithub.com/4meepo/tagalign v1.4.3\n\tgithub.com/Abirdcfly/dupword v0.1.7\n\tgithub.com/AdminBenni/iota-mixing v1.0.0\n\tgithub.com/AlwxSin/noinlineerr v1.0.5\n\tgithub.com/Antonboom/errname v1.1.1\n\tgithub.com/Antonboom/nilnil v1.1.1\n\tgithub.com/Antonboom/testifylint v1.6.4\n\tgithub.com/BurntSushi/toml v1.6.0\n\tgithub.com/Djarvur/go-err113 v0.1.1\n\tgithub.com/MirrexOne/unqueryvet v1.5.4\n\tgithub.com/OpenPeeDeeP/depguard/v2 v2.2.1\n\tgithub.com/alecthomas/chroma/v2 v2.23.1\n\tgithub.com/alecthomas/go-check-sumtype v0.3.1\n\tgithub.com/alexkohler/nakedret/v2 v2.0.6\n\tgithub.com/alexkohler/prealloc v1.1.0\n\tgithub.com/alingse/asasalint v0.0.11\n\tgithub.com/alingse/nilnesserr v0.2.0\n\tgithub.com/ashanbrown/forbidigo/v2 v2.3.0\n\tgithub.com/ashanbrown/makezero/v2 v2.1.0\n\tgithub.com/bkielbasa/cyclop v1.2.3\n\tgithub.com/blizzy78/varnamelen v0.8.0\n\tgithub.com/bombsimon/wsl/v4 v4.7.0\n\tgithub.com/bombsimon/wsl/v5 v5.6.0\n\tgithub.com/breml/bidichk v0.3.3\n\tgithub.com/breml/errchkjson v0.4.1\n\tgithub.com/butuzov/ireturn v0.4.0\n\tgithub.com/butuzov/mirror v1.3.0\n\tgithub.com/catenacyber/perfsprint v0.10.1\n\tgithub.com/charithe/durationcheck v0.0.11\n\tgithub.com/charmbracelet/lipgloss v1.1.0\n\tgithub.com/ckaznocha/intrange v0.3.1\n\tgithub.com/curioswitch/go-reassign v0.3.0\n\tgithub.com/daixiang0/gci v0.13.7\n\tgithub.com/denis-tingaikin/go-header v0.5.0\n\tgithub.com/fatih/color v1.18.0\n\tgithub.com/firefart/nonamedreturns v1.0.6\n\tgithub.com/fzipp/gocyclo v0.6.0\n\tgithub.com/ghostiam/protogetter v0.3.20\n\tgithub.com/go-critic/go-critic v0.14.3\n\tgithub.com/go-viper/mapstructure/v2 v2.5.0\n\tgithub.com/go-xmlfmt/xmlfmt v1.1.3\n\tgithub.com/godoc-lint/godoc-lint v0.11.2\n\tgithub.com/gofrs/flock v0.13.0\n\tgithub.com/golangci/asciicheck v0.5.0\n\tgithub.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32\n\tgithub.com/golangci/go-printf-func-name v0.1.1\n\tgithub.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d\n\tgithub.com/golangci/golines v0.15.0\n\tgithub.com/golangci/misspell v0.8.0\n\tgithub.com/golangci/plugin-module-register v0.1.2\n\tgithub.com/golangci/revgrep v0.8.0\n\tgithub.com/golangci/sqlclosecheck v0.0.0-20260317152156-1b5fadbb8565\n\tgithub.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e\n\tgithub.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e\n\tgithub.com/gordonklaus/ineffassign v0.2.0\n\tgithub.com/gostaticanalysis/forcetypeassert v0.2.0\n\tgithub.com/gostaticanalysis/nilerr v0.1.2\n\tgithub.com/hashicorp/go-version v1.8.0\n\tgithub.com/jgautheron/goconst v1.8.2\n\tgithub.com/jingyugao/rowserrcheck v1.1.1\n\tgithub.com/jjti/go-spancheck v0.6.5\n\tgithub.com/julz/importas v0.2.0\n\tgithub.com/karamaru-alpha/copyloopvar v1.2.2\n\tgithub.com/kisielk/errcheck v1.10.0\n\tgithub.com/kkHAIKE/contextcheck v1.1.6\n\tgithub.com/kulti/thelper v0.7.1\n\tgithub.com/kunwardeep/paralleltest v1.0.15\n\tgithub.com/lasiar/canonicalheader v1.1.2\n\tgithub.com/ldez/exptostd v0.4.5\n\tgithub.com/ldez/gomoddirectives v0.8.0\n\tgithub.com/ldez/grignotin v0.10.1\n\tgithub.com/ldez/tagliatelle v0.7.2\n\tgithub.com/ldez/usetesting v0.5.0\n\tgithub.com/leonklingele/grouper v1.1.2\n\tgithub.com/macabu/inamedparam v0.2.0\n\tgithub.com/manuelarte/embeddedstructfieldcheck v0.4.0\n\tgithub.com/manuelarte/funcorder v0.5.0\n\tgithub.com/maratori/testableexamples v1.0.1\n\tgithub.com/maratori/testpackage v1.1.2\n\tgithub.com/matoous/godox v1.1.0\n\tgithub.com/mattn/go-colorable v0.1.14\n\tgithub.com/mgechev/revive v1.15.0\n\tgithub.com/mitchellh/go-homedir v1.1.0\n\tgithub.com/moricho/tparallel v0.3.2\n\tgithub.com/nakabonne/nestif v0.3.1\n\tgithub.com/nishanths/exhaustive v0.12.0\n\tgithub.com/nishanths/predeclared v0.2.2\n\tgithub.com/nunnatsa/ginkgolinter v0.23.0\n\tgithub.com/pelletier/go-toml/v2 v2.2.4\n\tgithub.com/quasilyte/go-ruleguard/dsl v0.3.23\n\tgithub.com/raeperd/recvcheck v0.2.0\n\tgithub.com/rogpeppe/go-internal v1.14.1\n\tgithub.com/ryancurrah/gomodguard v1.4.1\n\tgithub.com/sanposhiho/wastedassign/v2 v2.1.0\n\tgithub.com/santhosh-tekuri/jsonschema/v6 v6.0.2\n\tgithub.com/sashamelentyev/interfacebloat v1.1.0\n\tgithub.com/sashamelentyev/usestdlibvars v1.29.0\n\tgithub.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08\n\tgithub.com/shirou/gopsutil/v4 v4.26.2\n\tgithub.com/sirupsen/logrus v1.9.4\n\tgithub.com/sivchari/containedctx v1.0.3\n\tgithub.com/sonatard/noctx v0.5.1\n\tgithub.com/sourcegraph/go-diff v0.7.0\n\tgithub.com/spf13/cobra v1.10.2\n\tgithub.com/spf13/pflag v1.0.10\n\tgithub.com/spf13/viper v1.12.0\n\tgithub.com/ssgreg/nlreturn/v2 v2.2.1\n\tgithub.com/stbenjam/no-sprintf-host-port v0.3.1\n\tgithub.com/stretchr/testify v1.11.1\n\tgithub.com/tetafro/godot v1.5.4\n\tgithub.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67\n\tgithub.com/timonwong/loggercheck v0.11.0\n\tgithub.com/tomarrell/wrapcheck/v2 v2.12.0\n\tgithub.com/tommy-muehle/go-mnd/v2 v2.5.1\n\tgithub.com/ultraware/funlen v0.2.0\n\tgithub.com/ultraware/whitespace v0.2.0\n\tgithub.com/uudashr/gocognit v1.2.1\n\tgithub.com/uudashr/iface v1.4.1\n\tgithub.com/valyala/quicktemplate v1.8.0\n\tgithub.com/xen0n/gosmopolitan v1.3.0\n\tgithub.com/yagipy/maintidx v1.0.0\n\tgithub.com/yeya24/promlinter v0.3.0\n\tgithub.com/ykadowak/zerologlint v0.1.5\n\tgitlab.com/bosi/decorder v0.4.2\n\tgo-simpler.org/musttag v0.14.0\n\tgo-simpler.org/sloglint v0.11.1\n\tgo.augendre.info/arangolint v0.4.0\n\tgo.augendre.info/fatcontext v0.9.0\n\tgo.yaml.in/yaml/v3 v3.0.4\n\tgolang.org/x/exp v0.0.0-20250620022241-b7579e27df2b\n\tgolang.org/x/mod v0.34.0\n\tgolang.org/x/sync v0.20.0\n\tgolang.org/x/sys v0.42.0\n\tgolang.org/x/tools v0.43.0\n\thonnef.co/go/tools v0.7.0\n\tmvdan.cc/gofumpt v0.9.2\n\tmvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15\n)\n\nrequire (\n\tcodeberg.org/chavacava/garif v0.2.0 // indirect\n\tdev.gaijin.team/go/golib v0.6.0 // indirect\n\tgithub.com/Masterminds/semver/v3 v3.4.0 // indirect\n\tgithub.com/alfatraining/structtag v1.0.0 // indirect\n\tgithub.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/ccojocar/zxcvbn-go v1.0.4 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect\n\tgithub.com/charmbracelet/x/ansi v0.10.1 // indirect\n\tgithub.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect\n\tgithub.com/charmbracelet/x/term v0.2.1 // indirect\n\tgithub.com/dave/dst v0.27.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/dlclark/regexp2 v1.11.5 // indirect\n\tgithub.com/ebitengine/purego v0.10.0 // indirect\n\tgithub.com/ettle/strcase v0.2.0 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-ole/go-ole v1.2.6 // indirect\n\tgithub.com/go-toolsmith/astcast v1.1.0 // indirect\n\tgithub.com/go-toolsmith/astcopy v1.1.0 // indirect\n\tgithub.com/go-toolsmith/astequal v1.2.0 // indirect\n\tgithub.com/go-toolsmith/astfmt v1.1.0 // indirect\n\tgithub.com/go-toolsmith/astp v1.1.0 // indirect\n\tgithub.com/go-toolsmith/strparse v1.1.0 // indirect\n\tgithub.com/go-toolsmith/typep v1.1.0 // indirect\n\tgithub.com/gobwas/glob v0.2.3 // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/go-cmp v0.7.0 // indirect\n\tgithub.com/gostaticanalysis/analysisutil v0.7.1 // indirect\n\tgithub.com/gostaticanalysis/comment v1.5.0 // indirect\n\tgithub.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect\n\tgithub.com/hashicorp/golang-lru/v2 v2.0.7 // indirect\n\tgithub.com/hashicorp/hcl v1.0.0 // indirect\n\tgithub.com/hexops/gotextdiff v1.0.3 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n\tgithub.com/ldez/structtags v0.6.1 // indirect\n\tgithub.com/lucasb-eyer/go-colorful v1.2.0 // indirect\n\tgithub.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect\n\tgithub.com/magiconair/properties v1.8.6 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.16 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/muesli/termenv v0.16.0 // indirect\n\tgithub.com/pelletier/go-toml v1.9.5 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect\n\tgithub.com/prometheus/client_golang v1.12.1 // indirect\n\tgithub.com/prometheus/client_model v0.2.0 // indirect\n\tgithub.com/prometheus/common v0.32.1 // indirect\n\tgithub.com/prometheus/procfs v0.7.3 // indirect\n\tgithub.com/quasilyte/go-ruleguard v0.4.5 // indirect\n\tgithub.com/quasilyte/gogrep v0.5.0 // indirect\n\tgithub.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect\n\tgithub.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect\n\tgithub.com/rivo/uniseg v0.4.7 // indirect\n\tgithub.com/spf13/afero v1.15.0 // indirect\n\tgithub.com/spf13/cast v1.5.0 // indirect\n\tgithub.com/spf13/jwalterweatherman v1.1.0 // indirect\n\tgithub.com/stretchr/objx v0.5.2 // indirect\n\tgithub.com/subosito/gotenv v1.4.1 // indirect\n\tgithub.com/tklauser/go-sysconf v0.3.16 // indirect\n\tgithub.com/tklauser/numcpus v0.11.0 // indirect\n\tgithub.com/valyala/bytebufferpool v1.0.0 // indirect\n\tgithub.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect\n\tgithub.com/yusufpapurcu/wmi v1.2.4 // indirect\n\tgo.uber.org/multierr v1.10.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect\n\tgolang.org/x/text v0.35.0 // indirect\n\tgolang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect\n\tgoogle.golang.org/protobuf v1.36.8 // indirect\n\tgopkg.in/ini.v1 v1.67.0 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A=\n4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY=\n4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU=\n4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0=\ncloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ncodeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY=\ncodeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ=\ncodeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI=\ncodeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8=\ndev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y=\ndev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI=\ndev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo=\ndev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8=\ngithub.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c=\ngithub.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ=\ngithub.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4=\ngithub.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo=\ngithub.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY=\ngithub.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY=\ngithub.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc=\ngithub.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q=\ngithub.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ=\ngithub.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ=\ngithub.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II=\ngithub.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ=\ngithub.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=\ngithub.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g=\ngithub.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k=\ngithub.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=\ngithub.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=\ngithub.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ=\ngithub.com/MirrexOne/unqueryvet v1.5.4/go.mod h1:fs9Zq6eh1LRIhsDIsxf9PONVUjYdFHdtkHIgZdJnyPU=\ngithub.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4=\ngithub.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo=\ngithub.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=\ngithub.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=\ngithub.com/alecthomas/chroma/v2 v2.23.1 h1:nv2AVZdTyClGbVQkIzlDm/rnhk1E9bU9nXwmZ/Vk/iY=\ngithub.com/alecthomas/chroma/v2 v2.23.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o=\ngithub.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU=\ngithub.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E=\ngithub.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=\ngithub.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ=\ngithub.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q=\ngithub.com/alexkohler/prealloc v1.1.0 h1:cKGRBqlXw5iyQGLYhrXrDlcHxugXpTq4tQ5c91wkf8M=\ngithub.com/alexkohler/prealloc v1.1.0/go.mod h1:fT39Jge3bQrfA7nPMDngUfvUbQGQeJyGQnR+913SCig=\ngithub.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc=\ngithub.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus=\ngithub.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw=\ngithub.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I=\ngithub.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w=\ngithub.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg=\ngithub.com/ashanbrown/forbidigo/v2 v2.3.0 h1:OZZDOchCgsX5gvToVtEBoV2UWbFfI6RKQTir2UZzSxo=\ngithub.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkvY2rRV9nMdWadd6c=\ngithub.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE=\ngithub.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY=\ngithub.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=\ngithub.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w=\ngithub.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo=\ngithub.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M=\ngithub.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=\ngithub.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ=\ngithub.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg=\ngithub.com/bombsimon/wsl/v5 v5.6.0 h1:4z+/sBqC5vUmSp1O0mS+czxwH9+LKXtCWtHH9rZGQL8=\ngithub.com/bombsimon/wsl/v5 v5.6.0/go.mod h1:Uqt2EfrMj2NV8UGoN1f1Y3m0NpUVCsUdrNCdet+8LvU=\ngithub.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE=\ngithub.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE=\ngithub.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg=\ngithub.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s=\ngithub.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E=\ngithub.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70=\ngithub.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc=\ngithub.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI=\ngithub.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ=\ngithub.com/catenacyber/perfsprint v0.10.1/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc=\ngithub.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc=\ngithub.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk=\ngithub.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4=\ngithub.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=\ngithub.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=\ngithub.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=\ngithub.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=\ngithub.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ=\ngithub.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=\ngithub.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=\ngithub.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=\ngithub.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=\ngithub.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs=\ngithub.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=\ngithub.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs=\ngithub.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88=\ngithub.com/daixiang0/gci v0.13.7 h1:+0bG5eK9vlI08J+J/NWGbWPTNiXPG4WhNLJOkSxWITQ=\ngithub.com/daixiang0/gci v0.13.7/go.mod h1:812WVN6JLFY9S6Tv76twqmNqevN0pa3SX3nih0brVzQ=\ngithub.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY=\ngithub.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc=\ngithub.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo=\ngithub.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8=\ngithub.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY=\ngithub.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=\ngithub.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU=\ngithub.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=\ngithub.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=\ngithub.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=\ngithub.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E=\ngithub.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo=\ngithub.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=\ngithub.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=\ngithub.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=\ngithub.com/ghostiam/protogetter v0.3.20 h1:oW7OPFit2FxZOpmMRPP9FffU4uUpfeE/rEdE1f+MzD0=\ngithub.com/ghostiam/protogetter v0.3.20/go.mod h1:FjIu5Yfs6FT391m+Fjp3fbAYJ6rkL/J6ySpZBfnODuI=\ngithub.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog=\ngithub.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=\ngithub.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=\ngithub.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=\ngithub.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=\ngithub.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8=\ngithub.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU=\ngithub.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s=\ngithub.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw=\ngithub.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4=\ngithub.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ=\ngithub.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw=\ngithub.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY=\ngithub.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco=\ngithub.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4=\ngithub.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA=\ngithub.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA=\ngithub.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk=\ngithub.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus=\ngithub.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=\ngithub.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw=\ngithub.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ=\ngithub.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus=\ngithub.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig=\ngithub.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=\ngithub.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=\ngithub.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY=\ngithub.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=\ngithub.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=\ngithub.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=\ngithub.com/godoc-lint/godoc-lint v0.11.2 h1:Bp0FkJWoSdNsBikdNgIcgtaoo+xz6I/Y9s5WSBQUeeM=\ngithub.com/godoc-lint/godoc-lint v0.11.2/go.mod h1:iVpGdL1JCikNH2gGeAn3Hh+AgN5Gx/I/cxV+91L41jo=\ngithub.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw=\ngithub.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0=\ngithub.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ=\ngithub.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw=\ngithub.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E=\ngithub.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U=\ngithub.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss=\ngithub.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE=\ngithub.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY=\ngithub.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0=\ngithub.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10=\ngithub.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg=\ngithub.com/golangci/misspell v0.8.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg=\ngithub.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg=\ngithub.com/golangci/plugin-module-register v0.1.2/go.mod h1:1+QGTsKBvAIvPvoY/os+G5eoqxWn70HYDm2uvUyGuVw=\ngithub.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s=\ngithub.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k=\ngithub.com/golangci/sqlclosecheck v0.0.0-20260317152156-1b5fadbb8565 h1:fI1TNZdfJwSslKBsHYJ2z3ULc6nm4XEe6+uarzpSJ6Y=\ngithub.com/golangci/sqlclosecheck v0.0.0-20260317152156-1b5fadbb8565/go.mod h1:GfuBfcLE7vrbeKKWP6/9xMO2o4KQJWPNDh4SfnkxYII=\ngithub.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e h1:ai0EfmVYE2bRA5htgAG9r7s3tHsfjIhN98WshBTJ9jM=\ngithub.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e/go.mod h1:Vrn4B5oR9qRwM+f54koyeH3yzphlecwERs0el27Fr/s=\ngithub.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM=\ngithub.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc=\ngithub.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs=\ngithub.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw=\ngithub.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk=\ngithub.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc=\ngithub.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM=\ngithub.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8=\ngithub.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc=\ngithub.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk=\ngithub.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY=\ngithub.com/gostaticanalysis/nilerr v0.1.2 h1:S6nk8a9N8g062nsx63kUkF6AzbHGw7zzyHMcpu52xQU=\ngithub.com/gostaticanalysis/nilerr v0.1.2/go.mod h1:A19UHhoY3y8ahoL7YKz6sdjDtduwTSI4CsymaC2htPA=\ngithub.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=\ngithub.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8=\ngithub.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs=\ngithub.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo=\ngithub.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw=\ngithub.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\ngithub.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4=\ngithub.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=\ngithub.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=\ngithub.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=\ngithub.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\ngithub.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4=\ngithub.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako=\ngithub.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs=\ngithub.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c=\ngithub.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8=\ngithub.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ=\ngithub.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY=\ngithub.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0=\ngithub.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY=\ngithub.com/kisielk/errcheck v1.10.0 h1:Lvs/YAHP24YKg08LA8oDw2z9fJVme090RAXd90S+rrw=\ngithub.com/kisielk/errcheck v1.10.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE=\ngithub.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/kulti/thelper v0.7.1 h1:fI8QITAoFVLx+y+vSyuLBP+rcVIB8jKooNSCT2EiI98=\ngithub.com/kulti/thelper v0.7.1/go.mod h1:NsMjfQEy6sd+9Kfw8kCP61W1I0nerGSYSFnGaxQkcbs=\ngithub.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJMLyncOb6w=\ngithub.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk=\ngithub.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4=\ngithub.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI=\ngithub.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ=\ngithub.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM=\ngithub.com/ldez/gomoddirectives v0.8.0 h1:JqIuTtgvFC2RdH1s357vrE23WJF2cpDCPFgA/TWDGpk=\ngithub.com/ldez/gomoddirectives v0.8.0/go.mod h1:jutzamvZR4XYJLr0d5Honycp4Gy6GEg2mS9+2YX3F1Q=\ngithub.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o=\ngithub.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas=\ngithub.com/ldez/structtags v0.6.1 h1:bUooFLbXx41tW8SvkfwfFkkjPYvFFs59AAMgVg6DUBk=\ngithub.com/ldez/structtags v0.6.1/go.mod h1:YDxVSgDy/MON6ariaxLF2X09bh19qL7MtGBN5MrvbdY=\ngithub.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk=\ngithub.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI=\ngithub.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc=\ngithub.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ=\ngithub.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=\ngithub.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=\ngithub.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=\ngithub.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=\ngithub.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=\ngithub.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=\ngithub.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE=\ngithub.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U=\ngithub.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=\ngithub.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=\ngithub.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww=\ngithub.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM=\ngithub.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8=\ngithub.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA=\ngithub.com/maratori/testableexamples v1.0.1 h1:HfOQXs+XgfeRBJ+Wz0XfH+FHnoY9TVqL6Fcevpzy4q8=\ngithub.com/maratori/testableexamples v1.0.1/go.mod h1:XE2F/nQs7B9N08JgyRmdGjYVGqxWwClLPCGSQhXQSrQ=\ngithub.com/maratori/testpackage v1.1.2 h1:ffDSh+AgqluCLMXhM19f/cpvQAKygKAJXFl9aUjmbqs=\ngithub.com/maratori/testpackage v1.1.2/go.mod h1:8F24GdVDFW5Ew43Et02jamrVMNXLUNaOynhDssITGfc=\ngithub.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4=\ngithub.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs=\ngithub.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=\ngithub.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=\ngithub.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=\ngithub.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=\ngithub.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q=\ngithub.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI=\ngithub.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U=\ngithub.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=\ngithub.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U=\ngithub.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE=\ngithub.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg=\ngithub.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs=\ngithub.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk=\ngithub.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c=\ngithub.com/nunnatsa/ginkgolinter v0.23.0 h1:x3o4DGYOWbBMP/VdNQKgSj+25aJKx2Pe6lHr8gBcgf8=\ngithub.com/nunnatsa/ginkgolinter v0.23.0/go.mod h1:9qN1+0akwXEccwV1CAcCDfcoBlWXHB+ML9884pL4SZ4=\ngithub.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI=\ngithub.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE=\ngithub.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28=\ngithub.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg=\ngithub.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=\ngithub.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=\ngithub.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=\ngithub.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=\ngithub.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=\ngithub.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=\ngithub.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=\ngithub.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=\ngithub.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=\ngithub.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA=\ngithub.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE=\ngithub.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY=\ngithub.com/quasilyte/go-ruleguard/dsl v0.3.23/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=\ngithub.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo=\ngithub.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng=\ngithub.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU=\ngithub.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=\ngithub.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs=\ngithub.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ=\ngithub.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI=\ngithub.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU=\ngithub.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=\ngithub.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=\ngithub.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\ngithub.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g=\ngithub.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I=\ngithub.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0=\ngithub.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4=\ngithub.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=\ngithub.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=\ngithub.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw=\ngithub.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ=\ngithub.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ=\ngithub.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8=\ngithub.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08 h1:AoLtJX4WUtZkhhUUMFy3GgecAALp/Mb4S1iyQOA2s0U=\ngithub.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08/go.mod h1:+XLCJiRE95ga77XInNELh2M6zQP+PdqiT9Zpm0D9Wpk=\ngithub.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=\ngithub.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=\ngithub.com/shirou/gopsutil/v4 v4.26.2 h1:X8i6sicvUFih4BmYIGT1m2wwgw2VG9YgrDTi7cIRGUI=\ngithub.com/shirou/gopsutil/v4 v4.26.2/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ=\ngithub.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=\ngithub.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=\ngithub.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=\ngithub.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE=\ngithub.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4=\ngithub.com/sonatard/noctx v0.5.1 h1:wklWg9c9ZYugOAk7qG4yP4PBrlQsmSLPTvW1K4PRQMs=\ngithub.com/sonatard/noctx v0.5.1/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas=\ngithub.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0=\ngithub.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=\ngithub.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=\ngithub.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=\ngithub.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=\ngithub.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=\ngithub.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=\ngithub.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=\ngithub.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=\ngithub.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\ngithub.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=\ngithub.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI=\ngithub.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0=\ngithub.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=\ngithub.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g=\ngithub.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=\ngithub.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=\ngithub.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA=\ngithub.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=\ngithub.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag=\ngithub.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY=\ngithub.com/tetafro/godot v1.5.4 h1:u1ww+gqpRLiIA16yF2PV1CV1n/X3zhyezbNXC3E14Sg=\ngithub.com/tetafro/godot v1.5.4/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU=\ngithub.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk5r6+hJnar67cgpDIz/iyD+rfl5r2Vk=\ngithub.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460=\ngithub.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M=\ngithub.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8=\ngithub.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=\ngithub.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI=\ngithub.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=\ngithub.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ=\ngithub.com/tomarrell/wrapcheck/v2 v2.12.0 h1:H/qQ1aNWz/eeIhxKAFvkfIA+N7YDvq6TWVFL27Of9is=\ngithub.com/tomarrell/wrapcheck/v2 v2.12.0/go.mod h1:AQhQuZd0p7b6rfW+vUwHm5OMCGgp63moQ9Qr/0BpIWo=\ngithub.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=\ngithub.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=\ngithub.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI=\ngithub.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA=\ngithub.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g=\ngithub.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8=\ngithub.com/uudashr/gocognit v1.2.1 h1:CSJynt5txTnORn/DkhiB4mZjwPuifyASC8/6Q0I/QS4=\ngithub.com/uudashr/gocognit v1.2.1/go.mod h1:acaubQc6xYlXFEMb9nWX2dYBzJ/bIjEkc1zzvyIZg5Q=\ngithub.com/uudashr/iface v1.4.1 h1:J16Xl1wyNX9ofhpHmQ9h9gk5rnv2A6lX/2+APLTo0zU=\ngithub.com/uudashr/iface v1.4.1/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg=\ngithub.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=\ngithub.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=\ngithub.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k=\ngithub.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM=\ngithub.com/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM=\ngithub.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4=\ngithub.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=\ngithub.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=\ngithub.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM=\ngithub.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk=\ngithub.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs=\ngithub.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4=\ngithub.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw=\ngithub.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngithub.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=\ngithub.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=\ngitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo=\ngitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8=\ngo-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ=\ngo-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28=\ngo-simpler.org/musttag v0.14.0 h1:XGySZATqQYSEV3/YTy+iX+aofbZZllJaqwFWs+RTtSo=\ngo-simpler.org/musttag v0.14.0/go.mod h1:uP8EymctQjJ4Z1kUnjX0u2l60WfUdQxCwSNKzE1JEOE=\ngo-simpler.org/sloglint v0.11.1 h1:xRbPepLT/MHPTCA6TS/wNfZrDzkGvCCqUv4Bdwc3H7s=\ngo-simpler.org/sloglint v0.11.1/go.mod h1:2PowwiCOK8mjiF+0KGifVOT8ZsCNiFzvfyJeJOIt8MQ=\ngo.augendre.info/arangolint v0.4.0 h1:xSCZjRoS93nXazBSg5d0OGCi9APPLNMmmLrC995tR50=\ngo.augendre.info/arangolint v0.4.0/go.mod h1:l+f/b4plABuFISuKnTGD4RioXiCCgghv2xqst/xOvAA=\ngo.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE=\ngo.augendre.info/fatcontext v0.9.0/go.mod h1:L94brOAT1OOUNue6ph/2HnwxoNlds9aXDF2FcUntbNw=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=\ngo.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngo.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\ngo.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=\ngolang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=\ngolang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=\ngolang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=\ngolang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=\ngolang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 h1:qWFG1Dj7TBjOjOvhEOkmyGPVoquqUKnIU0lEVLp8xyk=\ngolang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=\ngolang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=\ngolang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=\ngolang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=\ngolang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=\ngolang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=\ngolang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=\ngolang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=\ngolang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=\ngolang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=\ngolang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=\ngolang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=\ngolang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=\ngolang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=\ngolang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=\ngolang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=\ngolang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=\ngolang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=\ngolang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=\ngoogle.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\ngopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU=\nhonnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc=\nmvdan.cc/gofumpt v0.9.2 h1:zsEMWL8SVKGHNztrx6uZrXdp7AX8r421Vvp23sz7ik4=\nmvdan.cc/gofumpt v0.9.2/go.mod h1:iB7Hn+ai8lPvofHd9ZFGVg2GOr8sBUw1QUWjNbmIL/s=\nmvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI=\nmvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "install.sh",
    "content": "#!/bin/sh\nset -e\n\nusage() {\n  this=$1\n  cat <<EOF\n$this: download go binaries for golangci/golangci-lint\n\nUsage: $this [-b <bindir>] [-d] [<tag>]\n  -b sets bindir or installation directory, Defaults to ./bin\n  -d turns on debug logging\n   <tag> is a tag from\n   https://github.com/golangci/golangci-lint/releases\n   If tag is missing, then the latest will be used.\n\nEOF\n  exit 2\n}\n\nparse_args() {\n  # BINDIR is ./bin unless set be ENV\n  # overridden by flag below\n\n  BINDIR=${BINDIR:-./bin}\n  while getopts \"b:dh?x\" arg; do\n    case \"$arg\" in\n      b) BINDIR=\"$OPTARG\" ;;\n      d) log_set_priority 10 ;;\n      h | \\?) usage \"$0\" ;;\n      x) set -x ;;\n    esac\n  done\n  shift $((OPTIND - 1))\n  TAG=$1\n}\n# this function wraps all the destructive operations\n# if a curl|bash cuts off the end of the script due to\n# network, either nothing will happen or will syntax error\n# out preventing half-done work\nexecute() {\n  tmpdir=$(mktemp -d)\n  log_debug \"downloading files into ${tmpdir}\"\n  http_download \"${tmpdir}/${TARBALL}\" \"${TARBALL_URL}\"\n  http_download \"${tmpdir}/${CHECKSUM}\" \"${CHECKSUM_URL}\"\n  hash_sha256_verify \"${tmpdir}/${TARBALL}\" \"${tmpdir}/${CHECKSUM}\"\n  srcdir=\"${tmpdir}/${NAME}\"\n  rm -rf \"${srcdir}\"\n  (cd \"${tmpdir}\" && untar \"${TARBALL}\")\n  test ! -d \"${BINDIR}\" && install -d \"${BINDIR}\"\n  for binexe in $BINARIES; do\n    if [ \"$OS\" = \"windows\" ]; then\n      binexe=\"${binexe}.exe\"\n    fi\n    install \"${srcdir}/${binexe}\" \"${BINDIR}/\"\n    log_info \"installed ${BINDIR}/${binexe}\"\n  done\n  rm -rf \"${tmpdir}\"\n}\nget_binaries() {\n  case \"$PLATFORM\" in\n    darwin/amd64) BINARIES=\"golangci-lint\" ;;\n    darwin/arm64) BINARIES=\"golangci-lint\" ;;\n    darwin/armv6) BINARIES=\"golangci-lint\" ;;\n    darwin/armv7) BINARIES=\"golangci-lint\" ;;\n    darwin/mips64) BINARIES=\"golangci-lint\" ;;\n    darwin/mips64le) BINARIES=\"golangci-lint\" ;;\n    darwin/ppc64le) BINARIES=\"golangci-lint\" ;;\n    darwin/s390x) BINARIES=\"golangci-lint\" ;;\n    freebsd/386) BINARIES=\"golangci-lint\" ;;\n    freebsd/amd64) BINARIES=\"golangci-lint\" ;;\n    freebsd/arm64) BINARIES=\"golangci-lint\" ;;\n    freebsd/armv6) BINARIES=\"golangci-lint\" ;;\n    freebsd/armv7) BINARIES=\"golangci-lint\" ;;\n    freebsd/mips64) BINARIES=\"golangci-lint\" ;;\n    freebsd/mips64le) BINARIES=\"golangci-lint\" ;;\n    freebsd/ppc64le) BINARIES=\"golangci-lint\" ;;\n    freebsd/s390x) BINARIES=\"golangci-lint\" ;;\n    illumos/amd64) BINARIES=\"golangci-lint\" ;;\n    linux/386) BINARIES=\"golangci-lint\" ;;\n    linux/amd64) BINARIES=\"golangci-lint\" ;;\n    linux/arm64) BINARIES=\"golangci-lint\" ;;\n    linux/armv6) BINARIES=\"golangci-lint\" ;;\n    linux/armv7) BINARIES=\"golangci-lint\" ;;\n    linux/mips64) BINARIES=\"golangci-lint\" ;;\n    linux/mips64le) BINARIES=\"golangci-lint\" ;;\n    linux/ppc64le) BINARIES=\"golangci-lint\" ;;\n    linux/s390x) BINARIES=\"golangci-lint\" ;;\n    linux/riscv64) BINARIES=\"golangci-lint\" ;;\n    linux/loong64) BINARIES=\"golangci-lint\" ;;\n    netbsd/386) BINARIES=\"golangci-lint\" ;;\n    netbsd/amd64) BINARIES=\"golangci-lint\" ;;\n    netbsd/armv6) BINARIES=\"golangci-lint\" ;;\n    netbsd/armv7) BINARIES=\"golangci-lint\" ;;\n    windows/386) BINARIES=\"golangci-lint\" ;;\n    windows/amd64) BINARIES=\"golangci-lint\" ;;\n    windows/arm64) BINARIES=\"golangci-lint\" ;;\n    windows/armv6) BINARIES=\"golangci-lint\" ;;\n    windows/armv7) BINARIES=\"golangci-lint\" ;;\n    windows/mips64) BINARIES=\"golangci-lint\" ;;\n    windows/mips64le) BINARIES=\"golangci-lint\" ;;\n    windows/ppc64le) BINARIES=\"golangci-lint\" ;;\n    windows/s390x) BINARIES=\"golangci-lint\" ;;\n    *)\n      log_crit \"platform $PLATFORM is not supported.  Make sure this script is up-to-date and file request at https://github.com/${PREFIX}/issues/new\"\n      exit 1\n      ;;\n  esac\n}\ntag_to_version() {\n  if [ -z \"${TAG}\" ]; then\n    log_info \"checking GitHub for latest tag\"\n  else\n    log_info \"checking GitHub for tag '${TAG}'\"\n  fi\n  REALTAG=$(github_release \"$OWNER/$REPO\" \"${TAG}\") && true\n  if test -z \"$REALTAG\"; then\n    log_crit \"unable to find '${TAG}' - use 'latest' or see https://github.com/${PREFIX}/releases for details\"\n    exit 1\n  fi\n  # if version starts with 'v', remove it\n  TAG=\"$REALTAG\"\n  VERSION=${TAG#v}\n}\nadjust_format() {\n  # change format (tar.gz or zip) based on OS\n  case ${OS} in\n    windows) FORMAT=zip ;;\n  esac\n  true\n}\nadjust_os() {\n  # adjust archive name based on OS\n  true\n}\nadjust_arch() {\n  # adjust archive name based on ARCH\n  true\n}\n\ncat /dev/null <<EOF\n------------------------------------------------------------------------\nhttps://github.com/client9/shlib - portable posix shell functions\nPublic domain - http://unlicense.org\nhttps://github.com/client9/shlib/blob/HEAD/LICENSE.md\nbut credit (and pull requests) appreciated.\n------------------------------------------------------------------------\nEOF\nis_command() {\n  command -v \"$1\" >/dev/null\n}\nechoerr() {\n  echo \"$@\" 1>&2\n}\n_logp=6\nlog_set_priority() {\n  _logp=\"$1\"\n}\nlog_priority() {\n  if test -z \"$1\"; then\n    echo \"$_logp\"\n    return\n  fi\n  [ \"$1\" -le \"$_logp\" ]\n}\nlog_tag() {\n  case $1 in\n    0) echo \"emerg\" ;;\n    1) echo \"alert\" ;;\n    2) echo \"crit\" ;;\n    3) echo \"err\" ;;\n    4) echo \"warning\" ;;\n    5) echo \"notice\" ;;\n    6) echo \"info\" ;;\n    7) echo \"debug\" ;;\n    *) echo \"$1\" ;;\n  esac\n}\nlog_debug() {\n  log_priority 7 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 7)\" \"$@\"\n}\nlog_info() {\n  log_priority 6 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 6)\" \"$@\"\n}\nlog_err() {\n  log_priority 3 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 3)\" \"$@\"\n}\nlog_crit() {\n  log_priority 2 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 2)\" \"$@\"\n}\nuname_os() {\n  os=$(uname -s | tr '[:upper:]' '[:lower:]')\n  case \"$os\" in\n    msys*) os=\"windows\" ;;\n    mingw*) os=\"windows\" ;;\n    cygwin*) os=\"windows\" ;;\n    win*) os=\"windows\" ;;\n    sunos) [ \"$(uname -o)\" = \"illumos\" ] && os=illumos ;;\n  esac\n  echo \"$os\"\n}\nuname_arch() {\n  arch=$(uname -m)\n  case $arch in\n    x86_64) arch=\"amd64\" ;;\n    x86) arch=\"386\" ;;\n    i686) arch=\"386\" ;;\n    i386) arch=\"386\" ;;\n    i86pc) arch=\"amd64\" ;;\n    aarch64) arch=\"arm64\" ;;\n    armv5*) arch=\"armv5\" ;;\n    armv6*) arch=\"armv6\" ;;\n    armv7*) arch=\"armv7\" ;;\n    loongarch64) arch=\"loong64\" ;;\n  esac\n  echo \"${arch}\"\n}\nuname_os_check() {\n  os=$(uname_os)\n  case \"$os\" in\n    darwin) return 0 ;;\n    dragonfly) return 0 ;;\n    freebsd) return 0 ;;\n    illumos) return 0;;\n    linux) return 0 ;;\n    android) return 0 ;;\n    nacl) return 0 ;;\n    netbsd) return 0 ;;\n    openbsd) return 0 ;;\n    plan9) return 0 ;;\n    solaris) return 0 ;;\n    windows) return 0 ;;\n  esac\n  log_crit \"uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value.\"\n  return 1\n}\nuname_arch_check() {\n  arch=$(uname_arch)\n  case \"$arch\" in\n    386) return 0 ;;\n    amd64) return 0 ;;\n    arm64) return 0 ;;\n    armv5) return 0 ;;\n    armv6) return 0 ;;\n    armv7) return 0 ;;\n    ppc64) return 0 ;;\n    ppc64le) return 0 ;;\n    mips) return 0 ;;\n    mipsle) return 0 ;;\n    mips64) return 0 ;;\n    mips64le) return 0 ;;\n    s390x) return 0 ;;\n    riscv64) return 0 ;;\n    amd64p32) return 0 ;;\n    loong64) return 0 ;;\n  esac\n  log_crit \"uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value.\"\n  return 1\n}\nuntar() {\n  tarball=$1\n  case \"${tarball}\" in\n    *.tar.gz | *.tgz) tar --no-same-owner -xzf \"${tarball}\" ;;\n    *.tar) tar --no-same-owner -xf \"${tarball}\" ;;\n    *.zip) unzip \"${tarball}\" ;;\n    *)\n      log_err \"untar unknown archive format for ${tarball}\"\n      return 1\n      ;;\n  esac\n}\nhttp_download_curl() {\n  local_file=$1\n  source_url=$2\n  header=$3\n\n  # workaround https://github.com/curl/curl/issues/13845\n  curl_version=$(curl --version | head -n 1 | awk '{ print $2 }')\n  if [ \"$curl_version\" = \"8.8.0\" ]; then\n    log_debug \"http_download_curl curl $curl_version detected\"\n    if [ -z \"$header\" ]; then\n      curl -sL -o \"$local_file\" \"$source_url\"\n    else\n      curl -sL -H \"$header\" -o \"$local_file\" \"$source_url\"\n\n      nf=$(cat \"$local_file\" | jq -r '.error // \"\"')\n      if  [ ! -z \"$nf\" ]; then\n        log_debug \"http_download_curl received an error: $nf\"\n        return 1\n      fi\n    fi\n\n    return 0\n  fi\n\n  if [ -z \"$header\" ]; then\n    code=$(curl -w '%{http_code}' -sL -o \"$local_file\" \"$source_url\")\n  else\n    code=$(curl -w '%{http_code}' -sL -H \"$header\" -o \"$local_file\" \"$source_url\")\n  fi\n  if [ \"$code\" != \"200\" ]; then\n    log_err \"http_download_curl received HTTP status $code\"\n    return 1\n  fi\n  return 0\n}\nhttp_download_wget() {\n  local_file=$1\n  source_url=$2\n  header=$3\n  local wget_output\n  local code\n  if [ -z \"$header\" ]; then\n    wget_output=$(wget --server-response --quiet -O \"$local_file\" \"$source_url\" 2>&1)\n  else\n    wget_output=$(wget --server-response --quiet --header \"$header\" -O \"$local_file\" \"$source_url\" 2>&1)\n  fi\n  local wget_exit=$?\n  if [ $wget_exit -ne 0 ]; then\n    log_err \"http_download_wget failed: wget exited with status $wget_exit\"\n    return 1\n  fi\n  code=$(echo \"$wget_output\" | awk '/^  HTTP/{print $2}' | tail -n1)\n  if [ \"$code\" != \"200\" ]; then\n    log_err \"http_download_wget received HTTP status $code\"\n    return 1\n  fi\n  return 0\n}\nhttp_download() {\n  log_debug \"http_download $2\"\n  if is_command curl; then\n    http_download_curl \"$@\"\n    return\n  elif is_command wget; then\n    http_download_wget \"$@\"\n    return\n  fi\n  log_crit \"http_download unable to find wget or curl\"\n  return 1\n}\nhttp_copy() {\n  tmp=$(mktemp)\n  http_download \"${tmp}\" \"$1\" \"$2\" || return 1\n  body=$(cat \"$tmp\")\n  rm -f \"${tmp}\"\n  echo \"$body\"\n}\ngithub_release() {\n  owner_repo=$1\n  version=$2\n  test -z \"$version\" && version=\"latest\"\n  giturl=\"https://github.com/${owner_repo}/releases/${version}\"\n  json=$(http_copy \"$giturl\" \"Accept:application/json\")\n  test -z \"$json\" && return 1\n  version=$(echo \"$json\" | tr -s '\\n' ' ' | sed 's/.*\"tag_name\":\"//' | sed 's/\".*//')\n  test -z \"$version\" && return 1\n  echo \"$version\"\n}\nhash_sha256() {\n  TARGET=${1:-/dev/stdin}\n  if is_command gsha256sum; then\n    hash=$(gsha256sum \"$TARGET\") || return 1\n    echo \"$hash\" | cut -d ' ' -f 1\n  elif is_command sha256sum; then\n    hash=$(sha256sum \"$TARGET\") || return 1\n    echo \"$hash\" | cut -d ' ' -f 1\n  elif is_command shasum; then\n    hash=$(shasum -a 256 \"$TARGET\" 2>/dev/null) || return 1\n    echo \"$hash\" | cut -d ' ' -f 1\n  elif is_command openssl; then\n    hash=$(openssl -dst openssl dgst -sha256 \"$TARGET\") || return 1\n    echo \"$hash\" | cut -d ' ' -f a\n  else\n    log_crit \"hash_sha256 unable to find command to compute sha-256 hash\"\n    return 1\n  fi\n}\nhash_sha256_verify() {\n  TARGET=$1\n  checksums=$2\n  if [ -z \"$checksums\" ]; then\n    log_err \"hash_sha256_verify checksum file not specified in arg2\"\n    return 1\n  fi\n  BASENAME=${TARGET##*/}\n  want=$(grep \"${BASENAME}\" \"${checksums}\" 2>/dev/null | tr '\\t' ' ' | cut -d ' ' -f 1)\n  if [ -z \"$want\" ]; then\n    log_err \"hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'\"\n    return 1\n  fi\n  got=$(hash_sha256 \"$TARGET\")\n  if [ \"$want\" != \"$got\" ]; then\n    log_err \"hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got\"\n    return 1\n  fi\n}\ncat /dev/null <<EOF\n------------------------------------------------------------------------\nEnd of functions from https://github.com/client9/shlib\n------------------------------------------------------------------------\nEOF\n\nPROJECT_NAME=\"golangci-lint\"\nOWNER=golangci\nREPO=\"golangci-lint\"\nBINARY=golangci-lint\nFORMAT=tar.gz\nOS=$(uname_os)\nARCH=$(uname_arch)\nPREFIX=\"$OWNER/$REPO\"\n\n# use in logging routines\nlog_prefix() {\n\techo \"$PREFIX\"\n}\nPLATFORM=\"${OS}/${ARCH}\"\nGITHUB_DOWNLOAD=https://github.com/${OWNER}/${REPO}/releases/download\n\nuname_os_check \"$OS\"\nuname_arch_check \"$ARCH\"\n\nparse_args \"$@\"\n\nget_binaries\n\ntag_to_version\n\nadjust_format\n\nadjust_os\n\nadjust_arch\n\nlog_info \"found version: ${VERSION} for ${TAG}/${OS}/${ARCH}\"\n\nNAME=${BINARY}-${VERSION}-${OS}-${ARCH}\nTARBALL=${NAME}.${FORMAT}\nTARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL}\nCHECKSUM=${PROJECT_NAME}-${VERSION}-checksums.txt\nCHECKSUM_URL=${GITHUB_DOWNLOAD}/${TAG}/${CHECKSUM}\n\n\nexecute\n"
  },
  {
    "path": "internal/cache/cache.go",
    "content": "package cache\n\nimport (\n\t\"bytes\"\n\t\"encoding/gob\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"maps\"\n\t\"runtime\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/go/cache\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/timeutils\"\n)\n\ntype HashMode int\n\nconst (\n\tHashModeNeedOnlySelf HashMode = iota\n\tHashModeNeedDirectDeps\n\tHashModeNeedAllDeps\n)\n\nvar ErrMissing = errors.New(\"missing data\")\n\ntype hashResults map[HashMode]string\n\n// Cache is a per-package data cache.\n// A cached data is invalidated when package,\n// or it's dependencies change.\ntype Cache struct {\n\tlowLevelCache cache.Cache\n\tpkgHashes     sync.Map\n\tsw            *timeutils.Stopwatch\n\tlog           logutils.Log\n\tioSem         chan struct{} // semaphore limiting parallel IO\n}\n\nfunc NewCache(sw *timeutils.Stopwatch, log logutils.Log) (*Cache, error) {\n\treturn &Cache{\n\t\tlowLevelCache: cache.Default(),\n\t\tsw:            sw,\n\t\tlog:           log,\n\t\tioSem:         make(chan struct{}, runtime.GOMAXPROCS(-1)),\n\t}, nil\n}\n\nfunc (c *Cache) Close() {\n\terr := c.sw.TrackStageErr(\"close\", c.lowLevelCache.Close)\n\tif err != nil {\n\t\tc.log.Errorf(\"cache close: %v\", err)\n\t}\n}\n\nfunc (c *Cache) Put(pkg *packages.Package, mode HashMode, key string, data any) error {\n\tbuf, err := c.encode(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tactionID, err := c.buildKey(pkg, mode, key)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to calculate package %s action id: %w\", pkg.Name, err)\n\t}\n\n\terr = c.putBytes(actionID, buf)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to save data to low-level cache by key %s for package %s: %w\", key, pkg.Name, err)\n\t}\n\n\treturn nil\n}\n\nfunc (c *Cache) Get(pkg *packages.Package, mode HashMode, key string, data any) error {\n\tactionID, err := c.buildKey(pkg, mode, key)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to calculate package %s action id: %w\", pkg.Name, err)\n\t}\n\n\tcachedData, err := c.getBytes(actionID)\n\tif err != nil {\n\t\tif cache.IsErrMissing(err) {\n\t\t\treturn ErrMissing\n\t\t}\n\t\treturn fmt.Errorf(\"failed to get data from low-level cache by key %s for package %s: %w\", key, pkg.Name, err)\n\t}\n\n\treturn c.decode(cachedData, data)\n}\n\nfunc (c *Cache) buildKey(pkg *packages.Package, mode HashMode, key string) (cache.ActionID, error) {\n\treturn timeutils.TrackStage(c.sw, \"key build\", func() (cache.ActionID, error) {\n\t\tactionID, err := c.pkgActionID(pkg, mode)\n\t\tif err != nil {\n\t\t\treturn actionID, err\n\t\t}\n\n\t\tsubkey, subkeyErr := cache.Subkey(actionID, key)\n\t\tif subkeyErr != nil {\n\t\t\treturn actionID, fmt.Errorf(\"failed to build subkey: %w\", subkeyErr)\n\t\t}\n\n\t\treturn subkey, nil\n\t})\n}\n\nfunc (c *Cache) pkgActionID(pkg *packages.Package, mode HashMode) (cache.ActionID, error) {\n\thash, err := c.packageHash(pkg, mode)\n\tif err != nil {\n\t\treturn cache.ActionID{}, fmt.Errorf(\"failed to get package hash: %w\", err)\n\t}\n\n\tkey, err := cache.NewHash(\"action ID\")\n\tif err != nil {\n\t\treturn cache.ActionID{}, fmt.Errorf(\"failed to make a hash: %w\", err)\n\t}\n\n\tfmt.Fprintf(key, \"pkgpath %s\\n\", pkg.PkgPath)\n\tfmt.Fprintf(key, \"pkghash %s\\n\", hash)\n\n\treturn key.Sum(), nil\n}\n\nfunc (c *Cache) packageHash(pkg *packages.Package, mode HashMode) (string, error) {\n\tresults, found := c.pkgHashes.Load(pkg)\n\tif found {\n\t\thashRes := results.(hashResults)\n\t\tif result, ok := hashRes[mode]; ok {\n\t\t\treturn result, nil\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"no mode %d in hash result\", mode)\n\t}\n\n\thashRes, err := c.computePkgHash(pkg)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tresult, found := hashRes[mode]\n\tif !found {\n\t\treturn \"\", fmt.Errorf(\"invalid mode %d\", mode)\n\t}\n\n\tc.pkgHashes.Store(pkg, hashRes)\n\n\treturn result, nil\n}\n\n// computePkgHash computes a package's hash.\n// The hash is based on all Go files that make up the package,\n// as well as the hashes of imported packages.\nfunc (c *Cache) computePkgHash(pkg *packages.Package) (hashResults, error) {\n\tkey, err := cache.NewHash(\"package hash\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to make a hash: %w\", err)\n\t}\n\n\thashRes := hashResults{}\n\n\tfmt.Fprintf(key, \"pkgpath %s\\n\", pkg.PkgPath)\n\n\tfor _, f := range slices.Concat(pkg.CompiledGoFiles, pkg.IgnoredFiles) {\n\t\th, fErr := c.fileHash(f)\n\t\tif fErr != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to calculate file %s hash: %w\", f, fErr)\n\t\t}\n\n\t\tfmt.Fprintf(key, \"file %s %x\\n\", f, h)\n\t}\n\n\tcurSum := key.Sum()\n\thashRes[HashModeNeedOnlySelf] = hex.EncodeToString(curSum[:])\n\n\timps := slices.SortedFunc(maps.Values(pkg.Imports), func(a, b *packages.Package) int {\n\t\treturn strings.Compare(a.PkgPath, b.PkgPath)\n\t})\n\n\tif err := c.computeDepsHash(HashModeNeedOnlySelf, imps, key); err != nil {\n\t\treturn nil, err\n\t}\n\n\tcurSum = key.Sum()\n\thashRes[HashModeNeedDirectDeps] = hex.EncodeToString(curSum[:])\n\n\tif err := c.computeDepsHash(HashModeNeedAllDeps, imps, key); err != nil {\n\t\treturn nil, err\n\t}\n\n\tcurSum = key.Sum()\n\thashRes[HashModeNeedAllDeps] = hex.EncodeToString(curSum[:])\n\n\treturn hashRes, nil\n}\n\nfunc (c *Cache) computeDepsHash(depMode HashMode, imps []*packages.Package, key *cache.Hash) error {\n\tfor _, dep := range imps {\n\t\tif dep.PkgPath == \"unsafe\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tdepHash, err := c.packageHash(dep, depMode)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to calculate hash for dependency %s with mode %d: %w\", dep.Name, depMode, err)\n\t\t}\n\n\t\tfmt.Fprintf(key, \"import %s %s\\n\", dep.PkgPath, depHash)\n\t}\n\n\treturn nil\n}\n\nfunc (c *Cache) putBytes(actionID cache.ActionID, buf *bytes.Buffer) error {\n\tc.ioSem <- struct{}{}\n\n\terr := c.sw.TrackStageErr(\"cache io\", func() error {\n\t\treturn cache.PutBytes(c.lowLevelCache, actionID, buf.Bytes())\n\t})\n\n\t<-c.ioSem\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (c *Cache) getBytes(actionID cache.ActionID) ([]byte, error) {\n\tc.ioSem <- struct{}{}\n\n\tcachedData, err := timeutils.TrackStage(c.sw, \"cache io\", func() ([]byte, error) {\n\t\tb, _, errGB := cache.GetBytes(c.lowLevelCache, actionID)\n\t\treturn b, errGB\n\t})\n\n\t<-c.ioSem\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn cachedData, nil\n}\n\nfunc (c *Cache) fileHash(f string) ([cache.HashSize]byte, error) {\n\tc.ioSem <- struct{}{}\n\n\th, err := cache.FileHash(f)\n\n\t<-c.ioSem\n\n\tif err != nil {\n\t\treturn [cache.HashSize]byte{}, err\n\t}\n\n\treturn h, nil\n}\n\nfunc (c *Cache) encode(data any) (*bytes.Buffer, error) {\n\tbuf := &bytes.Buffer{}\n\terr := c.sw.TrackStageErr(\"gob\", func() error {\n\t\treturn gob.NewEncoder(buf).Encode(data)\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to gob encode: %w\", err)\n\t}\n\n\treturn buf, nil\n}\n\nfunc (c *Cache) decode(b []byte, data any) error {\n\terr := c.sw.TrackStageErr(\"gob\", func() error {\n\t\treturn gob.NewDecoder(bytes.NewReader(b)).Decode(data)\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to gob decode: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc SetSalt(b *bytes.Buffer) {\n\tcache.SetSalt(b.Bytes())\n}\n\nfunc DefaultDir() string {\n\tcacheDir, _ := cache.DefaultDir()\n\treturn cacheDir\n}\n"
  },
  {
    "path": "internal/cache/cache_test.go",
    "content": "package cache\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/timeutils\"\n)\n\nfunc setupCache(t *testing.T) *Cache {\n\tt.Helper()\n\n\tlog := logutils.NewStderrLog(\"skip\")\n\tsw := timeutils.NewStopwatch(\"pkgcache\", log)\n\n\tpkgCache, err := NewCache(sw, log)\n\trequire.NoError(t, err)\n\n\treturn pkgCache\n}\n\nfunc fakePackage() *packages.Package {\n\treturn &packages.Package{\n\t\tPkgPath: \"github.com/golangci/example\",\n\t\tCompiledGoFiles: []string{\n\t\t\t\"./testdata/hello.go\",\n\t\t},\n\t\tImports: map[string]*packages.Package{\n\t\t\t\"a\": {\n\t\t\t\tPkgPath: \"github.com/golangci/example/a\",\n\t\t\t},\n\t\t\t\"b\": {\n\t\t\t\tPkgPath: \"github.com/golangci/example/b\",\n\t\t\t},\n\t\t\t\"unsafe\": {\n\t\t\t\tPkgPath: \"unsafe\",\n\t\t\t},\n\t\t},\n\t}\n}\n\ntype Foo struct {\n\tValue string\n}\n\nfunc TestCache_Put(t *testing.T) {\n\tt.Setenv(\"GOLANGCI_LINT_CACHE\", t.TempDir())\n\n\tpkgCache := setupCache(t)\n\n\tpkg := fakePackage()\n\n\tin := &Foo{Value: \"hello\"}\n\n\terr := pkgCache.Put(pkg, HashModeNeedAllDeps, \"key\", in)\n\trequire.NoError(t, err)\n\n\tout := &Foo{}\n\terr = pkgCache.Get(pkg, HashModeNeedAllDeps, \"key\", out)\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, in, out)\n\n\tpkgCache.Close()\n}\n\nfunc TestCache_Get_missing_data(t *testing.T) {\n\tt.Setenv(\"GOLANGCI_LINT_CACHE\", t.TempDir())\n\n\tpkgCache := setupCache(t)\n\n\tpkg := fakePackage()\n\n\tout := &Foo{}\n\terr := pkgCache.Get(pkg, HashModeNeedAllDeps, \"key\", out)\n\trequire.Error(t, err)\n\n\trequire.ErrorIs(t, err, ErrMissing)\n\n\tpkgCache.Close()\n}\n\nfunc TestCache_buildKey(t *testing.T) {\n\tpkgCache := setupCache(t)\n\n\tpkg := fakePackage()\n\n\tactionID, err := pkgCache.buildKey(pkg, HashModeNeedAllDeps, \"\")\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, \"f32bf1bf010aa9b570e081c64ec9e22e17aafa1e822990ba952905ec5fdf8d9d\", fmt.Sprintf(\"%x\", actionID))\n}\n\nfunc TestCache_pkgActionID(t *testing.T) {\n\tpkgCache := setupCache(t)\n\n\tpkg := fakePackage()\n\n\tactionID, err := pkgCache.pkgActionID(pkg, HashModeNeedAllDeps)\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, \"f690f05acd1024386ae912d9ad9c04080523b9a899f6afe56ab3108d88215c1d\", fmt.Sprintf(\"%x\", actionID))\n}\n\nfunc TestCache_packageHash_load(t *testing.T) {\n\tpkgCache := setupCache(t)\n\n\tpkg := fakePackage()\n\n\tpkgCache.pkgHashes.Store(pkg, hashResults{HashModeNeedAllDeps: \"fake\"})\n\n\thash, err := pkgCache.packageHash(pkg, HashModeNeedAllDeps)\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, \"fake\", hash)\n}\n\nfunc TestCache_packageHash_store(t *testing.T) {\n\tpkgCache := setupCache(t)\n\n\tpkg := fakePackage()\n\n\thash, err := pkgCache.packageHash(pkg, HashModeNeedAllDeps)\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, \"9c602ef861197b6807e82c99caa7c4042eb03c1a92886303fb02893744355131\", hash)\n\n\tresults, ok := pkgCache.pkgHashes.Load(pkg)\n\trequire.True(t, ok)\n\n\thashRes := results.(hashResults)\n\n\trequire.Len(t, hashRes, 3)\n\n\tassert.Equal(t, \"8978e3d76c6f99e9663558d7147a7790f229a676804d1fde706a611898547b74\", hashRes[HashModeNeedOnlySelf])\n\tassert.Equal(t, \"b1aef902a0619b5cbfc2d6e2e91a73dd58dd448e58274b2d7a5ff8efd97aefa4\", hashRes[HashModeNeedDirectDeps])\n\tassert.Equal(t, \"9c602ef861197b6807e82c99caa7c4042eb03c1a92886303fb02893744355131\", hashRes[HashModeNeedAllDeps])\n}\n\nfunc TestCache_computeHash(t *testing.T) {\n\tpkgCache := setupCache(t)\n\n\tpkg := fakePackage()\n\n\tresults, err := pkgCache.computePkgHash(pkg)\n\trequire.NoError(t, err)\n\n\trequire.Len(t, results, 3)\n\n\tassert.Equal(t, \"8978e3d76c6f99e9663558d7147a7790f229a676804d1fde706a611898547b74\", results[HashModeNeedOnlySelf])\n\tassert.Equal(t, \"b1aef902a0619b5cbfc2d6e2e91a73dd58dd448e58274b2d7a5ff8efd97aefa4\", results[HashModeNeedDirectDeps])\n\tassert.Equal(t, \"9c602ef861197b6807e82c99caa7c4042eb03c1a92886303fb02893744355131\", results[HashModeNeedAllDeps])\n}\n"
  },
  {
    "path": "internal/cache/testdata/hello.go",
    "content": "package testdata\n\nimport \"fmt\"\n\nfunc Hello() {\n\tfmt.Println(\"hello world\")\n}\n"
  },
  {
    "path": "internal/errorutil/errors.go",
    "content": "package errorutil\n\nimport (\n\t\"fmt\"\n)\n\n// PanicError can be used to not print stacktrace twice\ntype PanicError struct {\n\trecovered any\n\tstack     []byte\n}\n\nfunc NewPanicError(recovered any, stack []byte) *PanicError {\n\treturn &PanicError{recovered: recovered, stack: stack}\n}\n\nfunc (e PanicError) Error() string {\n\treturn fmt.Sprint(e.recovered)\n}\n\nfunc (e PanicError) Stack() []byte {\n\treturn e.stack\n}\n"
  },
  {
    "path": "internal/go/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "internal/go/base/error_notunix.go",
    "content": "// Copyright 2023 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build !unix\n\npackage base\n\nfunc IsETXTBSY(err error) bool {\n\t// syscall.ETXTBSY is only meaningful on Unix platforms.\n\treturn false\n}\n"
  },
  {
    "path": "internal/go/base/error_unix.go",
    "content": "// Copyright 2023 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage base\n\nimport (\n\t\"errors\"\n\t\"syscall\"\n)\n\nfunc IsETXTBSY(err error) bool {\n\treturn errors.Is(err, syscall.ETXTBSY)\n}\n"
  },
  {
    "path": "internal/go/base/readme.md",
    "content": "# quoted\n\nExtracted from `go/src/cmd/go/internal/base/` (related to `cache`).\n\nOnly the function `IsETXTBSY` is extracted.\n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync go1.24.1\n"
  },
  {
    "path": "internal/go/cache/cache.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package cache implements a build artifact cache.\n//\n// This package is a slightly modified fork of Go's\n// cmd/go/internal/cache package.\npackage cache\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/rogpeppe/go-internal/lockedfile\"\n\t\"github.com/rogpeppe/go-internal/robustio\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/go/base\"\n\t\"github.com/golangci/golangci-lint/v2/internal/go/mmap\"\n)\n\n// An ActionID is a cache action key, the hash of a complete description of a\n// repeatable computation (command line, environment variables,\n// input file contents, executable contents).\ntype ActionID [HashSize]byte\n\n// An OutputID is a cache output key, the hash of an output of a computation.\ntype OutputID [HashSize]byte\n\n// Cache is the interface as used by the cmd/go.\ntype Cache interface {\n\t// Get returns the cache entry for the provided ActionID.\n\t// On miss, the error type should be of type *entryNotFoundError.\n\t//\n\t// After a successful call to Get, OutputFile(Entry.OutputID) must\n\t// exist on disk until Close is called (at the end of the process).\n\tGet(ActionID) (Entry, error)\n\n\t// Put adds an item to the cache.\n\t//\n\t// The seeker is only used to seek to the beginning. After a call to Put,\n\t// the seek position is not guaranteed to be in any particular state.\n\t//\n\t// As a special case, if the ReadSeeker is of type noVerifyReadSeeker,\n\t// the verification from GODEBUG=goverifycache=1 is skipped.\n\t//\n\t// After a successful call to Put, OutputFile(OutputID) must\n\t// exist on disk until Close is called (at the end of the process).\n\tPut(ActionID, io.ReadSeeker) (_ OutputID, size int64, _ error)\n\n\t// Close is called at the end of the go process. Implementations can do\n\t// cache cleanup work at this phase, or wait for and report any errors from\n\t// background cleanup work started earlier. Any cache trimming in one\n\t// process should not cause the invariants of this interface to be\n\t// violated in another process. Namely, a cache trim from one process should\n\t// not delete an ObjectID from disk that was recently Get or Put from\n\t// another process. As a rule of thumb, don't trim things used in the last\n\t// day.\n\tClose() error\n\n\t// OutputFile returns the path on disk where OutputID is stored.\n\t//\n\t// It's only called after a successful get or put call so it doesn't need\n\t// to return an error; it's assumed that if the previous get or put succeeded,\n\t// it's already on disk.\n\tOutputFile(OutputID) string\n\n\t// FuzzDir returns where fuzz files are stored.\n\tFuzzDir() string\n}\n\n// A Cache is a package cache, backed by a file system directory tree.\ntype DiskCache struct {\n\tdir string\n\tnow func() time.Time\n}\n\n// Open opens and returns the cache in the given directory.\n//\n// It is safe for multiple processes on a single machine to use the\n// same cache directory in a local file system simultaneously.\n// They will coordinate using operating system file locks and may\n// duplicate effort but will not corrupt the cache.\n//\n// However, it is NOT safe for multiple processes on different machines\n// to share a cache directory (for example, if the directory were stored\n// in a network file system). File locking is notoriously unreliable in\n// network file systems and may not suffice to protect the cache.\nfunc Open(dir string) (*DiskCache, error) {\n\tinfo, err := os.Stat(dir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !info.IsDir() {\n\t\treturn nil, &fs.PathError{Op: \"open\", Path: dir, Err: fmt.Errorf(\"not a directory\")}\n\t}\n\tfor i := 0; i < 256; i++ {\n\t\tname := filepath.Join(dir, fmt.Sprintf(\"%02x\", i))\n\t\tif err := os.MkdirAll(name, 0o777); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tc := &DiskCache{\n\t\tdir: dir,\n\t\tnow: time.Now,\n\t}\n\treturn c, nil\n}\n\n// fileName returns the name of the file corresponding to the given id.\nfunc (c *DiskCache) fileName(id [HashSize]byte, key string) string {\n\treturn filepath.Join(c.dir, fmt.Sprintf(\"%02x\", id[0]), fmt.Sprintf(\"%x\", id)+\"-\"+key)\n}\n\n// An entryNotFoundError indicates that a cache entry was not found, with an\n// optional underlying reason.\ntype entryNotFoundError struct {\n\tErr error\n}\n\nfunc (e *entryNotFoundError) Error() string {\n\tif e.Err == nil {\n\t\treturn \"cache entry not found\"\n\t}\n\treturn fmt.Sprintf(\"cache entry not found: %v\", e.Err)\n}\n\nfunc (e *entryNotFoundError) Unwrap() error {\n\treturn e.Err\n}\n\nconst (\n\t// action entry file is \"v1 <hex id> <hex out> <decimal size space-padded to 20 bytes> <unixnano space-padded to 20 bytes>\\n\"\n\thexSize   = HashSize * 2\n\tentrySize = 2 + 1 + hexSize + 1 + hexSize + 1 + 20 + 1 + 20 + 1\n)\n\n// verify controls whether to run the cache in verify mode.\n// In verify mode, the cache always returns errMissing from Get\n// but then double-checks in Put that the data being written\n// exactly matches any existing entry. This provides an easy\n// way to detect program behavior that would have been different\n// had the cache entry been returned from Get.\n//\n// verify is enabled by setting the environment variable\n// GODEBUG=gocacheverify=1.\nvar verify = false\n\nvar errVerifyMode = errors.New(\"gocacheverify=1\")\n\n// DebugTest is set when GODEBUG=gocachetest=1 is in the environment.\nvar DebugTest = false\n\n// func init() { initEnv() }\n//\n// var (\n// \tgocacheverify = godebug.New(\"gocacheverify\")\n// \tgocachehash   = godebug.New(\"gocachehash\")\n// \tgocachetest   = godebug.New(\"gocachetest\")\n// )\n//\n// func initEnv() {\n// \tif gocacheverify.Value() == \"1\" {\n// \t\tgocacheverify.IncNonDefault()\n// \t\tverify = true\n// \t}\n// \tif gocachehash.Value() == \"1\" {\n// \t\tgocachehash.IncNonDefault()\n// \t\tdebugHash = true\n// \t}\n// \tif gocachetest.Value() == \"1\" {\n// \t\tgocachetest.IncNonDefault()\n// \t\tDebugTest = true\n// \t}\n// }\n\n// Get looks up the action ID in the cache,\n// returning the corresponding output ID and file size, if any.\n// Note that finding an output ID does not guarantee that the\n// saved file for that output ID is still available.\nfunc (c *DiskCache) Get(id ActionID) (Entry, error) {\n\tif verify {\n\t\treturn Entry{}, &entryNotFoundError{Err: errVerifyMode}\n\t}\n\treturn c.get(id)\n}\n\ntype Entry struct {\n\tOutputID OutputID\n\tSize     int64\n\tTime     time.Time // when added to cache\n}\n\n// get is Get but does not respect verify mode, so that Put can use it.\nfunc (c *DiskCache) get(id ActionID) (Entry, error) {\n\tmissing := func(reason error) (Entry, error) {\n\t\treturn Entry{}, &entryNotFoundError{Err: reason}\n\t}\n\tf, err := os.Open(c.fileName(id, \"a\"))\n\tif err != nil {\n\t\treturn missing(err)\n\t}\n\tdefer f.Close()\n\tentry := make([]byte, entrySize+1) // +1 to detect whether f is too long\n\tif n, err := io.ReadFull(f, entry); n > entrySize {\n\t\treturn missing(errors.New(\"too long\"))\n\t} else if err != io.ErrUnexpectedEOF {\n\t\tif err == io.EOF {\n\t\t\treturn missing(errors.New(\"file is empty\"))\n\t\t}\n\t\treturn missing(err)\n\t} else if n < entrySize {\n\t\treturn missing(errors.New(\"entry file incomplete\"))\n\t}\n\tif entry[0] != 'v' || entry[1] != '1' || entry[2] != ' ' || entry[3+hexSize] != ' ' || entry[3+hexSize+1+hexSize] != ' ' || entry[3+hexSize+1+hexSize+1+20] != ' ' || entry[entrySize-1] != '\\n' {\n\t\treturn missing(errors.New(\"invalid header\"))\n\t}\n\teid, entry := entry[3:3+hexSize], entry[3+hexSize:]\n\teout, entry := entry[1:1+hexSize], entry[1+hexSize:]\n\tesize, entry := entry[1:1+20], entry[1+20:]\n\tetime, entry := entry[1:1+20], entry[1+20:]\n\tvar buf [HashSize]byte\n\tif _, err := hex.Decode(buf[:], eid); err != nil {\n\t\treturn missing(fmt.Errorf(\"decoding ID: %v\", err))\n\t} else if buf != id {\n\t\treturn missing(errors.New(\"mismatched ID\"))\n\t}\n\tif _, err := hex.Decode(buf[:], eout); err != nil {\n\t\treturn missing(fmt.Errorf(\"decoding output ID: %v\", err))\n\t}\n\ti := 0\n\tfor i < len(esize) && esize[i] == ' ' {\n\t\ti++\n\t}\n\tsize, err := strconv.ParseInt(string(esize[i:]), 10, 64)\n\tif err != nil {\n\t\treturn missing(fmt.Errorf(\"parsing size: %v\", err))\n\t} else if size < 0 {\n\t\treturn missing(errors.New(\"negative size\"))\n\t}\n\ti = 0\n\tfor i < len(etime) && etime[i] == ' ' {\n\t\ti++\n\t}\n\ttm, err := strconv.ParseInt(string(etime[i:]), 10, 64)\n\tif err != nil {\n\t\treturn missing(fmt.Errorf(\"parsing timestamp: %v\", err))\n\t} else if tm < 0 {\n\t\treturn missing(errors.New(\"negative timestamp\"))\n\t}\n\n\tc.markUsed(c.fileName(id, \"a\"))\n\n\treturn Entry{buf, size, time.Unix(0, tm)}, nil\n}\n\n// GetFile looks up the action ID in the cache and returns\n// the name of the corresponding data file.\nfunc GetFile(c Cache, id ActionID) (file string, entry Entry, err error) {\n\tentry, err = c.Get(id)\n\tif err != nil {\n\t\treturn \"\", Entry{}, err\n\t}\n\tfile = c.OutputFile(entry.OutputID)\n\tinfo, err := os.Stat(file)\n\tif err != nil {\n\t\treturn \"\", Entry{}, &entryNotFoundError{Err: err}\n\t}\n\tif info.Size() != entry.Size {\n\t\treturn \"\", Entry{}, &entryNotFoundError{Err: errors.New(\"file incomplete\")}\n\t}\n\treturn file, entry, nil\n}\n\n// GetBytes looks up the action ID in the cache and returns\n// the corresponding output bytes.\n// GetBytes should only be used for data that can be expected to fit in memory.\nfunc GetBytes(c Cache, id ActionID) ([]byte, Entry, error) {\n\tentry, err := c.Get(id)\n\tif err != nil {\n\t\treturn nil, entry, err\n\t}\n\tdata, err := robustio.ReadFile(c.OutputFile(entry.OutputID))\n\tif err != nil {\n\t\treturn nil, entry, &entryNotFoundError{Err: err}\n\t}\n\tif sha256.Sum256(data) != entry.OutputID {\n\t\treturn nil, entry, &entryNotFoundError{Err: errors.New(\"bad checksum\")}\n\t}\n\treturn data, entry, nil\n}\n\n// GetMmap looks up the action ID in the cache and returns\n// the corresponding output bytes.\n// GetMmap should only be used for data that can be expected to fit in memory.\nfunc GetMmap(c Cache, id ActionID) ([]byte, Entry, bool, error) {\n\tentry, err := c.Get(id)\n\tif err != nil {\n\t\treturn nil, entry, false, err\n\t}\n\tmd, opened, err := mmap.Mmap(c.OutputFile(entry.OutputID))\n\tif err != nil {\n\t\treturn nil, Entry{}, opened, err\n\t}\n\tif int64(len(md.Data)) != entry.Size {\n\t\treturn nil, Entry{}, true, &entryNotFoundError{Err: errors.New(\"file incomplete\")}\n\t}\n\treturn md.Data, entry, true, nil\n}\n\n// OutputFile returns the name of the cache file storing output with the given OutputID.\nfunc (c *DiskCache) OutputFile(out OutputID) string {\n\tfile := c.fileName(out, \"d\")\n\tisDir := c.markUsed(file)\n\tif isDir { // => cached executable\n\t\tentries, err := os.ReadDir(file)\n\t\tif err != nil {\n\t\t\treturn fmt.Sprintf(\"DO NOT USE - missing binary cache entry: %v\", err)\n\t\t}\n\t\tif len(entries) != 1 {\n\t\t\treturn \"DO NOT USE - invalid binary cache entry\"\n\t\t}\n\t\treturn filepath.Join(file, entries[0].Name())\n\t}\n\treturn file\n}\n\n// Time constants for cache expiration.\n//\n// We set the mtime on a cache file on each use, but at most one per mtimeInterval (1 hour),\n// to avoid causing many unnecessary inode updates. The mtimes therefore\n// roughly reflect \"time of last use\" but may in fact be older by at most an hour.\n//\n// We scan the cache for entries to delete at most once per trimInterval (1 day).\n//\n// When we do scan the cache, we delete entries that have not been used for\n// at least trimLimit (5 days). Statistics gathered from a month of usage by\n// Go developers found that essentially all reuse of cached entries happened\n// within 5 days of the previous reuse. See golang.org/issue/22990.\nconst (\n\tmtimeInterval = 1 * time.Hour\n\ttrimInterval  = 24 * time.Hour\n\ttrimLimit     = 5 * 24 * time.Hour\n)\n\n// markUsed makes a best-effort attempt to update mtime on file,\n// so that mtime reflects cache access time.\n//\n// Because the reflection only needs to be approximate,\n// and to reduce the amount of disk activity caused by using\n// cache entries, used only updates the mtime if the current\n// mtime is more than an hour old. This heuristic eliminates\n// nearly all of the mtime updates that would otherwise happen,\n// while still keeping the mtimes useful for cache trimming.\n//\n// markUsed reports whether the file is a directory (an executable cache entry).\nfunc (c *DiskCache) markUsed(file string) (isDir bool) {\n\tinfo, err := os.Stat(file)\n\tif err != nil {\n\t\treturn false\n\t}\n\tif now := c.now(); now.Sub(info.ModTime()) >= mtimeInterval {\n\t\tos.Chtimes(file, now, now)\n\t}\n\treturn info.IsDir()\n}\n\nfunc (c *DiskCache) Close() error { return c.Trim() }\n\n// Trim removes old cache entries that are likely not to be reused.\nfunc (c *DiskCache) Trim() error {\n\tnow := c.now()\n\n\t// We maintain in dir/trim.txt the time of the last completed cache trim.\n\t// If the cache has been trimmed recently enough, do nothing.\n\t// This is the common case.\n\t// If the trim file is corrupt, detected if the file can't be parsed, or the\n\t// trim time is too far in the future, attempt the trim anyway. It's possible that\n\t// the cache was full when the corruption happened. Attempting a trim on\n\t// an empty cache is cheap, so there wouldn't be a big performance hit in that case.\n\tif data, err := lockedfile.Read(filepath.Join(c.dir, \"trim.txt\")); err == nil {\n\t\tif t, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64); err == nil {\n\t\t\tlastTrim := time.Unix(t, 0)\n\t\t\tif d := now.Sub(lastTrim); d < trimInterval && d > -mtimeInterval {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\n\t// Trim each of the 256 subdirectories.\n\t// We subtract an additional mtimeInterval\n\t// to account for the imprecision of our \"last used\" mtimes.\n\tcutoff := now.Add(-trimLimit - mtimeInterval)\n\tfor i := 0; i < 256; i++ {\n\t\tsubdir := filepath.Join(c.dir, fmt.Sprintf(\"%02x\", i))\n\t\tc.trimSubdir(subdir, cutoff)\n\t}\n\n\t// Ignore errors from here: if we don't write the complete timestamp, the\n\t// cache will appear older than it is, and we'll trim it again next time.\n\tvar b bytes.Buffer\n\tfmt.Fprintf(&b, \"%d\", now.Unix())\n\tif err := lockedfile.Write(filepath.Join(c.dir, \"trim.txt\"), &b, 0o666); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// trimSubdir trims a single cache subdirectory.\nfunc (c *DiskCache) trimSubdir(subdir string, cutoff time.Time) {\n\t// Read all directory entries from subdir before removing\n\t// any files, in case removing files invalidates the file offset\n\t// in the directory scan. Also, ignore error from f.Readdirnames,\n\t// because we don't care about reporting the error and we still\n\t// want to process any entries found before the error.\n\tf, err := os.Open(subdir)\n\tif err != nil {\n\t\treturn\n\t}\n\tnames, _ := f.Readdirnames(-1)\n\tf.Close()\n\n\tfor _, name := range names {\n\t\t// Remove only cache entries (xxxx-a and xxxx-d).\n\t\tif !strings.HasSuffix(name, \"-a\") && !strings.HasSuffix(name, \"-d\") {\n\t\t\tcontinue\n\t\t}\n\t\tentry := filepath.Join(subdir, name)\n\t\tinfo, err := os.Stat(entry)\n\t\tif err == nil && info.ModTime().Before(cutoff) {\n\t\t\tif info.IsDir() { // executable cache entry\n\t\t\t\tos.RemoveAll(entry)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tos.Remove(entry)\n\t\t}\n\t}\n}\n\n// putIndexEntry adds an entry to the cache recording that executing the action\n// with the given id produces an output with the given output id (hash) and size.\nfunc (c *DiskCache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify bool) error {\n\t// Note: We expect that for one reason or another it may happen\n\t// that repeating an action produces a different output hash\n\t// (for example, if the output contains a time stamp or temp dir name).\n\t// While not ideal, this is also not a correctness problem, so we\n\t// don't make a big deal about it. In particular, we leave the action\n\t// cache entries writable specifically so that they can be overwritten.\n\t//\n\t// Setting GODEBUG=gocacheverify=1 does make a big deal:\n\t// in verify mode we are double-checking that the cache entries\n\t// are entirely reproducible. As just noted, this may be unrealistic\n\t// in some cases but the check is also useful for shaking out real bugs.\n\tentry := fmt.Sprintf(\"v1 %x %x %20d %20d\\n\", id, out, size, time.Now().UnixNano())\n\tif verify && allowVerify {\n\t\told, err := c.get(id)\n\t\tif err == nil && (old.OutputID != out || old.Size != size) {\n\t\t\t// panic to show stack trace, so we can see what code is generating this cache entry.\n\t\t\tmsg := fmt.Sprintf(\"go: internal cache error: cache verify failed: id=%x changed:<<<\\n%s\\n>>>\\nold: %x %d\\nnew: %x %d\", id, reverseHash(id), out, size, old.OutputID, old.Size)\n\t\t\tpanic(msg)\n\t\t}\n\t}\n\tfile := c.fileName(id, \"a\")\n\n\t// Copy file to cache directory.\n\tmode := os.O_WRONLY | os.O_CREATE\n\tf, err := os.OpenFile(file, mode, 0o666)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = f.WriteString(entry)\n\tif err == nil {\n\t\t// Truncate the file only *after* writing it.\n\t\t// (This should be a no-op, but truncate just in case of previous corruption.)\n\t\t//\n\t\t// This differs from os.WriteFile, which truncates to 0 *before* writing\n\t\t// via os.O_TRUNC. Truncating only after writing ensures that a second write\n\t\t// of the same content to the same file is idempotent, and does not — even\n\t\t// temporarily! — undo the effect of the first write.\n\t\terr = f.Truncate(int64(len(entry)))\n\t}\n\tif closeErr := f.Close(); err == nil {\n\t\terr = closeErr\n\t}\n\tif err != nil {\n\t\t// TODO(bcmills): This Remove potentially races with another go command writing to file.\n\t\t// Can we eliminate it?\n\t\tos.Remove(file)\n\t\treturn err\n\t}\n\terr = os.Chtimes(file, c.now(), c.now()) // mainly for tests\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to change time of file %s: %w\", file, err)\n\t}\n\n\treturn nil\n}\n\n// noVerifyReadSeeker is an io.ReadSeeker wrapper sentinel type\n// that says that Cache.Put should skip the verify check\n// (from GODEBUG=goverifycache=1).\ntype noVerifyReadSeeker struct {\n\tio.ReadSeeker\n}\n\n// Put stores the given output in the cache as the output for the action ID.\n// It may read file twice. The content of file must not change between the two passes.\nfunc (c *DiskCache) Put(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {\n\twrapper, isNoVerify := file.(noVerifyReadSeeker)\n\tif isNoVerify {\n\t\tfile = wrapper.ReadSeeker\n\t}\n\treturn c.put(id, \"\", file, !isNoVerify)\n}\n\n// PutExecutable is used to store the output as the output for the action ID into a\n// file with the given base name, with the executable mode bit set.\n// It may read file twice. The content of file must not change between the two passes.\nfunc (c *DiskCache) PutExecutable(id ActionID, name string, file io.ReadSeeker) (OutputID, int64, error) {\n\tif name == \"\" {\n\t\tpanic(\"PutExecutable called without a name\")\n\t}\n\twrapper, isNoVerify := file.(noVerifyReadSeeker)\n\tif isNoVerify {\n\t\tfile = wrapper.ReadSeeker\n\t}\n\treturn c.put(id, name, file, !isNoVerify)\n}\n\n// PutNoVerify is like Put but disables the verify check\n// when GODEBUG=goverifycache=1 is set.\n// It is meant for data that is OK to cache but that we expect to vary slightly from run to run,\n// like test output containing times and the like.\nfunc PutNoVerify(c Cache, id ActionID, file io.ReadSeeker) (OutputID, int64, error) {\n\treturn c.Put(id, noVerifyReadSeeker{file})\n}\n\nfunc (c *DiskCache) put(id ActionID, executableName string, file io.ReadSeeker, allowVerify bool) (OutputID, int64, error) {\n\t// Compute output ID.\n\th := sha256.New()\n\tif _, err := file.Seek(0, 0); err != nil {\n\t\treturn OutputID{}, 0, err\n\t}\n\tsize, err := io.Copy(h, file)\n\tif err != nil {\n\t\treturn OutputID{}, 0, err\n\t}\n\tvar out OutputID\n\th.Sum(out[:0])\n\n\t// Copy to cached output file (if not already present).\n\tfileMode := fs.FileMode(0o666)\n\tif executableName != \"\" {\n\t\tfileMode = 0o777\n\t}\n\tif err := c.copyFile(file, executableName, out, size, fileMode); err != nil {\n\t\treturn out, size, err\n\t}\n\n\t// Add to cache index.\n\treturn out, size, c.putIndexEntry(id, out, size, allowVerify)\n}\n\n// PutBytes stores the given bytes in the cache as the output for the action ID.\nfunc PutBytes(c Cache, id ActionID, data []byte) error {\n\t_, _, err := c.Put(id, bytes.NewReader(data))\n\treturn err\n}\n\n// copyFile copies file into the cache, expecting it to have the given\n// output ID and size, if that file is not present already.\nfunc (c *DiskCache) copyFile(file io.ReadSeeker, executableName string, out OutputID, size int64, perm os.FileMode) error {\n\tname := c.fileName(out, \"d\") // TODO(matloob): use a different suffix for the executable cache?\n\tinfo, err := os.Stat(name)\n\tif executableName != \"\" {\n\t\t// This is an executable file. The file at name won't hold the output itself, but will\n\t\t// be a directory that holds the output, named according to executableName. Check to see\n\t\t// if the directory already exists, and if it does not, create it. Then reset name\n\t\t// to the name we want the output written to.\n\t\tif err != nil {\n\t\t\tif !os.IsNotExist(err) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := os.Mkdir(name, 0o777); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif info, err = os.Stat(name); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif !info.IsDir() {\n\t\t\treturn errors.New(\"internal error: invalid binary cache entry: not a directory\")\n\t\t}\n\n\t\t// directory exists. now set name to the inner file\n\t\tname = filepath.Join(name, executableName)\n\t\tinfo, err = os.Stat(name)\n\t}\n\tif err == nil && info.Size() == size {\n\t\t// Check hash.\n\t\tif f, err := os.Open(name); err == nil {\n\t\t\th := sha256.New()\n\t\t\t_, copyErr := io.Copy(h, f)\n\t\t\tif copyErr != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to copy to sha256: %w\", copyErr)\n\t\t\t}\n\n\t\t\tf.Close()\n\t\t\tvar out2 OutputID\n\t\t\th.Sum(out2[:0])\n\t\t\tif out == out2 {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\t// Hash did not match. Fall through and rewrite file.\n\t}\n\n\t// Copy file to cache directory.\n\tmode := os.O_RDWR | os.O_CREATE\n\tif err == nil && info.Size() > size { // shouldn't happen but fix in case\n\t\tmode |= os.O_TRUNC\n\t}\n\tf, err := os.OpenFile(name, mode, perm)\n\tif err != nil {\n\t\tif base.IsETXTBSY(err) {\n\t\t\t// This file is being used by an executable. It must have\n\t\t\t// already been written by another go process and then run.\n\t\t\t// return without an error.\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\tdefer f.Close()\n\tif size == 0 {\n\t\t// File now exists with correct size.\n\t\t// Only one possible zero-length file, so contents are OK too.\n\t\t// Early return here makes sure there's a \"last byte\" for code below.\n\t\treturn nil\n\t}\n\n\t// From here on, if any of the I/O writing the file fails,\n\t// we make a best-effort attempt to truncate the file f\n\t// before returning, to avoid leaving bad bytes in the file.\n\n\t// Copy file to f, but also into h to double-check hash.\n\tif _, err := file.Seek(0, 0); err != nil {\n\t\tf.Truncate(0)\n\t\treturn err\n\t}\n\th := sha256.New()\n\tw := io.MultiWriter(f, h)\n\tif _, err := io.CopyN(w, file, size-1); err != nil {\n\t\tf.Truncate(0)\n\t\treturn err\n\t}\n\t// Check last byte before writing it; writing it will make the size match\n\t// what other processes expect to find and might cause them to start\n\t// using the file.\n\tbuf := make([]byte, 1)\n\tif _, err := file.Read(buf); err != nil {\n\t\tf.Truncate(0)\n\t\treturn err\n\t}\n\tn, wErr := h.Write(buf)\n\tif n != len(buf) {\n\t\treturn fmt.Errorf(\"wrote to hash %d/%d bytes with error %w\", n, len(buf), wErr)\n\t}\n\n\tsum := h.Sum(nil)\n\tif !bytes.Equal(sum, out[:]) {\n\t\tf.Truncate(0)\n\t\treturn fmt.Errorf(\"file content changed underfoot\")\n\t}\n\n\t// Commit cache file entry.\n\tif _, err := f.Write(buf); err != nil {\n\t\tf.Truncate(0)\n\t\treturn err\n\t}\n\tif err := f.Close(); err != nil {\n\t\t// Data might not have been written,\n\t\t// but file may look like it is the right size.\n\t\t// To be extra careful, remove cached file.\n\t\tos.Remove(name)\n\t\treturn err\n\t}\n\terr = os.Chtimes(name, c.now(), c.now()) // mainly for tests\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to change time of file %s: %w\", name, err)\n\t}\n\n\treturn nil\n}\n\n// FuzzDir returns a subdirectory within the cache for storing fuzzing data.\n// The subdirectory may not exist.\n//\n// This directory is managed by the internal/fuzz package. Files in this\n// directory aren't removed by the 'go clean -cache' command or by Trim.\n// They may be removed with 'go clean -fuzzcache'.\n//\n// TODO(#48526): make Trim remove unused files from this directory.\nfunc (c *DiskCache) FuzzDir() string {\n\treturn filepath.Join(c.dir, \"fuzz\")\n}\n"
  },
  {
    "path": "internal/go/cache/cache_gcil.go",
    "content": "package cache\n\nimport (\n\t\"errors\"\n)\n\n// IsErrMissing allows to access to the internal error.\n// TODO(ldez) the handling of this error inside runner_action.go should be refactored.\nfunc IsErrMissing(err error) bool {\n\tvar errENF *entryNotFoundError\n\treturn errors.As(err, &errENF)\n}\n"
  },
  {
    "path": "internal/go/cache/cache_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage cache\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/go/testenv\"\n)\n\nfunc init() {\n\tverify = false // even if GODEBUG is set\n}\n\nfunc TestBasic(t *testing.T) {\n\tdir := t.TempDir()\n\t_, err := Open(filepath.Join(dir, \"notexist\"))\n\tif err == nil {\n\t\tt.Fatal(`Open(\"tmp/notexist\") succeeded, want failure`)\n\t}\n\n\tcdir := filepath.Join(dir, \"c1\")\n\tif err := os.Mkdir(cdir, 0777); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tc1, err := Open(cdir)\n\tif err != nil {\n\t\tt.Fatalf(\"Open(c1) (create): %v\", err)\n\t}\n\tif err := c1.putIndexEntry(dummyID(1), dummyID(12), 13, true); err != nil {\n\t\tt.Fatalf(\"addIndexEntry: %v\", err)\n\t}\n\tif err := c1.putIndexEntry(dummyID(1), dummyID(2), 3, true); err != nil { // overwrite entry\n\t\tt.Fatalf(\"addIndexEntry: %v\", err)\n\t}\n\tif entry, err := c1.Get(dummyID(1)); err != nil || entry.OutputID != dummyID(2) || entry.Size != 3 {\n\t\tt.Fatalf(\"c1.Get(1) = %x, %v, %v, want %x, %v, nil\", entry.OutputID, entry.Size, err, dummyID(2), 3)\n\t}\n\n\tc2, err := Open(cdir)\n\tif err != nil {\n\t\tt.Fatalf(\"Open(c2) (reuse): %v\", err)\n\t}\n\tif entry, err := c2.Get(dummyID(1)); err != nil || entry.OutputID != dummyID(2) || entry.Size != 3 {\n\t\tt.Fatalf(\"c2.Get(1) = %x, %v, %v, want %x, %v, nil\", entry.OutputID, entry.Size, err, dummyID(2), 3)\n\t}\n\tif err := c2.putIndexEntry(dummyID(2), dummyID(3), 4, true); err != nil {\n\t\tt.Fatalf(\"addIndexEntry: %v\", err)\n\t}\n\tif entry, err := c1.Get(dummyID(2)); err != nil || entry.OutputID != dummyID(3) || entry.Size != 4 {\n\t\tt.Fatalf(\"c1.Get(2) = %x, %v, %v, want %x, %v, nil\", entry.OutputID, entry.Size, err, dummyID(3), 4)\n\t}\n}\n\nfunc TestGrowth(t *testing.T) {\n\tc, err := Open(t.TempDir())\n\tif err != nil {\n\t\tt.Fatalf(\"Open: %v\", err)\n\t}\n\n\tn := 10000\n\tif testing.Short() {\n\t\tn = 10\n\t}\n\n\tfor i := 0; i < n; i++ {\n\t\tif err := c.putIndexEntry(dummyID(i), dummyID(i*99), int64(i)*101, true); err != nil {\n\t\t\tt.Fatalf(\"addIndexEntry: %v\", err)\n\t\t}\n\t\tid := ActionID(dummyID(i))\n\t\tentry, err := c.Get(id)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Get(%x): %v\", id, err)\n\t\t}\n\t\tif entry.OutputID != dummyID(i*99) || entry.Size != int64(i)*101 {\n\t\t\tt.Errorf(\"Get(%x) = %x, %d, want %x, %d\", id, entry.OutputID, entry.Size, dummyID(i*99), int64(i)*101)\n\t\t}\n\t}\n\tfor i := 0; i < n; i++ {\n\t\tid := ActionID(dummyID(i))\n\t\tentry, err := c.Get(id)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Get2(%x): %v\", id, err)\n\t\t}\n\t\tif entry.OutputID != dummyID(i*99) || entry.Size != int64(i)*101 {\n\t\t\tt.Errorf(\"Get2(%x) = %x, %d, want %x, %d\", id, entry.OutputID, entry.Size, dummyID(i*99), int64(i)*101)\n\t\t}\n\t}\n}\n\n// func TestVerifyPanic(t *testing.T) {\n// \tos.Setenv(\"GODEBUG\", \"gocacheverify=1\")\n// \tinitEnv()\n// \tdefer func() {\n// \t\tos.Unsetenv(\"GODEBUG\")\n// \t\tverify = false\n// \t}()\n//\n// \tif !verify {\n// \t\tt.Fatal(\"initEnv did not set verify\")\n// \t}\n//\n// \tc, err := Open(t.TempDir())\n// \tif err != nil {\n// \t\tt.Fatalf(\"Open: %v\", err)\n// \t}\n//\n// \tid := ActionID(dummyID(1))\n// \tif err := PutBytes(c, id, []byte(\"abc\")); err != nil {\n// \t\tt.Fatal(err)\n// \t}\n//\n// \tdefer func() {\n// \t\tif err := recover(); err != nil {\n// \t\t\tt.Log(err)\n// \t\t\treturn\n// \t\t}\n// \t}()\n// \tPutBytes(c, id, []byte(\"def\"))\n// \tt.Fatal(\"mismatched Put did not panic in verify mode\")\n// }\n\nfunc dummyID(x int) [HashSize]byte {\n\tvar out [HashSize]byte\n\tbinary.LittleEndian.PutUint64(out[:], uint64(x))\n\treturn out\n}\n\nfunc TestCacheTrim(t *testing.T) {\n\tdir := t.TempDir()\n\tc, err := Open(dir)\n\tif err != nil {\n\t\tt.Fatalf(\"Open: %v\", err)\n\t}\n\tconst start = 1000000000\n\tnow := int64(start)\n\tc.now = func() time.Time { return time.Unix(now, 0) }\n\n\tcheckTime := func(name string, mtime int64) {\n\t\tt.Helper()\n\t\tfile := filepath.Join(c.dir, name[:2], name)\n\t\tinfo, err := os.Stat(file)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif info.ModTime().Unix() != mtime {\n\t\t\tt.Fatalf(\"%s mtime = %d, want %d\", name, info.ModTime().Unix(), mtime)\n\t\t}\n\t}\n\n\tid := ActionID(dummyID(1))\n\tPutBytes(c, id, []byte(\"abc\"))\n\tentry, _ := c.Get(id)\n\tPutBytes(c, ActionID(dummyID(2)), []byte(\"def\"))\n\tmtime := now\n\tcheckTime(fmt.Sprintf(\"%x-a\", id), mtime)\n\tcheckTime(fmt.Sprintf(\"%x-d\", entry.OutputID), mtime)\n\n\t// Get should not change recent mtimes.\n\tnow = start + 10\n\tc.Get(id)\n\tcheckTime(fmt.Sprintf(\"%x-a\", id), mtime)\n\tcheckTime(fmt.Sprintf(\"%x-d\", entry.OutputID), mtime)\n\n\t// Get should change distant mtimes.\n\tnow = start + 5000\n\tmtime2 := now\n\tif _, err := c.Get(id); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tc.OutputFile(entry.OutputID)\n\tcheckTime(fmt.Sprintf(\"%x-a\", id), mtime2)\n\tcheckTime(fmt.Sprintf(\"%x-d\", entry.OutputID), mtime2)\n\n\t// Trim should leave everything alone: it's all too new.\n\tif err := c.Trim(); err != nil {\n\t\tif testenv.SyscallIsNotSupported(err) {\n\t\t\tt.Skipf(\"skipping: Trim is unsupported (%v)\", err)\n\t\t}\n\t\tt.Fatal(err)\n\t}\n\tif _, err := c.Get(id); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tc.OutputFile(entry.OutputID)\n\tdata, err := os.ReadFile(filepath.Join(dir, \"trim.txt\"))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tcheckTime(fmt.Sprintf(\"%x-a\", dummyID(2)), start)\n\n\t// Trim less than a day later should not do any work at all.\n\tnow = start + 80000\n\tif err := c.Trim(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := c.Get(id); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tc.OutputFile(entry.OutputID)\n\tdata2, err := os.ReadFile(filepath.Join(dir, \"trim.txt\"))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif !bytes.Equal(data, data2) {\n\t\tt.Fatalf(\"second trim did work: %q -> %q\", data, data2)\n\t}\n\n\t// Fast forward and do another trim just before the 5 day cutoff.\n\t// Note that because of usedQuantum the cutoff is actually 5 days + 1 hour.\n\t// We used c.Get(id) just now, so 5 days later it should still be kept.\n\t// On the other hand almost a full day has gone by since we wrote dummyID(2)\n\t// and we haven't looked at it since, so 5 days later it should be gone.\n\tnow += 5 * 86400\n\tcheckTime(fmt.Sprintf(\"%x-a\", dummyID(2)), start)\n\tif err := c.Trim(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := c.Get(id); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tc.OutputFile(entry.OutputID)\n\tmtime3 := now\n\tif _, err := c.Get(dummyID(2)); err == nil { // haven't done a Get for this since original write above\n\t\tt.Fatalf(\"Trim did not remove dummyID(2)\")\n\t}\n\n\t// The c.Get(id) refreshed id's mtime again.\n\t// Check that another 5 days later it is still not gone,\n\t// but check by using checkTime, which doesn't bring mtime forward.\n\tnow += 5 * 86400\n\tif err := c.Trim(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tcheckTime(fmt.Sprintf(\"%x-a\", id), mtime3)\n\tcheckTime(fmt.Sprintf(\"%x-d\", entry.OutputID), mtime3)\n\n\t// Half a day later Trim should still be a no-op, because there was a Trim recently.\n\t// Even though the entry for id is now old enough to be trimmed,\n\t// it gets a reprieve until the time comes for a new Trim scan.\n\tnow += 86400 / 2\n\tif err := c.Trim(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tcheckTime(fmt.Sprintf(\"%x-a\", id), mtime3)\n\tcheckTime(fmt.Sprintf(\"%x-d\", entry.OutputID), mtime3)\n\n\t// Another half a day later, Trim should actually run, and it should remove id.\n\tnow += 86400/2 + 1\n\tif err := c.Trim(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := c.Get(dummyID(1)); err == nil {\n\t\tt.Fatal(\"Trim did not remove dummyID(1)\")\n\t}\n}\n"
  },
  {
    "path": "internal/go/cache/default.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage cache\n\nimport (\n\t\"fmt\"\n\tbase \"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n)\n\n// Default returns the default cache to use.\n// It never returns nil.\nfunc Default() Cache {\n\treturn initDefaultCacheOnce()\n}\n\nvar initDefaultCacheOnce = sync.OnceValue(initDefaultCache)\n\n// cacheREADME is a message stored in a README in the cache directory.\n// Because the cache lives outside the normal Go trees, we leave the\n// README as a courtesy to explain where it came from.\nconst cacheREADME = `This directory holds cached build artifacts from golangci-lint.\n`\n\n// initDefaultCache does the work of finding the default cache\n// the first time Default is called.\nfunc initDefaultCache() Cache {\n\tdir, _ := DefaultDir()\n\tif dir == \"off\" {\n\t\tif defaultDirErr != nil {\n\t\t\tbase.Fatalf(\"build cache is required, but could not be located: %v\", defaultDirErr)\n\t\t}\n\t\tbase.Fatalf(\"build cache is disabled by %s=off, but required as of Go 1.12\", envGolangciLintCache)\n\t}\n\tif err := os.MkdirAll(dir, 0o777); err != nil {\n\t\tbase.Fatalf(\"failed to initialize build cache at %s: %s\\n\", dir, err)\n\t}\n\tif _, err := os.Stat(filepath.Join(dir, \"README\")); err != nil {\n\t\t// Best effort.\n\t\tos.WriteFile(filepath.Join(dir, \"README\"), []byte(cacheREADME), 0666)\n\t}\n\n\tdiskCache, err := Open(dir)\n\tif err != nil {\n\t\tbase.Fatalf(\"failed to initialize build cache at %s: %s\\n\", dir, err)\n\t}\n\n\tif v := os.Getenv(envGolangciLintCacheProg); v != \"\" {\n\t\treturn startCacheProg(v, diskCache)\n\t}\n\n\treturn diskCache\n}\n\nvar (\n\tdefaultDirOnce    sync.Once\n\tdefaultDir        string\n\tdefaultDirChanged bool // effective value differs from $GOLANGCI_LINT_CACHE\n\tdefaultDirErr     error\n)\n\n// DefaultDir returns the effective GOLANGCI_LINT_CACHE setting.\n// It returns \"off\" if the cache is disabled,\n// and reports whether the effective value differs from GOLANGCI_LINT_CACHE.\nfunc DefaultDir() (string, bool) {\n\t// Save the result of the first call to DefaultDir for later use in\n\t// initDefaultCache. cmd/go/main.go explicitly sets GOLANGCI_LINT_CACHE so that\n\t// subprocesses will inherit it, but that means initDefaultCache can't\n\t// otherwise distinguish between an explicit \"off\" and a UserCacheDir error.\n\n\tdefaultDirOnce.Do(func() {\n\t\tdefaultDir = os.Getenv(envGolangciLintCache)\n\t\tif defaultDir != \"\" {\n\t\t\tdefaultDirChanged = true\n\t\t\tif filepath.IsAbs(defaultDir) || defaultDir == \"off\" {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdefaultDir = \"off\"\n\t\t\tdefaultDirErr = fmt.Errorf(\"%s is not an absolute path\", envGolangciLintCache)\n\t\t\treturn\n\t\t}\n\n\t\t// Compute default location.\n\t\tdir, err := os.UserCacheDir()\n\t\tif err != nil {\n\t\t\tdefaultDir = \"off\"\n\t\t\tdefaultDirChanged = true\n\t\t\tdefaultDirErr = fmt.Errorf(\"%s is not defined and %w\", envGolangciLintCache, err)\n\t\t\treturn\n\t\t}\n\t\tdefaultDir = filepath.Join(dir, \"golangci-lint\")\n\t})\n\n\treturn defaultDir, defaultDirChanged\n}\n"
  },
  {
    "path": "internal/go/cache/default_gcil.go",
    "content": "package cache\n\nconst (\n\tenvGolangciLintCache     = \"GOLANGCI_LINT_CACHE\"\n\tenvGolangciLintCacheProg = \"GOLANGCI_LINT_CACHEPROG\"\n)\n"
  },
  {
    "path": "internal/go/cache/hash.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage cache\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n)\n\nvar debugHash = false // set when GODEBUG=gocachehash=1\n\n// HashSize is the number of bytes in a hash.\nconst HashSize = 32\n\n// A Hash provides access to the canonical hash function used to index the cache.\n// The current implementation uses salted SHA256, but clients must not assume this.\ntype Hash struct {\n\th    hash.Hash\n\tname string        // for debugging\n\tbuf  *bytes.Buffer // for verify\n}\n\n// hashSalt is a salt string added to the beginning of every hash\n// created by NewHash. Using the golangci-lint version makes sure that different\n// versions of the command do not address the same cache\n// entries, so that a bug in one version does not affect the execution\n// of other versions. This salt will result in additional ActionID files\n// in the cache, but not additional copies of the large output files,\n// which are still addressed by unsalted SHA256.\nvar hashSalt []byte\n\n// stripExperiment strips any GOEXPERIMENT configuration from the Go\n// version string.\nfunc stripExperiment(version string) string {\n\tif i := strings.Index(version, \" X:\"); i >= 0 {\n\t\treturn version[:i]\n\t}\n\treturn version\n}\n\n// Subkey returns an action ID corresponding to mixing a parent\n// action ID with a string description of the subkey.\nfunc Subkey(parent ActionID, desc string) (ActionID, error) {\n\th := sha256.New()\n\th.Write([]byte(\"subkey:\"))\n\tn, err := h.Write(parent[:])\n\tif n != len(parent) {\n\t\treturn ActionID{}, fmt.Errorf(\"wrote %d/%d bytes of parent with error %s\", n, len(parent), err)\n\t}\n\tn, err = h.Write([]byte(desc))\n\tif n != len(desc) {\n\t\treturn ActionID{}, fmt.Errorf(\"wrote %d/%d bytes of desc with error %s\", n, len(desc), err)\n\t}\n\n\tvar out ActionID\n\th.Sum(out[:0])\n\tif debugHash {\n\t\tfmt.Fprintf(os.Stderr, \"HASH subkey %x %q = %x\\n\", parent, desc, out)\n\t}\n\tif verify {\n\t\thashDebug.Lock()\n\t\thashDebug.m[out] = fmt.Sprintf(\"subkey %x %q\", parent, desc)\n\t\thashDebug.Unlock()\n\t}\n\treturn out, nil\n}\n\n// NewHash returns a new Hash.\n// The caller is expected to Write data to it and then call Sum.\nfunc NewHash(name string) (*Hash, error) {\n\th := &Hash{h: sha256.New(), name: name}\n\tif debugHash {\n\t\tfmt.Fprintf(os.Stderr, \"HASH[%s]\\n\", h.name)\n\t}\n\tn, err := h.Write(hashSalt)\n\tif n != len(hashSalt) {\n\t\treturn nil, fmt.Errorf(\"wrote %d/%d bytes of hash salt with error %s\", n, len(hashSalt), err)\n\t}\n\tif verify {\n\t\th.buf = new(bytes.Buffer)\n\t}\n\treturn h, nil\n}\n\n// Write writes data to the running hash.\nfunc (h *Hash) Write(b []byte) (int, error) {\n\tif debugHash {\n\t\tfmt.Fprintf(os.Stderr, \"HASH[%s]: %q\\n\", h.name, b)\n\t}\n\tif h.buf != nil {\n\t\th.buf.Write(b)\n\t}\n\treturn h.h.Write(b)\n}\n\n// Sum returns the hash of the data written previously.\nfunc (h *Hash) Sum() [HashSize]byte {\n\tvar out [HashSize]byte\n\th.h.Sum(out[:0])\n\tif debugHash {\n\t\tfmt.Fprintf(os.Stderr, \"HASH[%s]: %x\\n\", h.name, out)\n\t}\n\tif h.buf != nil {\n\t\thashDebug.Lock()\n\t\tif hashDebug.m == nil {\n\t\t\thashDebug.m = make(map[[HashSize]byte]string)\n\t\t}\n\t\thashDebug.m[out] = h.buf.String()\n\t\thashDebug.Unlock()\n\t}\n\treturn out\n}\n\n// In GODEBUG=gocacheverify=1 mode,\n// hashDebug holds the input to every computed hash ID,\n// so that we can work backward from the ID involved in a\n// cache entry mismatch to a description of what should be there.\nvar hashDebug struct {\n\tsync.Mutex\n\tm map[[HashSize]byte]string\n}\n\n// reverseHash returns the input used to compute the hash id.\nfunc reverseHash(id [HashSize]byte) string {\n\thashDebug.Lock()\n\ts := hashDebug.m[id]\n\thashDebug.Unlock()\n\treturn s\n}\n\nvar hashFileCache struct {\n\tsync.Mutex\n\tm map[string][HashSize]byte\n}\n\n// FileHash returns the hash of the named file.\n// It caches repeated lookups for a given file,\n// and the cache entry for a file can be initialized\n// using SetFileHash.\n// The hash used by FileHash is not the same as\n// the hash used by NewHash.\nfunc FileHash(file string) ([HashSize]byte, error) {\n\thashFileCache.Lock()\n\tout, ok := hashFileCache.m[file]\n\thashFileCache.Unlock()\n\n\tif ok {\n\t\treturn out, nil\n\t}\n\n\th := sha256.New()\n\tf, err := os.Open(file)\n\tif err != nil {\n\t\tif debugHash {\n\t\t\tfmt.Fprintf(os.Stderr, \"HASH %s: %v\\n\", file, err)\n\t\t}\n\t\treturn [HashSize]byte{}, err\n\t}\n\t_, err = io.Copy(h, f)\n\tf.Close()\n\tif err != nil {\n\t\tif debugHash {\n\t\t\tfmt.Fprintf(os.Stderr, \"HASH %s: %v\\n\", file, err)\n\t\t}\n\t\treturn [HashSize]byte{}, err\n\t}\n\th.Sum(out[:0])\n\tif debugHash {\n\t\tfmt.Fprintf(os.Stderr, \"HASH %s: %x\\n\", file, out)\n\t}\n\n\tSetFileHash(file, out)\n\treturn out, nil\n}\n\n// SetFileHash sets the hash returned by FileHash for file.\nfunc SetFileHash(file string, sum [HashSize]byte) {\n\thashFileCache.Lock()\n\tif hashFileCache.m == nil {\n\t\thashFileCache.m = make(map[string][HashSize]byte)\n\t}\n\thashFileCache.m[file] = sum\n\thashFileCache.Unlock()\n}\n"
  },
  {
    "path": "internal/go/cache/hash_gcil.go",
    "content": "package cache\n\nfunc SetSalt(b []byte) {\n\thashSalt = b\n}\n"
  },
  {
    "path": "internal/go/cache/hash_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage cache\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n)\n\nfunc TestHash(t *testing.T) {\n\toldSalt := hashSalt\n\thashSalt = nil\n\tdefer func() {\n\t\thashSalt = oldSalt\n\t}()\n\n\th, _ := NewHash(\"alice\")\n\th.Write([]byte(\"hello world\"))\n\tsum := fmt.Sprintf(\"%x\", h.Sum())\n\twant := \"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9\"\n\tif sum != want {\n\t\tt.Errorf(\"hash(hello world) = %v, want %v\", sum, want)\n\t}\n}\n\nfunc TestHashFile(t *testing.T) {\n\tf, err := os.CreateTemp(\"\", \"cmd-go-test-\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tname := f.Name()\n\tfmt.Fprintf(f, \"hello world\")\n\tdefer os.Remove(name)\n\tif err := f.Close(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tvar h ActionID // make sure hash result is assignable to ActionID\n\th, err = FileHash(name)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsum := fmt.Sprintf(\"%x\", h)\n\twant := \"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9\"\n\tif sum != want {\n\t\tt.Errorf(\"hash(hello world) = %v, want %v\", sum, want)\n\t}\n}\n"
  },
  {
    "path": "internal/go/cache/prog.go",
    "content": "// Copyright 2023 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage cache\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\tbase \"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/go/cacheprog\"\n\t\"github.com/golangci/golangci-lint/v2/internal/go/quoted\"\n)\n\n// ProgCache implements Cache via JSON messages over stdin/stdout to a child\n// helper process which can then implement whatever caching policy/mechanism it\n// wants.\n//\n// See https://github.com/golang/go/issues/59719\ntype ProgCache struct {\n\tcmd    *exec.Cmd\n\tstdout io.ReadCloser  // from the child process\n\tstdin  io.WriteCloser // to the child process\n\tbw     *bufio.Writer  // to stdin\n\tjenc   *json.Encoder  // to bw\n\n\t// can are the commands that the child process declared that it supports.\n\t// This is effectively the versioning mechanism.\n\tcan map[cacheprog.Cmd]bool\n\n\t// fuzzDirCache is another Cache implementation to use for the FuzzDir\n\t// method. In practice this is the default GOCACHE disk-based\n\t// implementation.\n\t//\n\t// TODO(bradfitz): maybe this isn't ideal. But we'd need to extend the Cache\n\t// interface and the fuzzing callers to be less disk-y to do more here.\n\tfuzzDirCache Cache\n\n\tclosing      atomic.Bool\n\tctx          context.Context    // valid until Close via ctxClose\n\tctxCancel    context.CancelFunc // called on Close\n\treadLoopDone chan struct{}      // closed when readLoop returns\n\n\tmu         sync.Mutex // guards following fields\n\tnextID     int64\n\tinFlight   map[int64]chan<- *cacheprog.Response\n\toutputFile map[OutputID]string // object => abs path on disk\n\n\t// writeMu serializes writing to the child process.\n\t// It must never be held at the same time as mu.\n\twriteMu sync.Mutex\n}\n\n// startCacheProg starts the prog binary (with optional space-separated flags)\n// and returns a Cache implementation that talks to it.\n//\n// It blocks a few seconds to wait for the child process to successfully start\n// and advertise its capabilities.\nfunc startCacheProg(progAndArgs string, fuzzDirCache Cache) Cache {\n\tif fuzzDirCache == nil {\n\t\tpanic(\"missing fuzzDirCache\")\n\t}\n\targs, err := quoted.Split(progAndArgs)\n\tif err != nil {\n\t\tbase.Fatalf(\"%s args: %v\", envGolangciLintCacheProg, err)\n\t}\n\tvar prog string\n\tif len(args) > 0 {\n\t\tprog = args[0]\n\t\targs = args[1:]\n\t}\n\n\tctx, ctxCancel := context.WithCancel(context.Background())\n\n\tcmd := exec.CommandContext(ctx, prog, args...)\n\tout, err := cmd.StdoutPipe()\n\tif err != nil {\n\t\tbase.Fatalf(\"StdoutPipe to %s: envGolangciLintCacheProg, %v\", envGolangciLintCacheProg, err)\n\t}\n\tin, err := cmd.StdinPipe()\n\tif err != nil {\n\t\tbase.Fatalf(\"StdinPipe to %s: envGolangciLintCacheProg, %v\", envGolangciLintCacheProg, err)\n\t}\n\tcmd.Stderr = os.Stderr\n\t// On close, we cancel the context. Rather than killing the helper,\n\t// close its stdin.\n\tcmd.Cancel = in.Close\n\n\tif err := cmd.Start(); err != nil {\n\t\tbase.Fatalf(\"error starting %s program %q: %v\", envGolangciLintCacheProg, prog, err)\n\t}\n\n\tpc := &ProgCache{\n\t\tctx:          ctx,\n\t\tctxCancel:    ctxCancel,\n\t\tfuzzDirCache: fuzzDirCache,\n\t\tcmd:          cmd,\n\t\tstdout:       out,\n\t\tstdin:        in,\n\t\tbw:           bufio.NewWriter(in),\n\t\tinFlight:     make(map[int64]chan<- *cacheprog.Response),\n\t\toutputFile:   make(map[OutputID]string),\n\t\treadLoopDone: make(chan struct{}),\n\t}\n\n\t// Register our interest in the initial protocol message from the child to\n\t// us, saying what it can do.\n\tcapResc := make(chan *cacheprog.Response, 1)\n\tpc.inFlight[0] = capResc\n\n\tpc.jenc = json.NewEncoder(pc.bw)\n\tgo pc.readLoop(pc.readLoopDone)\n\n\t// Give the child process a few seconds to report its capabilities. This\n\t// should be instant and not require any slow work by the program.\n\ttimer := time.NewTicker(5 * time.Second)\n\tdefer timer.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-timer.C:\n\t\t\tlog.Printf(\"# still waiting for %s %v ...\", envGolangciLintCacheProg, prog)\n\t\tcase capRes := <-capResc:\n\t\t\tcan := map[cacheprog.Cmd]bool{}\n\t\t\tfor _, cmd := range capRes.KnownCommands {\n\t\t\t\tcan[cmd] = true\n\t\t\t}\n\t\t\tif len(can) == 0 {\n\t\t\t\tbase.Fatalf(\"%s %v declared no supported commands\", envGolangciLintCacheProg, prog)\n\t\t\t}\n\t\t\tpc.can = can\n\t\t\treturn pc\n\t\t}\n\t}\n}\n\nfunc (c *ProgCache) readLoop(readLoopDone chan<- struct{}) {\n\tdefer close(readLoopDone)\n\tjd := json.NewDecoder(c.stdout)\n\tfor {\n\t\tres := new(cacheprog.Response)\n\t\tif err := jd.Decode(res); err != nil {\n\t\t\tif c.closing.Load() {\n\t\t\t\tc.mu.Lock()\n\t\t\t\tfor _, ch := range c.inFlight {\n\t\t\t\t\tclose(ch)\n\t\t\t\t}\n\t\t\t\tc.inFlight = nil\n\t\t\t\tc.mu.Unlock()\n\t\t\t\treturn // quietly\n\t\t\t}\n\t\t\tif err == io.EOF {\n\t\t\t\tc.mu.Lock()\n\t\t\t\tinFlight := len(c.inFlight)\n\t\t\t\tc.mu.Unlock()\n\t\t\t\tbase.Fatalf(\"%s exited pre-Close with %v pending requests\", envGolangciLintCacheProg, inFlight)\n\t\t\t}\n\t\t\tbase.Fatalf(\"error reading JSON from %s: %v\", envGolangciLintCacheProg, err)\n\t\t}\n\t\tc.mu.Lock()\n\t\tch, ok := c.inFlight[res.ID]\n\t\tdelete(c.inFlight, res.ID)\n\t\tc.mu.Unlock()\n\t\tif ok {\n\t\t\tch <- res\n\t\t} else {\n\t\t\tbase.Fatalf(\"%s sent response for unknown request ID %v\", envGolangciLintCacheProg, res.ID)\n\t\t}\n\t}\n}\n\nvar errCacheprogClosed = fmt.Errorf(\"%s program closed unexpectedly\", envGolangciLintCacheProg)\n\nfunc (c *ProgCache) send(ctx context.Context, req *cacheprog.Request) (*cacheprog.Response, error) {\n\tresc := make(chan *cacheprog.Response, 1)\n\tif err := c.writeToChild(req, resc); err != nil {\n\t\treturn nil, err\n\t}\n\tselect {\n\tcase res := <-resc:\n\t\tif res == nil {\n\t\t\treturn nil, errCacheprogClosed\n\t\t}\n\t\tif res.Err != \"\" {\n\t\t\treturn nil, errors.New(res.Err)\n\t\t}\n\t\treturn res, nil\n\tcase <-ctx.Done():\n\t\treturn nil, ctx.Err()\n\t}\n}\n\nfunc (c *ProgCache) writeToChild(req *cacheprog.Request, resc chan<- *cacheprog.Response) (err error) {\n\tc.mu.Lock()\n\tif c.inFlight == nil {\n\t\treturn errCacheprogClosed\n\t}\n\tc.nextID++\n\treq.ID = c.nextID\n\tc.inFlight[req.ID] = resc\n\tc.mu.Unlock()\n\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tc.mu.Lock()\n\t\t\tif c.inFlight != nil {\n\t\t\t\tdelete(c.inFlight, req.ID)\n\t\t\t}\n\t\t\tc.mu.Unlock()\n\t\t}\n\t}()\n\n\tc.writeMu.Lock()\n\tdefer c.writeMu.Unlock()\n\n\tif err := c.jenc.Encode(req); err != nil {\n\t\treturn err\n\t}\n\tif err := c.bw.WriteByte('\\n'); err != nil {\n\t\treturn err\n\t}\n\tif req.Body != nil && req.BodySize > 0 {\n\t\tif err := c.bw.WriteByte('\"'); err != nil {\n\t\t\treturn err\n\t\t}\n\t\te := base64.NewEncoder(base64.StdEncoding, c.bw)\n\t\twrote, err := io.Copy(e, req.Body)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := e.Close(); err != nil {\n\t\t\treturn nil\n\t\t}\n\t\tif wrote != req.BodySize {\n\t\t\treturn fmt.Errorf(\"short write writing body to %s for action %x, output %x: wrote %v; expected %v\",\n\t\t\t\tenvGolangciLintCacheProg, req.ActionID, req.OutputID, wrote, req.BodySize)\n\t\t}\n\t\tif _, err := c.bw.WriteString(\"\\\"\\n\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := c.bw.Flush(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (c *ProgCache) Get(a ActionID) (Entry, error) {\n\tif !c.can[cacheprog.CmdGet] {\n\t\t// They can't do a \"get\". Maybe they're a write-only cache.\n\t\t//\n\t\t// TODO(bradfitz,bcmills): figure out the proper error type here. Maybe\n\t\t// errors.ErrUnsupported? Is entryNotFoundError even appropriate? There\n\t\t// might be places where we rely on the fact that a recent Put can be\n\t\t// read through a corresponding Get. Audit callers and check, and document\n\t\t// error types on the Cache interface.\n\t\treturn Entry{}, &entryNotFoundError{}\n\t}\n\tres, err := c.send(c.ctx, &cacheprog.Request{\n\t\tCommand:  cacheprog.CmdGet,\n\t\tActionID: a[:],\n\t})\n\tif err != nil {\n\t\treturn Entry{}, err // TODO(bradfitz): or entryNotFoundError? Audit callers.\n\t}\n\tif res.Miss {\n\t\treturn Entry{}, &entryNotFoundError{}\n\t}\n\te := Entry{\n\t\tSize: res.Size,\n\t}\n\tif res.Time != nil {\n\t\te.Time = *res.Time\n\t} else {\n\t\te.Time = time.Now()\n\t}\n\tif res.DiskPath == \"\" {\n\t\treturn Entry{}, &entryNotFoundError{fmt.Errorf(\"%s didn't populate DiskPath on get hit\", envGolangciLintCacheProg)}\n\t}\n\tif copy(e.OutputID[:], res.OutputID) != len(res.OutputID) {\n\t\treturn Entry{}, &entryNotFoundError{errors.New(\"incomplete ProgResponse OutputID\")}\n\t}\n\tc.noteOutputFile(e.OutputID, res.DiskPath)\n\treturn e, nil\n}\n\nfunc (c *ProgCache) noteOutputFile(o OutputID, diskPath string) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tc.outputFile[o] = diskPath\n}\n\nfunc (c *ProgCache) OutputFile(o OutputID) string {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\treturn c.outputFile[o]\n}\n\nfunc (c *ProgCache) Put(a ActionID, file io.ReadSeeker) (_ OutputID, size int64, _ error) {\n\t// Compute output ID.\n\th := sha256.New()\n\tif _, err := file.Seek(0, 0); err != nil {\n\t\treturn OutputID{}, 0, err\n\t}\n\tsize, err := io.Copy(h, file)\n\tif err != nil {\n\t\treturn OutputID{}, 0, err\n\t}\n\tvar out OutputID\n\th.Sum(out[:0])\n\n\tif _, err := file.Seek(0, 0); err != nil {\n\t\treturn OutputID{}, 0, err\n\t}\n\n\tif !c.can[cacheprog.CmdPut] {\n\t\t// Child is a read-only cache. Do nothing.\n\t\treturn out, size, nil\n\t}\n\n\tres, err := c.send(c.ctx, &cacheprog.Request{\n\t\tCommand:  cacheprog.CmdPut,\n\t\tActionID: a[:],\n\t\tOutputID: out[:],\n\t\tBody:     file,\n\t\tBodySize: size,\n\t})\n\tif err != nil {\n\t\treturn OutputID{}, 0, err\n\t}\n\tif res.DiskPath == \"\" {\n\t\treturn OutputID{}, 0, fmt.Errorf(\"%s didn't return DiskPath in put response\", envGolangciLintCacheProg)\n\t}\n\tc.noteOutputFile(out, res.DiskPath)\n\treturn out, size, err\n}\n\nfunc (c *ProgCache) Close() error {\n\tc.closing.Store(true)\n\tvar err error\n\n\t// First write a \"close\" message to the child so it can exit nicely\n\t// and clean up if it wants. Only after that exchange do we cancel\n\t// the context that kills the process.\n\tif c.can[cacheprog.CmdClose] {\n\t\t_, err = c.send(c.ctx, &cacheprog.Request{Command: cacheprog.CmdClose})\n\t\tif errors.Is(err, errCacheprogClosed) {\n\t\t\t// Allow the child to quit without responding to close.\n\t\t\terr = nil\n\t\t}\n\t}\n\t// Cancel the context, which will close the helper's stdin.\n\tc.ctxCancel()\n\t// Wait until the helper closes its stdout.\n\t<-c.readLoopDone\n\treturn err\n}\n\nfunc (c *ProgCache) FuzzDir() string {\n\t// TODO(bradfitz): figure out what to do here. For now just use the\n\t// disk-based default.\n\treturn c.fuzzDirCache.FuzzDir()\n}\n"
  },
  {
    "path": "internal/go/cache/readme.md",
    "content": "# cache\n\nExtracted from `go/src/cmd/go/internal/cache/`.\n\nThe main modifications are:\n- The errors management\n  - Some methods return error.\n  - Some errors are returned instead of being ignored.\n- The name of the env vars:\n  - `GOCACHE` -> `GOLANGCI_LINT_CACHE`\n  - `GOCACHEPROG` -> `GOLANGCI_LINT_CACHEPROG` \n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync go1.24.1\n- https://github.com/golangci/golangci-lint/pull/5100\n  - Move package from `internal/cache` to `internal/go/cache`\n- https://github.com/golangci/golangci-lint/pull/5098\n  - sync with go1.23.2\n  - sync with go1.22.8\n  - sync with go1.21.13\n  - sync with go1.20.14\n  - sync with go1.19.13\n  - sync with go1.18.10\n  - sync with go1.17.13\n  - sync with go1.16.15\n  - sync with go1.15.15\n  - sync with go1.14.15\n\n## Previous History\n\nBased on the initial PR/commit the based in a mix between go1.12 and go1.13:\n- cache.go (go1.13)\n- cache_test.go (go1.12?)\n- default.go (go1.12?)\n- hash.go (go1.13 and go1.12 are identical)\n- hash_test.go -> (go1.12?)\n\nAdapted for golangci-lint:\n- https://github.com/golangci/golangci-lint/pull/699: initial code (contains modifications of the files)\n- https://github.com/golangci/golangci-lint/pull/779: just a nolint (`cache.go`)\n- https://github.com/golangci/golangci-lint/pull/788: only directory permissions changes (0777 -> 0744) (`cache.go`, `cache_test.go`, `default.go`)\n- https://github.com/golangci/golangci-lint/pull/808: mainly related to logs and errors (`cache.go`, `default.go`, `hash.go`, `hash_test.go`)\n- https://github.com/golangci/golangci-lint/pull/1063: `ioutil` -> `robustio` (`cache.go`)\n- https://github.com/golangci/golangci-lint/pull/1070: add `t.Parallel()` inside `cache_test.go`\n- https://github.com/golangci/golangci-lint/pull/1162: errors inside `cache.go`\n- https://github.com/golangci/golangci-lint/pull/2318: `ioutil` -> `os` (`cache.go`, `cache_test.go`, `default.go`, `hash_test.go`)\n- https://github.com/golangci/golangci-lint/pull/2352: Go doc typos\n- https://github.com/golangci/golangci-lint/pull/3012: errors inside `cache.go` (`cache.go`, `default.go`)\n- https://github.com/golangci/golangci-lint/pull/3196: constant for `GOLANGCI_LINT_CACHE` (`cache.go`)\n- https://github.com/golangci/golangci-lint/pull/3204: add this file and `%w` in `fmt.Errorf` (`cache.go`)\n- https://github.com/golangci/golangci-lint/pull/3604: remove `github.com/pkg/errors` (`cache.go`)\n"
  },
  {
    "path": "internal/go/cacheprog/cacheprog.go",
    "content": "// Copyright 2024 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package cacheprog defines the protocol for a GOCACHEPROG program.\n//\n// By default, the go command manages a build cache stored in the file system\n// itself. GOCACHEPROG can be set to the name of a command (with optional\n// space-separated flags) that implements the go command build cache externally.\n// This permits defining a different cache policy.\n//\n// The go command will start the GOCACHEPROG as a subprocess and communicate\n// with it via JSON messages over stdin/stdout. The subprocess's stderr will be\n// connected to the go command's stderr.\n//\n// The subprocess should immediately send a [Response] with its capabilities.\n// After that, the go command will send a stream of [Request] messages and the\n// subprocess should reply to each [Request] with a [Response] message.\npackage cacheprog\n\nimport (\n\t\"io\"\n\t\"time\"\n)\n\n// Cmd is a command that can be issued to a child process.\n//\n// If the interface needs to grow, the go command can add new commands or new\n// versioned commands like \"get2\" in the future. The initial [Response] from\n// the child process indicates which commands it supports.\ntype Cmd string\n\nconst (\n\t// CmdPut tells the cache program to store an object in the cache.\n\t//\n\t// [Request.ActionID] is the cache key of this object. The cache should\n\t// store [Request.OutputID] and [Request.Body] under this key for a\n\t// later \"get\" request. It must also store the Body in a file in the local\n\t// file system and return the path to that file in [Response.DiskPath],\n\t// which must exist at least until a \"close\" request.\n\tCmdPut = Cmd(\"put\")\n\n\t// CmdGet tells the cache program to retrieve an object from the cache.\n\t//\n\t// [Request.ActionID] specifies the key of the object to get. If the\n\t// cache does not contain this object, it should set [Response.Miss] to\n\t// true. Otherwise, it should populate the fields of [Response],\n\t// including setting [Response.OutputID] to the OutputID of the original\n\t// \"put\" request and [Response.DiskPath] to the path of a local file\n\t// containing the Body of the original \"put\" request. That file must\n\t// continue to exist at least until a \"close\" request.\n\tCmdGet = Cmd(\"get\")\n\n\t// CmdClose requests that the cache program exit gracefully.\n\t//\n\t// The cache program should reply to this request and then exit\n\t// (thus closing its stdout).\n\tCmdClose = Cmd(\"close\")\n)\n\n// Request is the JSON-encoded message that's sent from the go command to\n// the GOCACHEPROG child process over stdin. Each JSON object is on its own\n// line. A ProgRequest of Type \"put\" with BodySize > 0 will be followed by a\n// line containing a base64-encoded JSON string literal of the body.\ntype Request struct {\n\t// ID is a unique number per process across all requests.\n\t// It must be echoed in the Response from the child.\n\tID int64\n\n\t// Command is the type of request.\n\t// The go command will only send commands that were declared\n\t// as supported by the child.\n\tCommand Cmd\n\n\t// ActionID is the cache key for \"put\" and \"get\" requests.\n\tActionID []byte `json:\",omitempty\"` // or nil if not used\n\n\t// OutputID is stored with the body for \"put\" requests.\n\t//\n\t// Prior to Go 1.24, when GOCACHEPROG was still an experiment, this was\n\t// accidentally named ObjectID. It was renamed to OutputID in Go 1.24.\n\tOutputID []byte `json:\",omitempty\"` // or nil if not used\n\n\t// Body is the body for \"put\" requests. It's sent after the JSON object\n\t// as a base64-encoded JSON string when BodySize is non-zero.\n\t// It's sent as a separate JSON value instead of being a struct field\n\t// send in this JSON object so large values can be streamed in both directions.\n\t// The base64 string body of a Request will always be written\n\t// immediately after the JSON object and a newline.\n\tBody io.Reader `json:\"-\"`\n\n\t// BodySize is the number of bytes of Body. If zero, the body isn't written.\n\tBodySize int64 `json:\",omitempty\"`\n\n\t// ObjectID is the accidental spelling of OutputID that was used prior to Go\n\t// 1.24.\n\t//\n\t// Deprecated: use OutputID. This field is only populated temporarily for\n\t// backwards compatibility with Go 1.23 and earlier when\n\t// GOEXPERIMENT=gocacheprog is set. It will be removed in Go 1.25.\n\tObjectID []byte `json:\",omitempty\"`\n}\n\n// Response is the JSON response from the child process to the go command.\n//\n// With the exception of the first protocol message that the child writes to its\n// stdout with ID==0 and KnownCommands populated, these are only sent in\n// response to a Request from the go command.\n//\n// Responses can be sent in any order. The ID must match the request they're\n// replying to.\ntype Response struct {\n\tID  int64  // that corresponds to Request; they can be answered out of order\n\tErr string `json:\",omitempty\"` // if non-empty, the error\n\n\t// KnownCommands is included in the first message that cache helper program\n\t// writes to stdout on startup (with ID==0). It includes the\n\t// Request.Command types that are supported by the program.\n\t//\n\t// This lets the go command extend the protocol gracefully over time (adding\n\t// \"get2\", etc), or fail gracefully when needed. It also lets the go command\n\t// verify the program wants to be a cache helper.\n\tKnownCommands []Cmd `json:\",omitempty\"`\n\n\t// For \"get\" requests.\n\n\tMiss     bool       `json:\",omitempty\"` // cache miss\n\tOutputID []byte     `json:\",omitempty\"` // the ObjectID stored with the body\n\tSize     int64      `json:\",omitempty\"` // body size in bytes\n\tTime     *time.Time `json:\",omitempty\"` // when the object was put in the cache (optional; used for cache expiration)\n\n\t// For \"get\" and \"put\" requests.\n\n\t// DiskPath is the absolute path on disk of the body corresponding to a\n\t// \"get\" (on cache hit) or \"put\" request's ActionID.\n\tDiskPath string `json:\",omitempty\"`\n}\n"
  },
  {
    "path": "internal/go/cacheprog/readme.md",
    "content": "# quoted\n\nExtracted from `go/src/cmd/go/internal/cacheprog/` (related to `cache`).\nThis is just a copy of the Go code without any changes.\n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync go1.24.1\n"
  },
  {
    "path": "internal/go/mmap/mmap.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This package is a lightly modified version of the mmap code\n// in github.com/google/codesearch/index.\n\n// The mmap package provides an abstraction for memory mapping files\n// on different platforms.\npackage mmap\n\nimport (\n\t\"os\"\n)\n\n// Data is mmap'ed read-only data from a file.\n// The backing file is never closed, so Data\n// remains valid for the lifetime of the process.\ntype Data struct {\n\tf    *os.File\n\tData []byte\n}\n\n// Mmap maps the given file into memory.\nfunc Mmap(file string) (Data, bool, error) {\n\tf, err := os.Open(file)\n\tif err != nil {\n\t\treturn Data{}, false, err\n\t}\n\tdata, err := mmapFile(f)\n\treturn data, true, err\n}\n"
  },
  {
    "path": "internal/go/mmap/mmap_other.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build (js && wasm) || wasip1 || plan9\n\npackage mmap\n\nimport (\n\t\"io\"\n\t\"os\"\n)\n\n// mmapFile on other systems doesn't mmap the file. It just reads everything.\nfunc mmapFile(f *os.File) (Data, error) {\n\tb, err := io.ReadAll(f)\n\tif err != nil {\n\t\treturn Data{}, err\n\t}\n\treturn Data{f, b}, nil\n}\n"
  },
  {
    "path": "internal/go/mmap/mmap_unix.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage mmap\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"syscall\"\n)\n\nfunc mmapFile(f *os.File) (Data, error) {\n\tst, err := f.Stat()\n\tif err != nil {\n\t\treturn Data{}, err\n\t}\n\tsize := st.Size()\n\tpagesize := int64(os.Getpagesize())\n\tif int64(int(size+(pagesize-1))) != size+(pagesize-1) {\n\t\treturn Data{}, fmt.Errorf(\"%s: too large for mmap\", f.Name())\n\t}\n\tn := int(size)\n\tif n == 0 {\n\t\treturn Data{f, nil}, nil\n\t}\n\tmmapLength := int(((size + pagesize - 1) / pagesize) * pagesize) // round up to page size\n\tdata, err := syscall.Mmap(int(f.Fd()), 0, mmapLength, syscall.PROT_READ, syscall.MAP_SHARED)\n\tif err != nil {\n\t\treturn Data{}, &fs.PathError{Op: \"mmap\", Path: f.Name(), Err: err}\n\t}\n\treturn Data{f, data[:n]}, nil\n}\n"
  },
  {
    "path": "internal/go/mmap/mmap_windows.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage mmap\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nfunc mmapFile(f *os.File) (Data, error) {\n\tst, err := f.Stat()\n\tif err != nil {\n\t\treturn Data{}, err\n\t}\n\tsize := st.Size()\n\tif size == 0 {\n\t\treturn Data{f, nil}, nil\n\t}\n\th, err := syscall.CreateFileMapping(syscall.Handle(f.Fd()), nil, syscall.PAGE_READONLY, 0, 0, nil)\n\tif err != nil {\n\t\treturn Data{}, fmt.Errorf(\"CreateFileMapping %s: %w\", f.Name(), err)\n\t}\n\n\taddr, err := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, 0)\n\tif err != nil {\n\t\treturn Data{}, fmt.Errorf(\"MapViewOfFile %s: %w\", f.Name(), err)\n\t}\n\tvar info windows.MemoryBasicInformation\n\terr = windows.VirtualQuery(addr, &info, unsafe.Sizeof(info))\n\tif err != nil {\n\t\treturn Data{}, fmt.Errorf(\"VirtualQuery %s: %w\", f.Name(), err)\n\t}\n\tdata := unsafe.Slice((*byte)(unsafe.Pointer(addr)), int(info.RegionSize))\n\tif len(data) < int(size) {\n\t\t// In some cases, especially on 386, we may not receive a in incomplete mapping:\n\t\t// one that is shorter than the file itself. Return an error in those cases because\n\t\t// incomplete mappings are not useful.\n\t\treturn Data{}, fmt.Errorf(\"mmapFile: received incomplete mapping of file\")\n\t}\n\treturn Data{f, data[:int(size)]}, nil\n}\n"
  },
  {
    "path": "internal/go/mmap/readme.md",
    "content": "# mmap\n\nExtracted from `go/src/cmd/go/internal/mmap/` (related to `cache`).\nThis is just a copy of the Go code without any changes.\n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync go1.24.1\n- https://github.com/golangci/golangci-lint/pull/5100\n  - Move package from `internal/mmap` to `internal/go/mmap`\n- https://github.com/golangci/golangci-lint/pull/5098\n  - sync with go1.23.2\n  - sync with go1.22.8\n  - sync with go1.21.13\n  - sync with go1.20.14\n  - sync with go1.19.13\n"
  },
  {
    "path": "internal/go/quoted/quoted.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package quoted provides string manipulation utilities.\npackage quoted\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"strings\"\n\t\"unicode\"\n)\n\nfunc isSpaceByte(c byte) bool {\n\treturn c == ' ' || c == '\\t' || c == '\\n' || c == '\\r'\n}\n\n// Split splits s into a list of fields,\n// allowing single or double quotes around elements.\n// There is no unescaping or other processing within\n// quoted fields.\n//\n// Keep in sync with cmd/dist/quoted.go\nfunc Split(s string) ([]string, error) {\n\t// Split fields allowing '' or \"\" around elements.\n\t// Quotes further inside the string do not count.\n\tvar f []string\n\tfor len(s) > 0 {\n\t\tfor len(s) > 0 && isSpaceByte(s[0]) {\n\t\t\ts = s[1:]\n\t\t}\n\t\tif len(s) == 0 {\n\t\t\tbreak\n\t\t}\n\t\t// Accepted quoted string. No unescaping inside.\n\t\tif s[0] == '\"' || s[0] == '\\'' {\n\t\t\tquote := s[0]\n\t\t\ts = s[1:]\n\t\t\ti := 0\n\t\t\tfor i < len(s) && s[i] != quote {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif i >= len(s) {\n\t\t\t\treturn nil, fmt.Errorf(\"unterminated %c string\", quote)\n\t\t\t}\n\t\t\tf = append(f, s[:i])\n\t\t\ts = s[i+1:]\n\t\t\tcontinue\n\t\t}\n\t\ti := 0\n\t\tfor i < len(s) && !isSpaceByte(s[i]) {\n\t\t\ti++\n\t\t}\n\t\tf = append(f, s[:i])\n\t\ts = s[i:]\n\t}\n\treturn f, nil\n}\n\n// Join joins a list of arguments into a string that can be parsed\n// with Split. Arguments are quoted only if necessary; arguments\n// without spaces or quotes are kept as-is. No argument may contain both\n// single and double quotes.\nfunc Join(args []string) (string, error) {\n\tvar buf []byte\n\tfor i, arg := range args {\n\t\tif i > 0 {\n\t\t\tbuf = append(buf, ' ')\n\t\t}\n\t\tvar sawSpace, sawSingleQuote, sawDoubleQuote bool\n\t\tfor _, c := range arg {\n\t\t\tswitch {\n\t\t\tcase c > unicode.MaxASCII:\n\t\t\t\tcontinue\n\t\t\tcase isSpaceByte(byte(c)):\n\t\t\t\tsawSpace = true\n\t\t\tcase c == '\\'':\n\t\t\t\tsawSingleQuote = true\n\t\t\tcase c == '\"':\n\t\t\t\tsawDoubleQuote = true\n\t\t\t}\n\t\t}\n\t\tswitch {\n\t\tcase !sawSpace && !sawSingleQuote && !sawDoubleQuote:\n\t\t\tbuf = append(buf, arg...)\n\n\t\tcase !sawSingleQuote:\n\t\t\tbuf = append(buf, '\\'')\n\t\t\tbuf = append(buf, arg...)\n\t\t\tbuf = append(buf, '\\'')\n\n\t\tcase !sawDoubleQuote:\n\t\t\tbuf = append(buf, '\"')\n\t\t\tbuf = append(buf, arg...)\n\t\t\tbuf = append(buf, '\"')\n\n\t\tdefault:\n\t\t\treturn \"\", fmt.Errorf(\"argument %q contains both single and double quotes and cannot be quoted\", arg)\n\t\t}\n\t}\n\treturn string(buf), nil\n}\n\n// A Flag parses a list of string arguments encoded with Join.\n// It is useful for flags like cmd/link's -extldflags.\ntype Flag []string\n\nvar _ flag.Value = (*Flag)(nil)\n\nfunc (f *Flag) Set(v string) error {\n\tfs, err := Split(v)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*f = fs[:len(fs):len(fs)]\n\treturn nil\n}\n\nfunc (f *Flag) String() string {\n\tif f == nil {\n\t\treturn \"\"\n\t}\n\ts, err := Join(*f)\n\tif err != nil {\n\t\treturn strings.Join(*f, \" \")\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "internal/go/quoted/quoted_test.go",
    "content": "// Copyright 2020 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage quoted\n\nimport (\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestSplit(t *testing.T) {\n\tfor _, test := range []struct {\n\t\tname    string\n\t\tvalue   string\n\t\twant    []string\n\t\twantErr string\n\t}{\n\t\t{name: \"empty\", value: \"\", want: nil},\n\t\t{name: \"space\", value: \" \", want: nil},\n\t\t{name: \"one\", value: \"a\", want: []string{\"a\"}},\n\t\t{name: \"leading_space\", value: \" a\", want: []string{\"a\"}},\n\t\t{name: \"trailing_space\", value: \"a \", want: []string{\"a\"}},\n\t\t{name: \"two\", value: \"a b\", want: []string{\"a\", \"b\"}},\n\t\t{name: \"two_multi_space\", value: \"a  b\", want: []string{\"a\", \"b\"}},\n\t\t{name: \"two_tab\", value: \"a\\tb\", want: []string{\"a\", \"b\"}},\n\t\t{name: \"two_newline\", value: \"a\\nb\", want: []string{\"a\", \"b\"}},\n\t\t{name: \"quote_single\", value: `'a b'`, want: []string{\"a b\"}},\n\t\t{name: \"quote_double\", value: `\"a b\"`, want: []string{\"a b\"}},\n\t\t{name: \"quote_both\", value: `'a '\"b \"`, want: []string{\"a \", \"b \"}},\n\t\t{name: \"quote_contains\", value: `'a \"'\"'b\"`, want: []string{`a \"`, `'b`}},\n\t\t{name: \"escape\", value: `\\'`, want: []string{`\\'`}},\n\t\t{name: \"quote_unclosed\", value: `'a`, wantErr: \"unterminated ' string\"},\n\t} {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tgot, err := Split(test.value)\n\t\t\tif err != nil {\n\t\t\t\tif test.wantErr == \"\" {\n\t\t\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t\t\t} else if errMsg := err.Error(); !strings.Contains(errMsg, test.wantErr) {\n\t\t\t\t\tt.Fatalf(\"error %q does not contain %q\", errMsg, test.wantErr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif test.wantErr != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected success; wanted error containing %q\", test.wantErr)\n\t\t\t}\n\t\t\tif !reflect.DeepEqual(got, test.want) {\n\t\t\t\tt.Errorf(\"got %q; want %q\", got, test.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestJoin(t *testing.T) {\n\tfor _, test := range []struct {\n\t\tname          string\n\t\targs          []string\n\t\twant, wantErr string\n\t}{\n\t\t{name: \"empty\", args: nil, want: \"\"},\n\t\t{name: \"one\", args: []string{\"a\"}, want: \"a\"},\n\t\t{name: \"two\", args: []string{\"a\", \"b\"}, want: \"a b\"},\n\t\t{name: \"space\", args: []string{\"a \", \"b\"}, want: \"'a ' b\"},\n\t\t{name: \"newline\", args: []string{\"a\\n\", \"b\"}, want: \"'a\\n' b\"},\n\t\t{name: \"quote\", args: []string{`'a `, \"b\"}, want: `\"'a \" b`},\n\t\t{name: \"unquoteable\", args: []string{`'\"`}, wantErr: \"contains both single and double quotes and cannot be quoted\"},\n\t} {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tgot, err := Join(test.args)\n\t\t\tif err != nil {\n\t\t\t\tif test.wantErr == \"\" {\n\t\t\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t\t\t} else if errMsg := err.Error(); !strings.Contains(errMsg, test.wantErr) {\n\t\t\t\t\tt.Fatalf(\"error %q does not contain %q\", errMsg, test.wantErr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif test.wantErr != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected success; wanted error containing %q\", test.wantErr)\n\t\t\t}\n\t\t\tif got != test.want {\n\t\t\t\tt.Errorf(\"got %s; want %s\", got, test.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/go/quoted/readme.md",
    "content": "# quoted\n\nExtracted from `go/src/cmd/internal/quoted/` (related to `cache`).\nThis is just a copy of the Go code without any changes.\n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync go1.24.1 (no change)\n- https://github.com/golangci/golangci-lint/pull/5100\n  - Move package from `internal/quoted` to `internal/go/quoted`\n- https://github.com/golangci/golangci-lint/pull/5098\n  - sync go1.23.2\n  - sync go1.22.8\n  - sync go1.21.13\n"
  },
  {
    "path": "internal/go/testenv/readme.md",
    "content": "# testenv\n\nExtracted from `go/src/internal/testenv/`.\n\nOnly the function `SyscallIsNotSupported` is extracted (related to `cache`).\n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync go1.24.1\n- https://github.com/golangci/golangci-lint/pull/5100\n  - Move package from `internal/testenv` to `internal/go/testenv`\n- https://github.com/golangci/golangci-lint/pull/5098\n  - sync with go1.23.2\n  - sync with go1.22.8\n  - sync with go1.21.13\n"
  },
  {
    "path": "internal/go/testenv/testenv.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package testenv provides information about what functionality\n// is available in different testing environments run by the Go team.\n//\n// It is an internal package because these details are specific\n// to the Go team's test setup (on build.golang.org) and not\n// fundamental to tests in general.\npackage testenv\n\n// SyscallIsNotSupported reports whether err may indicate that a system call is\n// not supported by the current platform or execution environment.\nfunc SyscallIsNotSupported(err error) bool {\n\treturn syscallIsNotSupported(err)\n}\n"
  },
  {
    "path": "internal/go/testenv/testenv_notunix.go",
    "content": "// Copyright 2021 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build windows || plan9 || (js && wasm) || wasip1\n\npackage testenv\n\nimport (\n\t\"errors\"\n\t\"io/fs\"\n\t\"os\"\n)\n\n// Sigquit is the signal to send to kill a hanging subprocess.\n// On Unix we send SIGQUIT, but on non-Unix we only have os.Kill.\nvar Sigquit = os.Kill\n\nfunc syscallIsNotSupported(err error) bool {\n\treturn errors.Is(err, fs.ErrPermission) || errors.Is(err, errors.ErrUnsupported)\n}\n"
  },
  {
    "path": "internal/go/testenv/testenv_notwin.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build !windows\n\npackage testenv\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sync\"\n)\n\nvar hasSymlink = sync.OnceValues(func() (ok bool, reason string) {\n\tswitch runtime.GOOS {\n\tcase \"plan9\":\n\t\treturn false, \"\"\n\tcase \"android\", \"wasip1\":\n\t\t// For wasip1, some runtimes forbid absolute symlinks,\n\t\t// or symlinks that escape the current working directory.\n\t\t// Perform a simple test to see whether the runtime\n\t\t// supports symlinks or not. If we get a permission\n\t\t// error, the runtime does not support symlinks.\n\t\tdir, err := os.MkdirTemp(\"\", \"\")\n\t\tif err != nil {\n\t\t\treturn false, \"\"\n\t\t}\n\t\tdefer func() {\n\t\t\t_ = os.RemoveAll(dir)\n\t\t}()\n\t\tfpath := filepath.Join(dir, \"testfile.txt\")\n\t\tif err := os.WriteFile(fpath, nil, 0644); err != nil {\n\t\t\treturn false, \"\"\n\t\t}\n\t\tif err := os.Symlink(fpath, filepath.Join(dir, \"testlink\")); err != nil {\n\t\t\tif SyscallIsNotSupported(err) {\n\t\t\t\treturn false, fmt.Sprintf(\"symlinks unsupported: %s\", err.Error())\n\t\t\t}\n\t\t\treturn false, \"\"\n\t\t}\n\t}\n\n\treturn true, \"\"\n})\n"
  },
  {
    "path": "internal/go/testenv/testenv_unix.go",
    "content": "// Copyright 2021 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage testenv\n\nimport (\n\t\"errors\"\n\t\"io/fs\"\n\t\"syscall\"\n)\n\n// Sigquit is the signal to send to kill a hanging subprocess.\n// Send SIGQUIT to get a stack trace.\nvar Sigquit = syscall.SIGQUIT\n\nfunc syscallIsNotSupported(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\n\tvar errno syscall.Errno\n\tif errors.As(err, &errno) {\n\t\tswitch errno {\n\t\tcase syscall.EPERM, syscall.EROFS:\n\t\t\t// User lacks permission: either the call requires root permission and the\n\t\t\t// user is not root, or the call is denied by a container security policy.\n\t\t\treturn true\n\t\tcase syscall.EINVAL:\n\t\t\t// Some containers return EINVAL instead of EPERM if a system call is\n\t\t\t// denied by security policy.\n\t\t\treturn true\n\t\t}\n\t}\n\n\tif errors.Is(err, fs.ErrPermission) || errors.Is(err, errors.ErrUnsupported) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "internal/go/testenv/testenv_windows.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage testenv\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"syscall\"\n)\n\nvar hasSymlink = sync.OnceValues(func() (bool, string) {\n\ttmpdir, err := os.MkdirTemp(\"\", \"symtest\")\n\tif err != nil {\n\t\tpanic(\"failed to create temp directory: \" + err.Error())\n\t}\n\tdefer os.RemoveAll(tmpdir)\n\n\terr = os.Symlink(\"target\", filepath.Join(tmpdir, \"symlink\"))\n\tswitch {\n\tcase err == nil:\n\t\treturn true, \"\"\n\tcase errors.Is(err, syscall.EWINDOWS):\n\t\treturn false, \": symlinks are not supported on your version of Windows\"\n\tcase errors.Is(err, syscall.ERROR_PRIVILEGE_NOT_HELD):\n\t\treturn false, \": you don't have enough privileges to create symlinks\"\n\t}\n\treturn false, \"\"\n})\n"
  },
  {
    "path": "internal/x/LICENSE",
    "content": "Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "internal/x/tools/diff/diff.go",
    "content": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package diff computes differences between text files or strings.\npackage diff\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n)\n\n// An Edit describes the replacement of a portion of a text file.\ntype Edit struct {\n\tStart, End int    // byte offsets of the region to replace\n\tNew        string // the replacement\n}\n\nfunc (e Edit) String() string {\n\treturn fmt.Sprintf(\"{Start:%d,End:%d,New:%q}\", e.Start, e.End, e.New)\n}\n\n// Apply applies a sequence of edits to the src buffer and returns the\n// result. Edits are applied in order of start offset; edits with the\n// same start offset are applied in they order they were provided.\n//\n// Apply returns an error if any edit is out of bounds,\n// or if any pair of edits is overlapping.\nfunc Apply(src string, edits []Edit) (string, error) {\n\tedits, size, err := validate(src, edits)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Apply edits.\n\tout := make([]byte, 0, size)\n\tlastEnd := 0\n\tfor _, edit := range edits {\n\t\tif lastEnd < edit.Start {\n\t\t\tout = append(out, src[lastEnd:edit.Start]...)\n\t\t}\n\t\tout = append(out, edit.New...)\n\t\tlastEnd = edit.End\n\t}\n\tout = append(out, src[lastEnd:]...)\n\n\tif len(out) != size {\n\t\tpanic(\"wrong size\")\n\t}\n\n\treturn string(out), nil\n}\n\n// ApplyBytes is like Apply, but it accepts a byte slice.\n// The result is always a new array.\nfunc ApplyBytes(src []byte, edits []Edit) ([]byte, error) {\n\tres, err := Apply(string(src), edits)\n\treturn []byte(res), err\n}\n\n// validate checks that edits are consistent with src,\n// and returns the size of the patched output.\n// It may return a different slice.\nfunc validate(src string, edits []Edit) ([]Edit, int, error) {\n\tif !sort.IsSorted(editsSort(edits)) {\n\t\tedits = slices.Clone(edits)\n\t\tSortEdits(edits)\n\t}\n\n\t// Check validity of edits and compute final size.\n\tsize := len(src)\n\tlastEnd := 0\n\tfor _, edit := range edits {\n\t\tif !(0 <= edit.Start && edit.Start <= edit.End && edit.End <= len(src)) {\n\t\t\treturn nil, 0, fmt.Errorf(\"diff has out-of-bounds edits\")\n\t\t}\n\t\tif edit.Start < lastEnd {\n\t\t\treturn nil, 0, fmt.Errorf(\"diff has overlapping edits\")\n\t\t}\n\t\tsize += len(edit.New) + edit.Start - edit.End\n\t\tlastEnd = edit.End\n\t}\n\n\treturn edits, size, nil\n}\n\n// SortEdits orders a slice of Edits by (start, end) offset.\n// This ordering puts insertions (end = start) before deletions\n// (end > start) at the same point, but uses a stable sort to preserve\n// the order of multiple insertions at the same point.\n// (Apply detects multiple deletions at the same point as an error.)\nfunc SortEdits(edits []Edit) {\n\tsort.Stable(editsSort(edits))\n}\n\ntype editsSort []Edit\n\nfunc (a editsSort) Len() int { return len(a) }\nfunc (a editsSort) Less(i, j int) bool {\n\tif cmp := a[i].Start - a[j].Start; cmp != 0 {\n\t\treturn cmp < 0\n\t}\n\treturn a[i].End < a[j].End\n}\nfunc (a editsSort) Swap(i, j int) { a[i], a[j] = a[j], a[i] }\n\n// lineEdits expands and merges a sequence of edits so that each\n// resulting edit replaces one or more complete lines.\n// See ApplyEdits for preconditions.\nfunc lineEdits(src string, edits []Edit) ([]Edit, error) {\n\tedits, _, err := validate(src, edits)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Do all deletions begin and end at the start of a line,\n\t// and all insertions end with a newline?\n\t// (This is merely a fast path.)\n\tfor _, edit := range edits {\n\t\tif edit.Start >= len(src) || // insertion at EOF\n\t\t\tedit.Start > 0 && src[edit.Start-1] != '\\n' || // not at line start\n\t\t\tedit.End > 0 && src[edit.End-1] != '\\n' || // not at line start\n\t\t\tedit.New != \"\" && edit.New[len(edit.New)-1] != '\\n' { // partial insert\n\t\t\tgoto expand // slow path\n\t\t}\n\t}\n\treturn edits, nil // aligned\n\nexpand:\n\tif len(edits) == 0 {\n\t\treturn edits, nil // no edits (unreachable due to fast path)\n\t}\n\texpanded := make([]Edit, 0, len(edits)) // a guess\n\tprev := edits[0]\n\t// TODO(adonovan): opt: start from the first misaligned edit.\n\t// TODO(adonovan): opt: avoid quadratic cost of string += string.\n\tfor _, edit := range edits[1:] {\n\t\tbetween := src[prev.End:edit.Start]\n\t\tif !strings.Contains(between, \"\\n\") {\n\t\t\t// overlapping lines: combine with previous edit.\n\t\t\tprev.New += between + edit.New\n\t\t\tprev.End = edit.End\n\t\t} else {\n\t\t\t// non-overlapping lines: flush previous edit.\n\t\t\texpanded = append(expanded, expandEdit(prev, src))\n\t\t\tprev = edit\n\t\t}\n\t}\n\treturn append(expanded, expandEdit(prev, src)), nil // flush final edit\n}\n\n// expandEdit returns edit expanded to complete whole lines.\nfunc expandEdit(edit Edit, src string) Edit {\n\t// Expand start left to start of line.\n\t// (delta is the zero-based column number of start.)\n\tstart := edit.Start\n\tif delta := start - 1 - strings.LastIndex(src[:start], \"\\n\"); delta > 0 {\n\t\tedit.Start -= delta\n\t\tedit.New = src[start-delta:start] + edit.New\n\t}\n\n\t// Expand end right to end of line.\n\tend := edit.End\n\tif end > 0 && src[end-1] != '\\n' ||\n\t\tedit.New != \"\" && edit.New[len(edit.New)-1] != '\\n' {\n\t\tif nl := strings.IndexByte(src[end:], '\\n'); nl < 0 {\n\t\t\tedit.End = len(src) // extend to EOF\n\t\t} else {\n\t\t\tedit.End = end + nl + 1 // extend beyond \\n\n\t\t}\n\t}\n\tedit.New += src[end:edit.End]\n\n\treturn edit\n}\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/common.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage lcs\n\nimport (\n\t\"log\"\n\t\"sort\"\n)\n\n// lcs is a longest common sequence\ntype lcs []diag\n\n// A diag is a piece of the edit graph where A[X+i] == B[Y+i], for 0<=i<Len.\n// All computed diagonals are parts of a longest common subsequence.\ntype diag struct {\n\tX, Y int\n\tLen  int\n}\n\n// sort sorts in place, by lowest X, and if tied, inversely by Len\nfunc (l lcs) sort() lcs {\n\tsort.Slice(l, func(i, j int) bool {\n\t\tif l[i].X != l[j].X {\n\t\t\treturn l[i].X < l[j].X\n\t\t}\n\t\treturn l[i].Len > l[j].Len\n\t})\n\treturn l\n}\n\n// validate that the elements of the lcs do not overlap\n// (can only happen when the two-sided algorithm ends early)\n// expects the lcs to be sorted\nfunc (l lcs) valid() bool {\n\tfor i := 1; i < len(l); i++ {\n\t\tif l[i-1].X+l[i-1].Len > l[i].X {\n\t\t\treturn false\n\t\t}\n\t\tif l[i-1].Y+l[i-1].Len > l[i].Y {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// repair overlapping lcs\n// only called if two-sided stops early\nfunc (l lcs) fix() lcs {\n\t// from the set of diagonals in l, find a maximal non-conflicting set\n\t// this problem may be NP-complete, but we use a greedy heuristic,\n\t// which is quadratic, but with a better data structure, could be D log D.\n\t// independent is not enough: {0,3,1} and {3,0,2} can't both occur in an lcs\n\t// which has to have monotone x and y\n\tif len(l) == 0 {\n\t\treturn nil\n\t}\n\tsort.Slice(l, func(i, j int) bool { return l[i].Len > l[j].Len })\n\ttmp := make(lcs, 0, len(l))\n\ttmp = append(tmp, l[0])\n\tfor i := 1; i < len(l); i++ {\n\t\tvar dir direction\n\t\tnxt := l[i]\n\t\tfor _, in := range tmp {\n\t\t\tif dir, nxt = overlap(in, nxt); dir == empty || dir == bad {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif nxt.Len > 0 && dir != bad {\n\t\t\ttmp = append(tmp, nxt)\n\t\t}\n\t}\n\ttmp.sort()\n\tif false && !tmp.valid() { // debug checking\n\t\tlog.Fatalf(\"here %d\", len(tmp))\n\t}\n\treturn tmp\n}\n\ntype direction int\n\nconst (\n\tempty    direction = iota // diag is empty (so not in lcs)\n\tleftdown                  // proposed acceptably to the left and below\n\trightup                   // proposed diag is acceptably to the right and above\n\tbad                       // proposed diag is inconsistent with the lcs so far\n)\n\n// overlap trims the proposed diag prop  so it doesn't overlap with\n// the existing diag that has already been added to the lcs.\nfunc overlap(exist, prop diag) (direction, diag) {\n\tif prop.X <= exist.X && exist.X < prop.X+prop.Len {\n\t\t// remove the end of prop where it overlaps with the X end of exist\n\t\tdelta := prop.X + prop.Len - exist.X\n\t\tprop.Len -= delta\n\t\tif prop.Len <= 0 {\n\t\t\treturn empty, prop\n\t\t}\n\t}\n\tif exist.X <= prop.X && prop.X < exist.X+exist.Len {\n\t\t// remove the beginning of prop where overlaps with exist\n\t\tdelta := exist.X + exist.Len - prop.X\n\t\tprop.Len -= delta\n\t\tif prop.Len <= 0 {\n\t\t\treturn empty, prop\n\t\t}\n\t\tprop.X += delta\n\t\tprop.Y += delta\n\t}\n\tif prop.Y <= exist.Y && exist.Y < prop.Y+prop.Len {\n\t\t// remove the end of prop that overlaps (in Y) with exist\n\t\tdelta := prop.Y + prop.Len - exist.Y\n\t\tprop.Len -= delta\n\t\tif prop.Len <= 0 {\n\t\t\treturn empty, prop\n\t\t}\n\t}\n\tif exist.Y <= prop.Y && prop.Y < exist.Y+exist.Len {\n\t\t// remove the beginning of peop that overlaps with exist\n\t\tdelta := exist.Y + exist.Len - prop.Y\n\t\tprop.Len -= delta\n\t\tif prop.Len <= 0 {\n\t\t\treturn empty, prop\n\t\t}\n\t\tprop.X += delta // no test reaches this code\n\t\tprop.Y += delta\n\t}\n\tif prop.X+prop.Len <= exist.X && prop.Y+prop.Len <= exist.Y {\n\t\treturn leftdown, prop\n\t}\n\tif exist.X+exist.Len <= prop.X && exist.Y+exist.Len <= prop.Y {\n\t\treturn rightup, prop\n\t}\n\t// prop can't be in an lcs that contains exist\n\treturn bad, prop\n}\n\n// manipulating Diag and lcs\n\n// prepend a diagonal (x,y)-(x+1,y+1) segment either to an empty lcs\n// or to its first Diag. prepend is only called to extend diagonals\n// the backward direction.\nfunc (lcs lcs) prepend(x, y int) lcs {\n\tif len(lcs) > 0 {\n\t\td := &lcs[0]\n\t\tif int(d.X) == x+1 && int(d.Y) == y+1 {\n\t\t\t// extend the diagonal down and to the left\n\t\t\td.X, d.Y = int(x), int(y)\n\t\t\td.Len++\n\t\t\treturn lcs\n\t\t}\n\t}\n\n\tr := diag{X: int(x), Y: int(y), Len: 1}\n\tlcs = append([]diag{r}, lcs...)\n\treturn lcs\n}\n\n// append appends a diagonal, or extends the existing one.\n// by adding the edge (x,y)-(x+1.y+1). append is only called\n// to extend diagonals in the forward direction.\nfunc (lcs lcs) append(x, y int) lcs {\n\tif len(lcs) > 0 {\n\t\tlast := &lcs[len(lcs)-1]\n\t\t// Expand last element if adjoining.\n\t\tif last.X+last.Len == x && last.Y+last.Len == y {\n\t\t\tlast.Len++\n\t\t\treturn lcs\n\t\t}\n\t}\n\n\treturn append(lcs, diag{X: x, Y: y, Len: 1})\n}\n\n// enforce constraint on d, k\nfunc ok(d, k int) bool {\n\treturn d >= 0 && -d <= k && k <= d\n}\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/common_test.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage lcs\n\nimport (\n\t\"log\"\n\t\"math/rand/v2\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n)\n\ntype Btest struct {\n\ta, b string\n\tlcs  []string\n}\n\nvar Btests = []Btest{\n\t{\"aaabab\", \"abaab\", []string{\"abab\", \"aaab\"}},\n\t{\"aabbba\", \"baaba\", []string{\"aaba\"}},\n\t{\"cabbx\", \"cbabx\", []string{\"cabx\", \"cbbx\"}},\n\t{\"c\", \"cb\", []string{\"c\"}},\n\t{\"aaba\", \"bbb\", []string{\"b\"}},\n\t{\"bbaabb\", \"b\", []string{\"b\"}},\n\t{\"baaabb\", \"bbaba\", []string{\"bbb\", \"baa\", \"bab\"}},\n\t{\"baaabb\", \"abbab\", []string{\"abb\", \"bab\", \"aab\"}},\n\t{\"baaba\", \"aaabba\", []string{\"aaba\"}},\n\t{\"ca\", \"cba\", []string{\"ca\"}},\n\t{\"ccbcbc\", \"abba\", []string{\"bb\"}},\n\t{\"ccbcbc\", \"aabba\", []string{\"bb\"}},\n\t{\"ccb\", \"cba\", []string{\"cb\"}},\n\t{\"caef\", \"axe\", []string{\"ae\"}},\n\t{\"bbaabb\", \"baabb\", []string{\"baabb\"}},\n\t// Example from Myers:\n\t{\"abcabba\", \"cbabac\", []string{\"caba\", \"baba\", \"cbba\"}},\n\t{\"3456aaa\", \"aaa\", []string{\"aaa\"}},\n\t{\"aaa\", \"aaa123\", []string{\"aaa\"}},\n\t{\"aabaa\", \"aacaa\", []string{\"aaaa\"}},\n\t{\"1a\", \"a\", []string{\"a\"}},\n\t{\"abab\", \"bb\", []string{\"bb\"}},\n\t{\"123\", \"ab\", []string{\"\"}},\n\t{\"a\", \"b\", []string{\"\"}},\n\t{\"abc\", \"123\", []string{\"\"}},\n\t{\"aa\", \"aa\", []string{\"aa\"}},\n\t{\"abcde\", \"12345\", []string{\"\"}},\n\t{\"aaa3456\", \"aaa\", []string{\"aaa\"}},\n\t{\"abcde\", \"12345a\", []string{\"a\"}},\n\t{\"ab\", \"123\", []string{\"\"}},\n\t{\"1a2\", \"a\", []string{\"a\"}},\n\t// for two-sided\n\t{\"babaab\", \"cccaba\", []string{\"aba\"}},\n\t{\"aabbab\", \"cbcabc\", []string{\"bab\"}},\n\t{\"abaabb\", \"bcacab\", []string{\"baab\"}},\n\t{\"abaabb\", \"abaaaa\", []string{\"abaa\"}},\n\t{\"bababb\", \"baaabb\", []string{\"baabb\"}},\n\t{\"abbbaa\", \"cabacc\", []string{\"aba\"}},\n\t{\"aabbaa\", \"aacaba\", []string{\"aaaa\", \"aaba\"}},\n}\n\nfunc init() {\n\tlog.SetFlags(log.Lshortfile)\n}\n\nfunc check(t *testing.T, str string, lcs lcs, want []string) {\n\tt.Helper()\n\tif !lcs.valid() {\n\t\tt.Errorf(\"bad lcs %v\", lcs)\n\t}\n\tvar got strings.Builder\n\tfor _, dd := range lcs {\n\t\tgot.WriteString(str[dd.X : dd.X+dd.Len])\n\t}\n\tans := got.String()\n\tif slices.Contains(want, ans) {\n\t\treturn\n\t}\n\tt.Fatalf(\"str=%q lcs=%v want=%q got=%q\", str, lcs, want, ans)\n}\n\nfunc checkDiffs(t *testing.T, before string, diffs []Diff, after string) {\n\tt.Helper()\n\tvar ans strings.Builder\n\tsofar := 0 // index of position in before\n\tfor _, d := range diffs {\n\t\tif sofar < d.Start {\n\t\t\tans.WriteString(before[sofar:d.Start])\n\t\t}\n\t\tans.WriteString(after[d.ReplStart:d.ReplEnd])\n\t\tsofar = d.End\n\t}\n\tans.WriteString(before[sofar:])\n\tif ans.String() != after {\n\t\tt.Fatalf(\"diff %v took %q to %q, not to %q\", diffs, before, ans.String(), after)\n\t}\n}\n\nfunc lcslen(l lcs) int {\n\tans := 0\n\tfor _, d := range l {\n\t\tans += int(d.Len)\n\t}\n\treturn ans\n}\n\n// return a random string of length n made of characters from s\nfunc randstr(rng *rand.Rand, s string, n int) string {\n\tsrc := []rune(s)\n\tx := make([]rune, n)\n\tfor i := range n {\n\t\tx[i] = src[rng.Int64N(int64(len(src)))]\n\t}\n\treturn string(x)\n}\n\nfunc TestLcsFix(t *testing.T) {\n\ttests := []struct{ before, after lcs }{\n\t\t{lcs{diag{0, 0, 3}, diag{2, 2, 5}, diag{3, 4, 5}, diag{8, 9, 4}}, lcs{diag{0, 0, 2}, diag{2, 2, 1}, diag{3, 4, 5}, diag{8, 9, 4}}},\n\t\t{lcs{diag{1, 1, 6}, diag{6, 12, 3}}, lcs{diag{1, 1, 5}, diag{6, 12, 3}}},\n\t\t{lcs{diag{0, 0, 4}, diag{3, 5, 4}}, lcs{diag{0, 0, 3}, diag{3, 5, 4}}},\n\t\t{lcs{diag{0, 20, 1}, diag{0, 0, 3}, diag{1, 20, 4}}, lcs{diag{0, 0, 3}, diag{3, 22, 2}}},\n\t\t{lcs{diag{0, 0, 4}, diag{1, 1, 2}}, lcs{diag{0, 0, 4}}},\n\t\t{lcs{diag{0, 0, 4}}, lcs{diag{0, 0, 4}}},\n\t\t{lcs{}, lcs{}},\n\t\t{lcs{diag{0, 0, 4}, diag{1, 1, 6}, diag{3, 3, 2}}, lcs{diag{0, 0, 1}, diag{1, 1, 6}}},\n\t}\n\tfor n, x := range tests {\n\t\tgot := x.before.fix()\n\t\tif len(got) != len(x.after) {\n\t\t\tt.Errorf(\"got %v, expected %v, for %v\", got, x.after, x.before)\n\t\t}\n\t\tolen := lcslen(x.after)\n\t\tglen := lcslen(got)\n\t\tif olen != glen {\n\t\t\tt.Errorf(\"%d: lens(%d,%d) differ, %v, %v, %v\", n, glen, olen, got, x.after, x.before)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/doc.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// package lcs contains code to find longest-common-subsequences\n// (and diffs)\npackage lcs\n\n/*\nCompute longest-common-subsequences of two slices A, B using\nalgorithms from Myers' paper. A longest-common-subsequence\n(LCS from now on) of A and B is a maximal set of lexically increasing\npairs of subscripts (x,y) with A[x]==B[y]. There may be many LCS, but\nthey all have the same length. An LCS determines a sequence of edits\nthat changes A into B.\n\nThe key concept is the edit graph of A and B.\nIf A has length N and B has length M, then the edit graph has\nvertices v[i][j] for 0 <= i <= N, 0 <= j <= M. There is a\nhorizontal edge from v[i][j] to v[i+1][j] whenever both are in\nthe graph, and a vertical edge from v[i][j] to f[i][j+1] similarly.\nWhen A[i] == B[j] there is a diagonal edge from v[i][j] to v[i+1][j+1].\n\nA path between in the graph between (0,0) and (N,M) determines a sequence\nof edits converting A into B: each horizontal edge corresponds to removing\nan element of A, and each vertical edge corresponds to inserting an\nelement of B.\n\nA vertex (x,y) is on (forward) diagonal k if x-y=k. A path in the graph\nis of length D if it has D non-diagonal edges. The algorithms generate\nforward paths (in which at least one of x,y increases at each edge),\nor backward paths (in which at least one of x,y decreases at each edge),\nor a combination. (Note that the orientation is the traditional mathematical one,\nwith the origin in the lower-left corner.)\n\nHere is the edit graph for A:\"aabbaa\", B:\"aacaba\". (I know the diagonals look weird.)\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n   b      |             |             |   ___/‾‾‾   |   ___/‾‾‾   |             |             |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n   c      |             |             |             |             |             |             |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n                 a             a             b             b             a             a\n\n\nThe algorithm labels a vertex (x,y) with D,k if it is on diagonal k and at\nthe end of a maximal path of length D. (Because x-y=k it suffices to remember\nonly the x coordinate of the vertex.)\n\nThe forward algorithm: Find the longest diagonal starting at (0,0) and\nlabel its end with D=0,k=0. From that vertex take a vertical step and\nthen follow the longest diagonal (up and to the right), and label that vertex\nwith D=1,k=-1. From the D=0,k=0 point take a horizontal step and the follow\nthe longest diagonal (up and to the right) and label that vertex\nD=1,k=1. In the same way, having labelled all the D vertices,\nfrom a vertex labelled D,k find two vertices\ntentatively labelled D+1,k-1 and D+1,k+1. There may be two on the same\ndiagonal, in which case take the one with the larger x.\n\nEventually the path gets to (N,M), and the diagonals on it are the LCS.\n\nHere is the edit graph with the ends of D-paths labelled. (So, for instance,\n0/2,2 indicates that x=2,y=2 is labelled with 0, as it should be, since the first\nstep is to go up the longest diagonal from (0,0).)\nA:\"aabbaa\", B:\"aacaba\"\n          ⊙   -------   ⊙   -------   ⊙   -------(3/3,6)-------   ⊙   -------(3/5,6)-------(4/6,6)\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------   ⊙   -------(2/3,5)-------   ⊙   -------   ⊙   -------   ⊙\n   b      |             |             |   ___/‾‾‾   |   ___/‾‾‾   |             |             |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------(3/5,4)-------   ⊙\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------(1/2,3)-------(2/3,3)-------   ⊙   -------   ⊙   -------   ⊙\n   c      |             |             |             |             |             |             |\n          ⊙   -------   ⊙   -------(0/2,2)-------(1/3,2)-------(2/4,2)-------(3/5,2)-------(4/6,2)\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n   a      |   ___/‾‾‾   |   ___/‾‾‾   |             |             |   ___/‾‾‾   |   ___/‾‾‾   |\n          ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙   -------   ⊙\n                 a             a             b             b             a             a\n\nThe 4-path is reconstructed starting at (4/6,6), horizontal to (3/5,6), diagonal to (3,4), vertical\nto (2/3,3), horizontal to (1/2,3), vertical to (0/2,2), and diagonal to (0,0). As expected,\nthere are 4 non-diagonal steps, and the diagonals form an LCS.\n\nThere is a symmetric backward algorithm, which gives (backwards labels are prefixed with a colon):\nA:\"aabbaa\", B:\"aacaba\"\n            ⊙   --------    ⊙   --------    ⊙   --------    ⊙   --------    ⊙   --------    ⊙   --------    ⊙\n    a       |   ____/‾‾‾    |   ____/‾‾‾    |               |               |   ____/‾‾‾    |   ____/‾‾‾    |\n            ⊙   --------    ⊙   --------    ⊙   --------    ⊙   --------    ⊙   --------(:0/5,5)--------    ⊙\n    b       |               |               |   ____/‾‾‾    |   ____/‾‾‾    |               |               |\n            ⊙   --------    ⊙   --------    ⊙   --------(:1/3,4)--------    ⊙   --------    ⊙   --------    ⊙\n    a       |   ____/‾‾‾    |   ____/‾‾‾    |               |               |   ____/‾‾‾    |   ____/‾‾‾    |\n        (:3/0,3)--------(:2/1,3)--------    ⊙   --------(:2/3,3)--------(:1/4,3)--------    ⊙   --------    ⊙\n    c       |               |               |               |               |               |               |\n            ⊙   --------    ⊙   --------    ⊙   --------(:3/3,2)--------(:2/4,2)--------    ⊙   --------    ⊙\n    a       |   ____/‾‾‾    |   ____/‾‾‾    |               |               |   ____/‾‾‾    |   ____/‾‾‾    |\n        (:3/0,1)--------    ⊙   --------    ⊙   --------    ⊙   --------(:3/4,1)--------    ⊙   --------    ⊙\n    a       |   ____/‾‾‾    |   ____/‾‾‾    |               |               |   ____/‾‾‾    |   ____/‾‾‾    |\n        (:4/0,0)--------    ⊙   --------    ⊙   --------    ⊙   --------(:4/4,0)--------    ⊙   --------    ⊙\n                    a               a               b               b               a               a\n\nNeither of these is ideal for use in an editor, where it is undesirable to send very long diffs to the\nfront end. It's tricky to decide exactly what 'very long diffs' means, as \"replace A by B\" is very short.\nWe want to control how big D can be, by stopping when it gets too large. The forward algorithm then\nprivileges common prefixes, and the backward algorithm privileges common suffixes. Either is an undesirable\nasymmetry.\n\nFortunately there is a two-sided algorithm, implied by results in Myers' paper. Here's what the labels in\nthe edit graph look like.\nA:\"aabbaa\", B:\"aacaba\"\n             ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙\n    a        |    ____/‾‾‾‾    |    ____/‾‾‾‾    |                 |                 |    ____/‾‾‾‾    |    ____/‾‾‾‾    |\n             ⊙    ---------    ⊙    ---------    ⊙    --------- (2/3,5) ---------    ⊙    --------- (:0/5,5)---------    ⊙\n    b        |                 |                 |    ____/‾‾‾‾    |    ____/‾‾‾‾    |                 |                 |\n             ⊙    ---------    ⊙    ---------    ⊙    --------- (:1/3,4)---------    ⊙    ---------    ⊙    ---------    ⊙\n    a        |    ____/‾‾‾‾    |    ____/‾‾‾‾    |                 |                 |    ____/‾‾‾‾    |    ____/‾‾‾‾    |\n             ⊙    --------- (:2/1,3)--------- (1/2,3) ---------(2:2/3,3)--------- (:1/4,3)---------    ⊙    ---------    ⊙\n    c        |                 |                 |                 |                 |                 |                 |\n             ⊙    ---------    ⊙    --------- (0/2,2) --------- (1/3,2) ---------(2:2/4,2)---------    ⊙    ---------    ⊙\n    a        |    ____/‾‾‾‾    |    ____/‾‾‾‾    |                 |                 |    ____/‾‾‾‾    |    ____/‾‾‾‾    |\n             ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙\n    a        |    ____/‾‾‾‾    |    ____/‾‾‾‾    |                 |                 |    ____/‾‾‾‾    |    ____/‾‾‾‾    |\n             ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙    ---------    ⊙\n                      a                 a                 b                 b                 a                 a\n\nThe algorithm stopped when it saw the backwards 2-path ending at (1,3) and the forwards 2-path ending at (3,5). The criterion\nis a backwards path ending at (u,v) and a forward path ending at (x,y), where u <= x and the two points are on the same\ndiagonal. (Here the edgegraph has a diagonal, but the criterion is x-y=u-v.) Myers proves there is a forward\n2-path from (0,0) to (1,3), and that together with the backwards 2-path ending at (1,3) gives the expected 4-path.\nUnfortunately the forward path has to be constructed by another run of the forward algorithm; it can't be found from the\ncomputed labels. That is the worst case. Had the code noticed (x,y)=(u,v)=(3,3) the whole path could be reconstructed\nfrom the edgegraph. The implementation looks for a number of special cases to try to avoid computing an extra forward path.\n\nIf the two-sided algorithm has stop early (because D has become too large) it will have found a forward LCS and a\nbackwards LCS. Ideally these go with disjoint prefixes and suffixes of A and B, but disjointedness may fail and the two\ncomputed LCS may conflict. (An easy example is where A is a suffix of B, and shares a short prefix. The backwards LCS\nis all of A, and the forward LCS is a prefix of A.) The algorithm combines the two\nto form a best-effort LCS. In the worst case the forward partial LCS may have to\nbe recomputed.\n*/\n\n/* Eugene Myers paper is titled\n\"An O(ND) Difference Algorithm and Its Variations\"\nand can be found at\nhttp://www.xmailserver.org/diff2.pdf\n\n(There is a generic implementation of the algorithm the repository with git hash\nb9ad7e4ade3a686d608e44475390ad428e60e7fc)\n*/\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/git.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2022 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n#\n# Creates a zip file containing all numbered versions\n# of the commit history of a large source file, for use\n# as input data for the tests of the diff algorithm.\n#\n# Run script from root of the x/tools repo.\n\nset -eu\n\n# WARNING: This script will install the latest version of $file\n# The largest real source file in the x/tools repo.\n# file=internal/golang/completion/completion.go\n# file=internal/golang/diagnostics.go\nfile=internal/protocol/tsprotocol.go\n\ntmp=$(mktemp -d)\ngit log $file |\n  awk '/^commit / {print $2}' |\n  nl -ba -nrz |\n  while read n hash; do\n    git checkout --quiet $hash $file\n    cp -f $file $tmp/$n\n  done\n(cd $tmp && zip -q - *) > testdata.zip\nrm -fr $tmp\ngit restore --staged $file\ngit restore $file\necho \"Created testdata.zip\"\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/labels.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage lcs\n\nimport (\n\t\"fmt\"\n)\n\n// For each D, vec[D] has length D+1,\n// and the label for (D, k) is stored in vec[D][(D+k)/2].\ntype label struct {\n\tvec [][]int\n}\n\n// Temporary checking DO NOT COMMIT true TO PRODUCTION CODE\nconst debug = false\n\n// debugging. check that the (d,k) pair is valid\n// (that is, -d<=k<=d and d+k even)\nfunc checkDK(D, k int) {\n\tif k >= -D && k <= D && (D+k)%2 == 0 {\n\t\treturn\n\t}\n\tpanic(fmt.Sprintf(\"out of range, d=%d,k=%d\", D, k))\n}\n\nfunc (t *label) set(D, k, x int) {\n\tif debug {\n\t\tcheckDK(D, k)\n\t}\n\tfor len(t.vec) <= D {\n\t\tt.vec = append(t.vec, nil)\n\t}\n\tif t.vec[D] == nil {\n\t\tt.vec[D] = make([]int, D+1)\n\t}\n\tt.vec[D][(D+k)/2] = x // known that D+k is even\n}\n\nfunc (t *label) get(d, k int) int {\n\tif debug {\n\t\tcheckDK(d, k)\n\t}\n\treturn int(t.vec[d][(d+k)/2])\n}\n\nfunc newtriang(limit int) label {\n\tif limit < 100 {\n\t\t// Preallocate if limit is not large.\n\t\treturn label{vec: make([][]int, limit)}\n\t}\n\treturn label{}\n}\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/old.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage lcs\n\n// TODO(adonovan): remove unclear references to \"old\" in this package.\n\nimport (\n\t\"fmt\"\n)\n\n// A Diff is a replacement of a portion of A by a portion of B.\ntype Diff struct {\n\tStart, End         int // offsets of portion to delete in A\n\tReplStart, ReplEnd int // offset of replacement text in B\n}\n\n// DiffStrings returns the differences between two strings.\n// It does not respect rune boundaries.\nfunc DiffStrings(a, b string) []Diff { return diff(stringSeqs{a, b}) }\n\n// DiffBytes returns the differences between two byte sequences.\n// It does not respect rune boundaries.\nfunc DiffBytes(a, b []byte) []Diff { return diff(bytesSeqs{a, b}) }\n\n// DiffRunes returns the differences between two rune sequences.\nfunc DiffRunes(a, b []rune) []Diff { return diff(runesSeqs{a, b}) }\n\nfunc diff(seqs sequences) []Diff {\n\t// A limit on how deeply the LCS algorithm should search. The value is just a guess.\n\tconst maxDiffs = 100\n\tdiff, _ := compute(seqs, twosided, maxDiffs/2)\n\treturn diff\n}\n\n// compute computes the list of differences between two sequences,\n// along with the LCS. It is exercised directly by tests.\n// The algorithm is one of {forward, backward, twosided}.\nfunc compute(seqs sequences, algo func(*editGraph) lcs, limit int) ([]Diff, lcs) {\n\tif limit <= 0 {\n\t\tlimit = 1 << 25 // effectively infinity\n\t}\n\talen, blen := seqs.lengths()\n\tg := &editGraph{\n\t\tseqs:  seqs,\n\t\tvf:    newtriang(limit),\n\t\tvb:    newtriang(limit),\n\t\tlimit: limit,\n\t\tux:    alen,\n\t\tuy:    blen,\n\t\tdelta: alen - blen,\n\t}\n\tlcs := algo(g)\n\tdiffs := lcs.toDiffs(alen, blen)\n\treturn diffs, lcs\n}\n\n// editGraph carries the information for computing the lcs of two sequences.\ntype editGraph struct {\n\tseqs   sequences\n\tvf, vb label // forward and backward labels\n\n\tlimit int // maximal value of D\n\t// the bounding rectangle of the current edit graph\n\tlx, ly, ux, uy int\n\tdelta          int // common subexpression: (ux-lx)-(uy-ly)\n}\n\n// toDiffs converts an LCS to a list of edits.\nfunc (lcs lcs) toDiffs(alen, blen int) []Diff {\n\tvar diffs []Diff\n\tvar pa, pb int // offsets in a, b\n\tfor _, l := range lcs {\n\t\tif pa < l.X || pb < l.Y {\n\t\t\tdiffs = append(diffs, Diff{pa, l.X, pb, l.Y})\n\t\t}\n\t\tpa = l.X + l.Len\n\t\tpb = l.Y + l.Len\n\t}\n\tif pa < alen || pb < blen {\n\t\tdiffs = append(diffs, Diff{pa, alen, pb, blen})\n\t}\n\treturn diffs\n}\n\n// --- FORWARD ---\n\n// fdone decides if the forward path has reached the upper right\n// corner of the rectangle. If so, it also returns the computed lcs.\nfunc (e *editGraph) fdone(D, k int) (bool, lcs) {\n\t// x, y, k are relative to the rectangle\n\tx := e.vf.get(D, k)\n\ty := x - k\n\tif x == e.ux && y == e.uy {\n\t\treturn true, e.forwardlcs(D, k)\n\t}\n\treturn false, nil\n}\n\n// run the forward algorithm, until success or up to the limit on D.\nfunc forward(e *editGraph) lcs {\n\te.setForward(0, 0, e.lx)\n\tif ok, ans := e.fdone(0, 0); ok {\n\t\treturn ans\n\t}\n\t// from D to D+1\n\tfor D := range e.limit {\n\t\te.setForward(D+1, -(D + 1), e.getForward(D, -D))\n\t\tif ok, ans := e.fdone(D+1, -(D + 1)); ok {\n\t\t\treturn ans\n\t\t}\n\t\te.setForward(D+1, D+1, e.getForward(D, D)+1)\n\t\tif ok, ans := e.fdone(D+1, D+1); ok {\n\t\t\treturn ans\n\t\t}\n\t\tfor k := -D + 1; k <= D-1; k += 2 {\n\t\t\t// these are tricky and easy to get backwards\n\t\t\tlookv := e.lookForward(k, e.getForward(D, k-1)+1)\n\t\t\tlookh := e.lookForward(k, e.getForward(D, k+1))\n\t\t\tif lookv > lookh {\n\t\t\t\te.setForward(D+1, k, lookv)\n\t\t\t} else {\n\t\t\t\te.setForward(D+1, k, lookh)\n\t\t\t}\n\t\t\tif ok, ans := e.fdone(D+1, k); ok {\n\t\t\t\treturn ans\n\t\t\t}\n\t\t}\n\t}\n\t// D is too large\n\t// find the D path with maximal x+y inside the rectangle and\n\t// use that to compute the found part of the lcs\n\tkmax := -e.limit - 1\n\tdiagmax := -1\n\tfor k := -e.limit; k <= e.limit; k += 2 {\n\t\tx := e.getForward(e.limit, k)\n\t\ty := x - k\n\t\tif x+y > diagmax && x <= e.ux && y <= e.uy {\n\t\t\tdiagmax, kmax = x+y, k\n\t\t}\n\t}\n\treturn e.forwardlcs(e.limit, kmax)\n}\n\n// recover the lcs by backtracking from the farthest point reached\nfunc (e *editGraph) forwardlcs(D, k int) lcs {\n\tvar ans lcs\n\tfor x := e.getForward(D, k); x != 0 || x-k != 0; {\n\t\tif ok(D-1, k-1) && x-1 == e.getForward(D-1, k-1) {\n\t\t\t// if (x-1,y) is labelled D-1, x--,D--,k--,continue\n\t\t\tD, k, x = D-1, k-1, x-1\n\t\t\tcontinue\n\t\t} else if ok(D-1, k+1) && x == e.getForward(D-1, k+1) {\n\t\t\t// if (x,y-1) is labelled D-1, x, D--,k++, continue\n\t\t\tD, k = D-1, k+1\n\t\t\tcontinue\n\t\t}\n\t\t// if (x-1,y-1)--(x,y) is a diagonal, prepend,x--,y--, continue\n\t\ty := x - k\n\t\tans = ans.prepend(x+e.lx-1, y+e.ly-1)\n\t\tx--\n\t}\n\treturn ans\n}\n\n// start at (x,y), go up the diagonal as far as possible,\n// and label the result with d\nfunc (e *editGraph) lookForward(k, relx int) int {\n\trely := relx - k\n\tx, y := relx+e.lx, rely+e.ly\n\tif x < e.ux && y < e.uy {\n\t\tx += e.seqs.commonPrefixLen(x, e.ux, y, e.uy)\n\t}\n\treturn x\n}\n\nfunc (e *editGraph) setForward(d, k, relx int) {\n\tx := e.lookForward(k, relx)\n\te.vf.set(d, k, x-e.lx)\n}\n\nfunc (e *editGraph) getForward(d, k int) int {\n\tx := e.vf.get(d, k)\n\treturn x\n}\n\n// --- BACKWARD ---\n\n// bdone decides if the backward path has reached the lower left corner\nfunc (e *editGraph) bdone(D, k int) (bool, lcs) {\n\t// x, y, k are relative to the rectangle\n\tx := e.vb.get(D, k)\n\ty := x - (k + e.delta)\n\tif x == 0 && y == 0 {\n\t\treturn true, e.backwardlcs(D, k)\n\t}\n\treturn false, nil\n}\n\n// run the backward algorithm, until success or up to the limit on D.\n// (used only by tests)\nfunc backward(e *editGraph) lcs {\n\te.setBackward(0, 0, e.ux)\n\tif ok, ans := e.bdone(0, 0); ok {\n\t\treturn ans\n\t}\n\t// from D to D+1\n\tfor D := range e.limit {\n\t\te.setBackward(D+1, -(D + 1), e.getBackward(D, -D)-1)\n\t\tif ok, ans := e.bdone(D+1, -(D + 1)); ok {\n\t\t\treturn ans\n\t\t}\n\t\te.setBackward(D+1, D+1, e.getBackward(D, D))\n\t\tif ok, ans := e.bdone(D+1, D+1); ok {\n\t\t\treturn ans\n\t\t}\n\t\tfor k := -D + 1; k <= D-1; k += 2 {\n\t\t\t// these are tricky and easy to get wrong\n\t\t\tlookv := e.lookBackward(k, e.getBackward(D, k-1))\n\t\t\tlookh := e.lookBackward(k, e.getBackward(D, k+1)-1)\n\t\t\tif lookv < lookh {\n\t\t\t\te.setBackward(D+1, k, lookv)\n\t\t\t} else {\n\t\t\t\te.setBackward(D+1, k, lookh)\n\t\t\t}\n\t\t\tif ok, ans := e.bdone(D+1, k); ok {\n\t\t\t\treturn ans\n\t\t\t}\n\t\t}\n\t}\n\n\t// D is too large\n\t// find the D path with minimal x+y inside the rectangle and\n\t// use that to compute the part of the lcs found\n\tkmax := -e.limit - 1\n\tdiagmin := 1 << 25\n\tfor k := -e.limit; k <= e.limit; k += 2 {\n\t\tx := e.getBackward(e.limit, k)\n\t\ty := x - (k + e.delta)\n\t\tif x+y < diagmin && x >= 0 && y >= 0 {\n\t\t\tdiagmin, kmax = x+y, k\n\t\t}\n\t}\n\tif kmax < -e.limit {\n\t\tpanic(fmt.Sprintf(\"no paths when limit=%d?\", e.limit))\n\t}\n\treturn e.backwardlcs(e.limit, kmax)\n}\n\n// recover the lcs by backtracking\nfunc (e *editGraph) backwardlcs(D, k int) lcs {\n\tvar ans lcs\n\tfor x := e.getBackward(D, k); x != e.ux || x-(k+e.delta) != e.uy; {\n\t\tif ok(D-1, k-1) && x == e.getBackward(D-1, k-1) {\n\t\t\t// D--, k--, x unchanged\n\t\t\tD, k = D-1, k-1\n\t\t\tcontinue\n\t\t} else if ok(D-1, k+1) && x+1 == e.getBackward(D-1, k+1) {\n\t\t\t// D--, k++, x++\n\t\t\tD, k, x = D-1, k+1, x+1\n\t\t\tcontinue\n\t\t}\n\t\ty := x - (k + e.delta)\n\t\tans = ans.append(x+e.lx, y+e.ly)\n\t\tx++\n\t}\n\treturn ans\n}\n\n// start at (x,y), go down the diagonal as far as possible,\nfunc (e *editGraph) lookBackward(k, relx int) int {\n\trely := relx - (k + e.delta) // forward k = k + e.delta\n\tx, y := relx+e.lx, rely+e.ly\n\tif x > 0 && y > 0 {\n\t\tx -= e.seqs.commonSuffixLen(0, x, 0, y)\n\t}\n\treturn x\n}\n\n// convert to rectangle, and label the result with d\nfunc (e *editGraph) setBackward(d, k, relx int) {\n\tx := e.lookBackward(k, relx)\n\te.vb.set(d, k, x-e.lx)\n}\n\nfunc (e *editGraph) getBackward(d, k int) int {\n\tx := e.vb.get(d, k)\n\treturn x\n}\n\n// -- TWOSIDED ---\n\nfunc twosided(e *editGraph) lcs {\n\t// The termination condition could be improved, as either the forward\n\t// or backward pass could succeed before Myers' Lemma applies.\n\t// Aside from questions of efficiency (is the extra testing cost-effective)\n\t// this is more likely to matter when e.limit is reached.\n\te.setForward(0, 0, e.lx)\n\te.setBackward(0, 0, e.ux)\n\n\t// from D to D+1\n\tfor D := range e.limit {\n\t\t// just finished a backwards pass, so check\n\t\tif got, ok := e.twoDone(D, D); ok {\n\t\t\treturn e.twolcs(D, D, got)\n\t\t}\n\t\t// do a forwards pass (D to D+1)\n\t\te.setForward(D+1, -(D + 1), e.getForward(D, -D))\n\t\te.setForward(D+1, D+1, e.getForward(D, D)+1)\n\t\tfor k := -D + 1; k <= D-1; k += 2 {\n\t\t\t// these are tricky and easy to get backwards\n\t\t\tlookv := e.lookForward(k, e.getForward(D, k-1)+1)\n\t\t\tlookh := e.lookForward(k, e.getForward(D, k+1))\n\t\t\tif lookv > lookh {\n\t\t\t\te.setForward(D+1, k, lookv)\n\t\t\t} else {\n\t\t\t\te.setForward(D+1, k, lookh)\n\t\t\t}\n\t\t}\n\t\t// just did a forward pass, so check\n\t\tif got, ok := e.twoDone(D+1, D); ok {\n\t\t\treturn e.twolcs(D+1, D, got)\n\t\t}\n\t\t// do a backward pass, D to D+1\n\t\te.setBackward(D+1, -(D + 1), e.getBackward(D, -D)-1)\n\t\te.setBackward(D+1, D+1, e.getBackward(D, D))\n\t\tfor k := -D + 1; k <= D-1; k += 2 {\n\t\t\t// these are tricky and easy to get wrong\n\t\t\tlookv := e.lookBackward(k, e.getBackward(D, k-1))\n\t\t\tlookh := e.lookBackward(k, e.getBackward(D, k+1)-1)\n\t\t\tif lookv < lookh {\n\t\t\t\te.setBackward(D+1, k, lookv)\n\t\t\t} else {\n\t\t\t\te.setBackward(D+1, k, lookh)\n\t\t\t}\n\t\t}\n\t}\n\n\t// D too large. combine a forward and backward partial lcs\n\t// first, a forward one\n\tkmax := -e.limit - 1\n\tdiagmax := -1\n\tfor k := -e.limit; k <= e.limit; k += 2 {\n\t\tx := e.getForward(e.limit, k)\n\t\ty := x - k\n\t\tif x+y > diagmax && x <= e.ux && y <= e.uy {\n\t\t\tdiagmax, kmax = x+y, k\n\t\t}\n\t}\n\tif kmax < -e.limit {\n\t\tpanic(fmt.Sprintf(\"no forward paths when limit=%d?\", e.limit))\n\t}\n\tlcs := e.forwardlcs(e.limit, kmax)\n\t// now a backward one\n\t// find the D path with minimal x+y inside the rectangle and\n\t// use that to compute the lcs\n\tdiagmin := 1 << 25 // infinity\n\tfor k := -e.limit; k <= e.limit; k += 2 {\n\t\tx := e.getBackward(e.limit, k)\n\t\ty := x - (k + e.delta)\n\t\tif x+y < diagmin && x >= 0 && y >= 0 {\n\t\t\tdiagmin, kmax = x+y, k\n\t\t}\n\t}\n\tif kmax < -e.limit {\n\t\tpanic(fmt.Sprintf(\"no backward paths when limit=%d?\", e.limit))\n\t}\n\tlcs = append(lcs, e.backwardlcs(e.limit, kmax)...)\n\t// These may overlap (e.forwardlcs and e.backwardlcs return sorted lcs)\n\tans := lcs.fix()\n\treturn ans\n}\n\n// Does Myers' Lemma apply?\nfunc (e *editGraph) twoDone(df, db int) (int, bool) {\n\tif (df+db+e.delta)%2 != 0 {\n\t\treturn 0, false // diagonals cannot overlap\n\t}\n\tkmin := max(-df, -db+e.delta)\n\tkmax := db + e.delta\n\tif df < kmax {\n\t\tkmax = df\n\t}\n\tfor k := kmin; k <= kmax; k += 2 {\n\t\tx := e.vf.get(df, k)\n\t\tu := e.vb.get(db, k-e.delta)\n\t\tif u <= x {\n\t\t\t// is it worth looking at all the other k?\n\t\t\tfor l := k; l <= kmax; l += 2 {\n\t\t\t\tx := e.vf.get(df, l)\n\t\t\t\ty := x - l\n\t\t\t\tu := e.vb.get(db, l-e.delta)\n\t\t\t\tv := u - l\n\t\t\t\tif x == u || u == 0 || v == 0 || y == e.uy || x == e.ux {\n\t\t\t\t\treturn l, true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn k, true\n\t\t}\n\t}\n\treturn 0, false\n}\n\nfunc (e *editGraph) twolcs(df, db, kf int) lcs {\n\t// db==df || db+1==df\n\tx := e.vf.get(df, kf)\n\ty := x - kf\n\tkb := kf - e.delta\n\tu := e.vb.get(db, kb)\n\tv := u - kf\n\n\t// Myers proved there is a df-path from (0,0) to (u,v)\n\t// and a db-path from (x,y) to (N,M).\n\t// In the first case the overall path is the forward path\n\t// to (u,v) followed by the backward path to (N,M).\n\t// In the second case the path is the backward path to (x,y)\n\t// followed by the forward path to (x,y) from (0,0).\n\n\t// Look for some special cases to avoid computing either of these paths.\n\tif x == u {\n\t\t// \"babaab\" \"cccaba\"\n\t\t// already patched together\n\t\tlcs := e.forwardlcs(df, kf)\n\t\tlcs = append(lcs, e.backwardlcs(db, kb)...)\n\t\treturn lcs.sort()\n\t}\n\n\t// is (u-1,v) or (u,v-1) labelled df-1?\n\t// if so, that forward df-1-path plus a horizontal or vertical edge\n\t// is the df-path to (u,v), then plus the db-path to (N,M)\n\tif u > 0 && ok(df-1, u-1-v) && e.vf.get(df-1, u-1-v) == u-1 {\n\t\t//  \"aabbab\" \"cbcabc\"\n\t\tlcs := e.forwardlcs(df-1, u-1-v)\n\t\tlcs = append(lcs, e.backwardlcs(db, kb)...)\n\t\treturn lcs.sort()\n\t}\n\tif v > 0 && ok(df-1, (u-(v-1))) && e.vf.get(df-1, u-(v-1)) == u {\n\t\t//  \"abaabb\" \"bcacab\"\n\t\tlcs := e.forwardlcs(df-1, u-(v-1))\n\t\tlcs = append(lcs, e.backwardlcs(db, kb)...)\n\t\treturn lcs.sort()\n\t}\n\n\t// The path can't possibly contribute to the lcs because it\n\t// is all horizontal or vertical edges\n\tif u == 0 || v == 0 || x == e.ux || y == e.uy {\n\t\t// \"abaabb\" \"abaaaa\"\n\t\tif u == 0 || v == 0 {\n\t\t\treturn e.backwardlcs(db, kb)\n\t\t}\n\t\treturn e.forwardlcs(df, kf)\n\t}\n\n\t// is (x+1,y) or (x,y+1) labelled db-1?\n\tif x+1 <= e.ux && ok(db-1, x+1-y-e.delta) && e.vb.get(db-1, x+1-y-e.delta) == x+1 {\n\t\t// \"bababb\" \"baaabb\"\n\t\tlcs := e.backwardlcs(db-1, kb+1)\n\t\tlcs = append(lcs, e.forwardlcs(df, kf)...)\n\t\treturn lcs.sort()\n\t}\n\tif y+1 <= e.uy && ok(db-1, x-(y+1)-e.delta) && e.vb.get(db-1, x-(y+1)-e.delta) == x {\n\t\t// \"abbbaa\" \"cabacc\"\n\t\tlcs := e.backwardlcs(db-1, kb-1)\n\t\tlcs = append(lcs, e.forwardlcs(df, kf)...)\n\t\treturn lcs.sort()\n\t}\n\n\t// need to compute another path\n\t// \"aabbaa\" \"aacaba\"\n\tlcs := e.backwardlcs(db, kb)\n\toldx, oldy := e.ux, e.uy\n\te.ux = u\n\te.uy = v\n\tlcs = append(lcs, forward(e)...)\n\te.ux, e.uy = oldx, oldy\n\treturn lcs.sort()\n}\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/old_test.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage lcs\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"math/rand/v2\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestAlgosOld(t *testing.T) {\n\tfor i, algo := range []func(*editGraph) lcs{forward, backward, twosided} {\n\t\tt.Run(strings.Fields(\"forward backward twosided\")[i], func(t *testing.T) {\n\t\t\tfor _, tx := range Btests {\n\t\t\t\tlim := len(tx.a) + len(tx.b)\n\n\t\t\t\tdiffs, lcs := compute(stringSeqs{tx.a, tx.b}, algo, lim)\n\t\t\t\tcheck(t, tx.a, lcs, tx.lcs)\n\t\t\t\tcheckDiffs(t, tx.a, diffs, tx.b)\n\n\t\t\t\tdiffs, lcs = compute(stringSeqs{tx.b, tx.a}, algo, lim)\n\t\t\t\tcheck(t, tx.b, lcs, tx.lcs)\n\t\t\t\tcheckDiffs(t, tx.b, diffs, tx.a)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIntOld(t *testing.T) {\n\t// need to avoid any characters in btests\n\tlfill, rfill := \"AAAAAAAAAAAA\", \"BBBBBBBBBBBB\"\n\tfor _, tx := range Btests {\n\t\tif len(tx.a) < 2 || len(tx.b) < 2 {\n\t\t\tcontinue\n\t\t}\n\t\tleft := tx.a + lfill\n\t\tright := tx.b + rfill\n\t\tlim := len(tx.a) + len(tx.b)\n\t\tdiffs, lcs := compute(stringSeqs{left, right}, twosided, lim)\n\t\tcheck(t, left, lcs, tx.lcs)\n\t\tcheckDiffs(t, left, diffs, right)\n\t\tdiffs, lcs = compute(stringSeqs{right, left}, twosided, lim)\n\t\tcheck(t, right, lcs, tx.lcs)\n\t\tcheckDiffs(t, right, diffs, left)\n\n\t\tleft = lfill + tx.a\n\t\tright = rfill + tx.b\n\t\tdiffs, lcs = compute(stringSeqs{left, right}, twosided, lim)\n\t\tcheck(t, left, lcs, tx.lcs)\n\t\tcheckDiffs(t, left, diffs, right)\n\t\tdiffs, lcs = compute(stringSeqs{right, left}, twosided, lim)\n\t\tcheck(t, right, lcs, tx.lcs)\n\t\tcheckDiffs(t, right, diffs, left)\n\t}\n}\n\nfunc TestSpecialOld(t *testing.T) { // exercises lcs.fix\n\ta := \"golang.org/x/tools/intern\"\n\tb := \"github.com/google/safehtml/template\\\"\\n\\t\\\"golang.org/x/tools/intern\"\n\tdiffs, lcs := compute(stringSeqs{a, b}, twosided, 4)\n\tif !lcs.valid() {\n\t\tt.Errorf(\"%d,%v\", len(diffs), lcs)\n\t}\n}\n\nfunc TestRegressionOld001(t *testing.T) {\n\ta := \"// Copyright 2019 The Go Authors. All rights reserved.\\n// Use of this source code is governed by a BSD-style\\n// license that can be found in the LICENSE file.\\n\\npackage diff_test\\n\\nimport (\\n\\t\\\"fmt\\\"\\n\\t\\\"math/rand\\\"\\n\\t\\\"strings\\\"\\n\\t\\\"testing\\\"\\n\\n\\t\\\"golang.org/x/tools/gopls/internal/lsp/diff\\\"\\n\\t\\\"golang.org/x/tools/internal/diff/difftest\\\"\\n\\t\\\"golang.org/x/tools/gopls/internal/span\\\"\\n)\\n\"\n\n\tb := \"// Copyright 2019 The Go Authors. All rights reserved.\\n// Use of this source code is governed by a BSD-style\\n// license that can be found in the LICENSE file.\\n\\npackage diff_test\\n\\nimport (\\n\\t\\\"fmt\\\"\\n\\t\\\"math/rand\\\"\\n\\t\\\"strings\\\"\\n\\t\\\"testing\\\"\\n\\n\\t\\\"github.com/google/safehtml/template\\\"\\n\\t\\\"golang.org/x/tools/gopls/internal/lsp/diff\\\"\\n\\t\\\"golang.org/x/tools/internal/diff/difftest\\\"\\n\\t\\\"golang.org/x/tools/gopls/internal/span\\\"\\n)\\n\"\n\tfor i := 1; i < len(b); i++ {\n\t\tdiffs, lcs := compute(stringSeqs{a, b}, twosided, i) // 14 from gopls\n\t\tif !lcs.valid() {\n\t\t\tt.Errorf(\"%d,%v\", len(diffs), lcs)\n\t\t}\n\t\tcheckDiffs(t, a, diffs, b)\n\t}\n}\n\nfunc TestRegressionOld002(t *testing.T) {\n\ta := \"n\\\"\\n)\\n\"\n\tb := \"n\\\"\\n\\t\\\"golang.org/x//nnal/stack\\\"\\n)\\n\"\n\tfor i := 1; i <= len(b); i++ {\n\t\tdiffs, lcs := compute(stringSeqs{a, b}, twosided, i)\n\t\tif !lcs.valid() {\n\t\t\tt.Errorf(\"%d,%v\", len(diffs), lcs)\n\t\t}\n\t\tcheckDiffs(t, a, diffs, b)\n\t}\n}\n\nfunc TestRegressionOld003(t *testing.T) {\n\ta := \"golang.org/x/hello v1.0.0\\nrequire golang.org/x/unused v1\"\n\tb := \"golang.org/x/hello v1\"\n\tfor i := 1; i <= len(a); i++ {\n\t\tdiffs, lcs := compute(stringSeqs{a, b}, twosided, i)\n\t\tif !lcs.valid() {\n\t\t\tt.Errorf(\"%d,%v\", len(diffs), lcs)\n\t\t}\n\t\tcheckDiffs(t, a, diffs, b)\n\t}\n}\n\nfunc TestRandOld(t *testing.T) {\n\trng := rng(t)\n\n\tfor i := range 1000 {\n\t\t// TODO(adonovan): use ASCII and bytesSeqs here? The use of\n\t\t// non-ASCII isn't relevant to the property exercised by the test.\n\t\ta := []rune(randstr(rng, \"abω\", 16))\n\t\tb := []rune(randstr(rng, \"abωc\", 16))\n\t\tseq := runesSeqs{a, b}\n\n\t\tconst lim = 0 // make sure we get the lcs (24 was too small)\n\t\t_, forw := compute(seq, forward, lim)\n\t\t_, back := compute(seq, backward, lim)\n\t\t_, two := compute(seq, twosided, lim)\n\t\tif lcslen(two) != lcslen(forw) || lcslen(forw) != lcslen(back) {\n\t\t\tt.Logf(\"\\n%v\\n%v\\n%v\", forw, back, two)\n\t\t\tt.Fatalf(\"%d forw:%d back:%d two:%d\", i, lcslen(forw), lcslen(back), lcslen(two))\n\t\t}\n\t\tif !two.valid() || !forw.valid() || !back.valid() {\n\t\t\tt.Errorf(\"check failure\")\n\t\t}\n\t}\n}\n\n// TestDiffAPI tests the public API functions (Diff{Bytes,Strings,Runes})\n// to ensure at least minimal parity of the three representations.\nfunc TestDiffAPI(t *testing.T) {\n\tfor _, test := range []struct {\n\t\ta, b                              string\n\t\twantStrings, wantBytes, wantRunes string\n\t}{\n\t\t{\"abcXdef\", \"abcxdef\", \"[{3 4 3 4}]\", \"[{3 4 3 4}]\", \"[{3 4 3 4}]\"}, // ASCII\n\t\t{\"abcωdef\", \"abcΩdef\", \"[{3 5 3 5}]\", \"[{3 5 3 5}]\", \"[{3 4 3 4}]\"}, // non-ASCII\n\t} {\n\n\t\tgotStrings := fmt.Sprint(DiffStrings(test.a, test.b))\n\t\tif gotStrings != test.wantStrings {\n\t\t\tt.Errorf(\"DiffStrings(%q, %q) = %v, want %v\",\n\t\t\t\ttest.a, test.b, gotStrings, test.wantStrings)\n\t\t}\n\t\tgotBytes := fmt.Sprint(DiffBytes([]byte(test.a), []byte(test.b)))\n\t\tif gotBytes != test.wantBytes {\n\t\t\tt.Errorf(\"DiffBytes(%q, %q) = %v, want %v\",\n\t\t\t\ttest.a, test.b, gotBytes, test.wantBytes)\n\t\t}\n\t\tgotRunes := fmt.Sprint(DiffRunes([]rune(test.a), []rune(test.b)))\n\t\tif gotRunes != test.wantRunes {\n\t\t\tt.Errorf(\"DiffRunes(%q, %q) = %v, want %v\",\n\t\t\t\ttest.a, test.b, gotRunes, test.wantRunes)\n\t\t}\n\t}\n}\n\nfunc BenchmarkTwoOld(b *testing.B) {\n\ttests := genBench(rng(b), \"abc\", 96)\n\tfor i := 0; i < b.N; i++ {\n\t\tfor _, tt := range tests {\n\t\t\t_, two := compute(stringSeqs{tt.before, tt.after}, twosided, 100)\n\t\t\tif !two.valid() {\n\t\t\t\tb.Error(\"check failed\")\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc BenchmarkForwOld(b *testing.B) {\n\ttests := genBench(rng(b), \"abc\", 96)\n\tfor i := 0; i < b.N; i++ {\n\t\tfor _, tt := range tests {\n\t\t\t_, two := compute(stringSeqs{tt.before, tt.after}, forward, 100)\n\t\t\tif !two.valid() {\n\t\t\t\tb.Error(\"check failed\")\n\t\t\t}\n\t\t}\n\t}\n}\n\n// rng returns a randomly initialized PRNG whose seeds are logged so\n// that occasional test failures can be deterministically replayed.\nfunc rng(tb testing.TB) *rand.Rand {\n\tseed1, seed2 := rand.Uint64(), rand.Uint64()\n\ttb.Logf(\"PRNG seeds: %d, %d\", seed1, seed2)\n\treturn rand.New(rand.NewPCG(seed1, seed2))\n}\n\nfunc genBench(rng *rand.Rand, set string, n int) []struct{ before, after string } {\n\t// before and after for benchmarks. 24 strings of length n with\n\t// before and after differing at least once, and about 5%\n\tvar ans []struct{ before, after string }\n\tfor range 24 {\n\t\t// maybe b should have an approximately known number of diffs\n\t\ta := randstr(rng, set, n)\n\t\tcnt := 0\n\t\tbb := make([]rune, 0, n)\n\t\tfor _, r := range a {\n\t\t\tif rand.Float64() < .05 {\n\t\t\t\tcnt++\n\t\t\t\tr = 'N'\n\t\t\t}\n\t\t\tbb = append(bb, r)\n\t\t}\n\t\tif cnt == 0 {\n\t\t\t// avoid == shortcut\n\t\t\tbb[n/2] = 'N'\n\t\t}\n\t\tans = append(ans, struct{ before, after string }{a, string(bb)})\n\t}\n\treturn ans\n}\n\n// This benchmark represents a common case for a diff command:\n// large file with a single relatively small diff in the middle.\n// (It's not clear whether this is representative of gopls workloads\n// or whether it is important to gopls diff performance.)\n//\n// TODO(adonovan) opt: it could be much faster.  For example,\n// comparing a file against itself is about 10x faster than with the\n// small deletion in the middle. Strangely, comparing a file against\n// itself minus the last byte is faster still; I don't know why.\n// There is much low-hanging fruit here for further improvement.\nfunc BenchmarkLargeFileSmallDiff(b *testing.B) {\n\tdata, err := os.ReadFile(\"old.go\") // large file\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tn := len(data)\n\n\tsrc := string(data)\n\tdst := src[:n*49/100] + src[n*51/100:] // remove 2% from the middle\n\tb.Run(\"string\", func(b *testing.B) {\n\t\tfor i := 0; i < b.N; i++ {\n\t\t\tcompute(stringSeqs{src, dst}, twosided, len(src)+len(dst))\n\t\t}\n\t})\n\n\tsrcBytes := []byte(src)\n\tdstBytes := []byte(dst)\n\tb.Run(\"bytes\", func(b *testing.B) {\n\t\tfor i := 0; i < b.N; i++ {\n\t\t\tcompute(bytesSeqs{srcBytes, dstBytes}, twosided, len(srcBytes)+len(dstBytes))\n\t\t}\n\t})\n\n\tsrcRunes := []rune(src)\n\tdstRunes := []rune(dst)\n\tb.Run(\"runes\", func(b *testing.B) {\n\t\tfor i := 0; i < b.N; i++ {\n\t\t\tcompute(runesSeqs{srcRunes, dstRunes}, twosided, len(srcRunes)+len(dstRunes))\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "internal/x/tools/diff/lcs/sequence.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage lcs\n\n// This file defines the abstract sequence over which the LCS algorithm operates.\n\n// sequences abstracts a pair of sequences, A and B.\ntype sequences interface {\n\tlengths() (int, int)                    // len(A), len(B)\n\tcommonPrefixLen(ai, aj, bi, bj int) int // len(commonPrefix(A[ai:aj], B[bi:bj]))\n\tcommonSuffixLen(ai, aj, bi, bj int) int // len(commonSuffix(A[ai:aj], B[bi:bj]))\n}\n\ntype stringSeqs struct{ a, b string }\n\nfunc (s stringSeqs) lengths() (int, int) { return len(s.a), len(s.b) }\nfunc (s stringSeqs) commonPrefixLen(ai, aj, bi, bj int) int {\n\treturn commonPrefixLenString(s.a[ai:aj], s.b[bi:bj])\n}\nfunc (s stringSeqs) commonSuffixLen(ai, aj, bi, bj int) int {\n\treturn commonSuffixLenString(s.a[ai:aj], s.b[bi:bj])\n}\n\n// The explicit capacity in s[i:j:j] leads to more efficient code.\n\ntype bytesSeqs struct{ a, b []byte }\n\nfunc (s bytesSeqs) lengths() (int, int) { return len(s.a), len(s.b) }\nfunc (s bytesSeqs) commonPrefixLen(ai, aj, bi, bj int) int {\n\treturn commonPrefixLenBytes(s.a[ai:aj:aj], s.b[bi:bj:bj])\n}\nfunc (s bytesSeqs) commonSuffixLen(ai, aj, bi, bj int) int {\n\treturn commonSuffixLenBytes(s.a[ai:aj:aj], s.b[bi:bj:bj])\n}\n\ntype runesSeqs struct{ a, b []rune }\n\nfunc (s runesSeqs) lengths() (int, int) { return len(s.a), len(s.b) }\nfunc (s runesSeqs) commonPrefixLen(ai, aj, bi, bj int) int {\n\treturn commonPrefixLenRunes(s.a[ai:aj:aj], s.b[bi:bj:bj])\n}\nfunc (s runesSeqs) commonSuffixLen(ai, aj, bi, bj int) int {\n\treturn commonSuffixLenRunes(s.a[ai:aj:aj], s.b[bi:bj:bj])\n}\n\n// TODO(adonovan): optimize these functions using ideas from:\n// - https://go.dev/cl/408116 common.go\n// - https://go.dev/cl/421435 xor_generic.go\n\n// TODO(adonovan): factor using generics when available,\n// but measure performance impact.\n\n// commonPrefixLen* returns the length of the common prefix of a[ai:aj] and b[bi:bj].\nfunc commonPrefixLenBytes(a, b []byte) int {\n\tn := min(len(a), len(b))\n\ti := 0\n\tfor i < n && a[i] == b[i] {\n\t\ti++\n\t}\n\treturn i\n}\nfunc commonPrefixLenRunes(a, b []rune) int {\n\tn := min(len(a), len(b))\n\ti := 0\n\tfor i < n && a[i] == b[i] {\n\t\ti++\n\t}\n\treturn i\n}\nfunc commonPrefixLenString(a, b string) int {\n\tn := min(len(a), len(b))\n\ti := 0\n\tfor i < n && a[i] == b[i] {\n\t\ti++\n\t}\n\treturn i\n}\n\n// commonSuffixLen* returns the length of the common suffix of a[ai:aj] and b[bi:bj].\nfunc commonSuffixLenBytes(a, b []byte) int {\n\tn := min(len(a), len(b))\n\ti := 0\n\tfor i < n && a[len(a)-1-i] == b[len(b)-1-i] {\n\t\ti++\n\t}\n\treturn i\n}\nfunc commonSuffixLenRunes(a, b []rune) int {\n\tn := min(len(a), len(b))\n\ti := 0\n\tfor i < n && a[len(a)-1-i] == b[len(b)-1-i] {\n\t\ti++\n\t}\n\treturn i\n}\nfunc commonSuffixLenString(a, b string) int {\n\tn := min(len(a), len(b))\n\ti := 0\n\tfor i < n && a[len(a)-1-i] == b[len(b)-1-i] {\n\t\ti++\n\t}\n\treturn i\n}\n\nfunc min(x, y int) int {\n\tif x < y {\n\t\treturn x\n\t} else {\n\t\treturn y\n\t}\n}\n"
  },
  {
    "path": "internal/x/tools/diff/myers/diff.go",
    "content": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package myers implements the Myers diff algorithm.\npackage myers\n\nimport (\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/x/tools/diff\"\n)\n\n// Sources:\n// https://blog.jcoglan.com/2017/02/17/the-myers-diff-algorithm-part-3/\n// https://www.codeproject.com/Articles/42279/%2FArticles%2F42279%2FInvestigating-Myers-diff-algorithm-Part-1-of-2\n\n// ComputeEdits returns the diffs of two strings using a simple\n// line-based implementation, like [diff.Strings].\n//\n// Deprecated: this implementation is moribund. However, when diffs\n// appear in marker test expectations, they are the particular diffs\n// produced by this implementation. The marker test framework\n// asserts diff(orig, got)==wantDiff, but ideally it would compute\n// got==apply(orig, wantDiff) so that the notation of the diff\n// is immaterial.\nfunc ComputeEdits(before, after string) []diff.Edit {\n\tbeforeLines := splitLines(before)\n\tops := operations(beforeLines, splitLines(after))\n\n\t// Build a table mapping line number to offset.\n\tlineOffsets := make([]int, 0, len(beforeLines)+1)\n\ttotal := 0\n\tfor i := range beforeLines {\n\t\tlineOffsets = append(lineOffsets, total)\n\t\ttotal += len(beforeLines[i])\n\t}\n\tlineOffsets = append(lineOffsets, total) // EOF\n\n\tedits := make([]diff.Edit, 0, len(ops))\n\tfor _, op := range ops {\n\t\tstart, end := lineOffsets[op.I1], lineOffsets[op.I2]\n\t\tswitch op.Kind {\n\t\tcase opDelete:\n\t\t\t// Delete: before[I1:I2] is deleted.\n\t\t\tedits = append(edits, diff.Edit{Start: start, End: end})\n\t\tcase opInsert:\n\t\t\t// Insert: after[J1:J2] is inserted at before[I1:I1].\n\t\t\tif content := strings.Join(op.Content, \"\"); content != \"\" {\n\t\t\t\tedits = append(edits, diff.Edit{Start: start, End: end, New: content})\n\t\t\t}\n\t\t}\n\t}\n\treturn edits\n}\n\n// opKind is used to denote the type of operation a line represents.\ntype opKind int\n\nconst (\n\topDelete opKind = iota // line deleted from input (-)\n\topInsert               // line inserted into output (+)\n\topEqual                // line present in input and output\n)\n\nfunc (kind opKind) String() string {\n\tswitch kind {\n\tcase opDelete:\n\t\treturn \"delete\"\n\tcase opInsert:\n\t\treturn \"insert\"\n\tcase opEqual:\n\t\treturn \"equal\"\n\tdefault:\n\t\tpanic(\"unknown opKind\")\n\t}\n}\n\ntype operation struct {\n\tKind    opKind\n\tContent []string // content from b\n\tI1, I2  int      // indices of the line in a\n\tJ1      int      // indices of the line in b, J2 implied by len(Content)\n}\n\n// operations returns the list of operations to convert a into b, consolidating\n// operations for multiple lines and not including equal lines.\nfunc operations(a, b []string) []*operation {\n\tif len(a) == 0 && len(b) == 0 {\n\t\treturn nil\n\t}\n\n\ttrace, offset := shortestEditSequence(a, b)\n\tsnakes := backtrack(trace, len(a), len(b), offset)\n\n\tM, N := len(a), len(b)\n\n\tvar i int\n\tsolution := make([]*operation, len(a)+len(b))\n\n\tadd := func(op *operation, i2, j2 int) {\n\t\tif op == nil {\n\t\t\treturn\n\t\t}\n\t\top.I2 = i2\n\t\tif op.Kind == opInsert {\n\t\t\top.Content = b[op.J1:j2]\n\t\t}\n\t\tsolution[i] = op\n\t\ti++\n\t}\n\tx, y := 0, 0\n\tfor _, snake := range snakes {\n\t\tif len(snake) < 2 {\n\t\t\tcontinue\n\t\t}\n\t\tvar op *operation\n\t\t// delete (horizontal)\n\t\tfor snake[0]-snake[1] > x-y {\n\t\t\tif op == nil {\n\t\t\t\top = &operation{\n\t\t\t\t\tKind: opDelete,\n\t\t\t\t\tI1:   x,\n\t\t\t\t\tJ1:   y,\n\t\t\t\t}\n\t\t\t}\n\t\t\tx++\n\t\t\tif x == M {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tadd(op, x, y)\n\t\top = nil\n\t\t// insert (vertical)\n\t\tfor snake[0]-snake[1] < x-y {\n\t\t\tif op == nil {\n\t\t\t\top = &operation{\n\t\t\t\t\tKind: opInsert,\n\t\t\t\t\tI1:   x,\n\t\t\t\t\tJ1:   y,\n\t\t\t\t}\n\t\t\t}\n\t\t\ty++\n\t\t}\n\t\tadd(op, x, y)\n\t\top = nil\n\t\t// equal (diagonal)\n\t\tfor x < snake[0] {\n\t\t\tx++\n\t\t\ty++\n\t\t}\n\t\tif x >= M && y >= N {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn solution[:i]\n}\n\n// backtrack uses the trace for the edit sequence computation and returns the\n// \"snakes\" that make up the solution. A \"snake\" is a single deletion or\n// insertion followed by zero or diagonals.\nfunc backtrack(trace [][]int, x, y, offset int) [][]int {\n\tsnakes := make([][]int, len(trace))\n\td := len(trace) - 1\n\tfor ; x > 0 && y > 0 && d > 0; d-- {\n\t\tV := trace[d]\n\t\tif len(V) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tsnakes[d] = []int{x, y}\n\n\t\tk := x - y\n\n\t\tvar kPrev int\n\t\tif k == -d || (k != d && V[k-1+offset] < V[k+1+offset]) {\n\t\t\tkPrev = k + 1\n\t\t} else {\n\t\t\tkPrev = k - 1\n\t\t}\n\n\t\tx = V[kPrev+offset]\n\t\ty = x - kPrev\n\t}\n\tif x < 0 || y < 0 {\n\t\treturn snakes\n\t}\n\tsnakes[d] = []int{x, y}\n\treturn snakes\n}\n\n// shortestEditSequence returns the shortest edit sequence that converts a into b.\nfunc shortestEditSequence(a, b []string) ([][]int, int) {\n\tM, N := len(a), len(b)\n\tV := make([]int, 2*(N+M)+1)\n\toffset := N + M\n\ttrace := make([][]int, N+M+1)\n\n\t// Iterate through the maximum possible length of the SES (N+M).\n\tfor d := 0; d <= N+M; d++ {\n\t\tcopyV := make([]int, len(V))\n\t\t// k lines are represented by the equation y = x - k. We move in\n\t\t// increments of 2 because end points for even d are on even k lines.\n\t\tfor k := -d; k <= d; k += 2 {\n\t\t\t// At each point, we either go down or to the right. We go down if\n\t\t\t// k == -d, and we go to the right if k == d. We also prioritize\n\t\t\t// the maximum x value, because we prefer deletions to insertions.\n\t\t\tvar x int\n\t\t\tif k == -d || (k != d && V[k-1+offset] < V[k+1+offset]) {\n\t\t\t\tx = V[k+1+offset] // down\n\t\t\t} else {\n\t\t\t\tx = V[k-1+offset] + 1 // right\n\t\t\t}\n\n\t\t\ty := x - k\n\n\t\t\t// Diagonal moves while we have equal contents.\n\t\t\tfor x < M && y < N && a[x] == b[y] {\n\t\t\t\tx++\n\t\t\t\ty++\n\t\t\t}\n\n\t\t\tV[k+offset] = x\n\n\t\t\t// Return if we've exceeded the maximum values.\n\t\t\tif x == M && y == N {\n\t\t\t\t// Makes sure to save the state of the array before returning.\n\t\t\t\tcopy(copyV, V)\n\t\t\t\ttrace[d] = copyV\n\t\t\t\treturn trace, offset\n\t\t\t}\n\t\t}\n\n\t\t// Save the state of the array.\n\t\tcopy(copyV, V)\n\t\ttrace[d] = copyV\n\t}\n\treturn nil, 0\n}\n\nfunc splitLines(text string) []string {\n\tlines := strings.SplitAfter(text, \"\\n\")\n\tif lines[len(lines)-1] == \"\" {\n\t\tlines = lines[:len(lines)-1]\n\t}\n\treturn lines\n}\n"
  },
  {
    "path": "internal/x/tools/diff/ndiff.go",
    "content": "// Copyright 2022 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage diff\n\nimport (\n\t\"bytes\"\n\t\"unicode/utf8\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/x/tools/diff/lcs\"\n)\n\n// Strings computes the differences between two strings.\n// The resulting edits respect rune boundaries.\nfunc Strings(before, after string) []Edit {\n\tif before == after {\n\t\treturn nil // common case\n\t}\n\n\tif isASCII(before) && isASCII(after) {\n\t\t// TODO(adonovan): opt: specialize diffASCII for strings.\n\t\treturn diffASCII([]byte(before), []byte(after))\n\t}\n\treturn diffRunes([]rune(before), []rune(after))\n}\n\n// Bytes computes the differences between two byte slices.\n// The resulting edits respect rune boundaries.\nfunc Bytes(before, after []byte) []Edit {\n\tif bytes.Equal(before, after) {\n\t\treturn nil // common case\n\t}\n\n\tif isASCII(before) && isASCII(after) {\n\t\treturn diffASCII(before, after)\n\t}\n\treturn diffRunes(runes(before), runes(after))\n}\n\nfunc diffASCII(before, after []byte) []Edit {\n\tdiffs := lcs.DiffBytes(before, after)\n\n\t// Convert from LCS diffs.\n\tres := make([]Edit, len(diffs))\n\tfor i, d := range diffs {\n\t\tres[i] = Edit{d.Start, d.End, string(after[d.ReplStart:d.ReplEnd])}\n\t}\n\treturn res\n}\n\nfunc diffRunes(before, after []rune) []Edit {\n\tdiffs := lcs.DiffRunes(before, after)\n\n\t// The diffs returned by the lcs package use indexes\n\t// into whatever slice was passed in.\n\t// Convert rune offsets to byte offsets.\n\tres := make([]Edit, len(diffs))\n\tlastEnd := 0\n\tutf8Len := 0\n\tfor i, d := range diffs {\n\t\tutf8Len += runesLen(before[lastEnd:d.Start]) // text between edits\n\t\tstart := utf8Len\n\t\tutf8Len += runesLen(before[d.Start:d.End]) // text deleted by this edit\n\t\tres[i] = Edit{start, utf8Len, string(after[d.ReplStart:d.ReplEnd])}\n\t\tlastEnd = d.End\n\t}\n\treturn res\n}\n\n// runes is like []rune(string(bytes)) without the duplicate allocation.\nfunc runes(bytes []byte) []rune {\n\tn := utf8.RuneCount(bytes)\n\trunes := make([]rune, n)\n\tfor i := range n {\n\t\tr, sz := utf8.DecodeRune(bytes)\n\t\tbytes = bytes[sz:]\n\t\trunes[i] = r\n\t}\n\treturn runes\n}\n\n// runesLen returns the length in bytes of the UTF-8 encoding of runes.\nfunc runesLen(runes []rune) (len int) {\n\tfor _, r := range runes {\n\t\tlen += utf8.RuneLen(r)\n\t}\n\treturn len\n}\n\n// isASCII reports whether s contains only ASCII.\nfunc isASCII[S string | []byte](s S) bool {\n\tfor i := 0; i < len(s); i++ {\n\t\tif s[i] >= utf8.RuneSelf {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "internal/x/tools/diff/readme.md",
    "content": "# diff\n\nExtracted from `/internal/diff/` (related to `fixer`).\nThis is just a copy of the code without any changes.\n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/6076\n  - sync with https://github.com/golang/tools/blob/v0.37.0/internal/diff/\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync with https://github.com/golang/tools/blob/v0.28.0/internal/diff/\n"
  },
  {
    "path": "internal/x/tools/diff/unified.go",
    "content": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage diff\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n)\n\n// DefaultContextLines is the number of unchanged lines of surrounding\n// context displayed by Unified. Use ToUnified to specify a different value.\nconst DefaultContextLines = 3\n\n// Unified returns a unified diff of the old and new strings.\n// The old and new labels are the names of the old and new files.\n// If the strings are equal, it returns the empty string.\nfunc Unified(oldLabel, newLabel, old, new string) string {\n\tedits := Strings(old, new)\n\tunified, err := ToUnified(oldLabel, newLabel, old, edits, DefaultContextLines)\n\tif err != nil {\n\t\t// Can't happen: edits are consistent.\n\t\tlog.Fatalf(\"internal error in diff.Unified: %v\", err)\n\t}\n\treturn unified\n}\n\n// ToUnified applies the edits to content and returns a unified diff,\n// with contextLines lines of (unchanged) context around each diff hunk.\n// The old and new labels are the names of the content and result files.\n// It returns an error if the edits are inconsistent; see ApplyEdits.\nfunc ToUnified(oldLabel, newLabel, content string, edits []Edit, contextLines int) (string, error) {\n\tu, err := toUnified(oldLabel, newLabel, content, edits, contextLines)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn u.String(), nil\n}\n\n// unified represents a set of edits as a unified diff.\ntype unified struct {\n\t// from is the name of the original file.\n\tfrom string\n\t// to is the name of the modified file.\n\tto string\n\t// hunks is the set of edit hunks needed to transform the file content.\n\thunks []*hunk\n}\n\n// Hunk represents a contiguous set of line edits to apply.\ntype hunk struct {\n\t// The line in the original source where the hunk starts.\n\tfromLine int\n\t// The line in the original source where the hunk finishes.\n\ttoLine int\n\t// The set of line based edits to apply.\n\tlines []line\n}\n\n// Line represents a single line operation to apply as part of a Hunk.\ntype line struct {\n\t// kind is the type of line this represents, deletion, insertion or copy.\n\tkind opKind\n\t// content is the content of this line.\n\t// For deletion it is the line being removed, for all others it is the line\n\t// to put in the output.\n\tcontent string\n}\n\n// opKind is used to denote the type of operation a line represents.\ntype opKind int\n\nconst (\n\t// opDelete is the operation kind for a line that is present in the input\n\t// but not in the output.\n\topDelete opKind = iota\n\t// opInsert is the operation kind for a line that is new in the output.\n\topInsert\n\t// opEqual is the operation kind for a line that is the same in the input and\n\t// output, often used to provide context around edited lines.\n\topEqual\n)\n\n// String returns a human readable representation of an OpKind. It is not\n// intended for machine processing.\nfunc (k opKind) String() string {\n\tswitch k {\n\tcase opDelete:\n\t\treturn \"delete\"\n\tcase opInsert:\n\t\treturn \"insert\"\n\tcase opEqual:\n\t\treturn \"equal\"\n\tdefault:\n\t\tpanic(\"unknown operation kind\")\n\t}\n}\n\n// toUnified takes a file contents and a sequence of edits, and calculates\n// a unified diff that represents those edits.\nfunc toUnified(fromName, toName string, content string, edits []Edit, contextLines int) (unified, error) {\n\tgap := contextLines * 2\n\tu := unified{\n\t\tfrom: fromName,\n\t\tto:   toName,\n\t}\n\tif len(edits) == 0 {\n\t\treturn u, nil\n\t}\n\tvar err error\n\tedits, err = lineEdits(content, edits) // expand to whole lines\n\tif err != nil {\n\t\treturn u, err\n\t}\n\tlines := splitLines(content)\n\tvar h *hunk\n\tlast := 0\n\ttoLine := 0\n\tfor _, edit := range edits {\n\t\t// Compute the zero-based line numbers of the edit start and end.\n\t\t// TODO(adonovan): opt: compute incrementally, avoid O(n^2).\n\t\tstart := strings.Count(content[:edit.Start], \"\\n\")\n\t\tend := strings.Count(content[:edit.End], \"\\n\")\n\t\tif edit.End == len(content) && len(content) > 0 && content[len(content)-1] != '\\n' {\n\t\t\tend++ // EOF counts as an implicit newline\n\t\t}\n\n\t\tswitch {\n\t\tcase h != nil && start == last:\n\t\t\t// direct extension\n\t\tcase h != nil && start <= last+gap:\n\t\t\t// within range of previous lines, add the joiners\n\t\t\taddEqualLines(h, lines, last, start)\n\t\tdefault:\n\t\t\t// need to start a new hunk\n\t\t\tif h != nil {\n\t\t\t\t// add the edge to the previous hunk\n\t\t\t\taddEqualLines(h, lines, last, last+contextLines)\n\t\t\t\tu.hunks = append(u.hunks, h)\n\t\t\t}\n\t\t\ttoLine += start - last\n\t\t\th = &hunk{\n\t\t\t\tfromLine: start + 1,\n\t\t\t\ttoLine:   toLine + 1,\n\t\t\t}\n\t\t\t// add the edge to the new hunk\n\t\t\tdelta := addEqualLines(h, lines, start-contextLines, start)\n\t\t\th.fromLine -= delta\n\t\t\th.toLine -= delta\n\t\t}\n\t\tlast = start\n\t\tfor i := start; i < end; i++ {\n\t\t\th.lines = append(h.lines, line{kind: opDelete, content: lines[i]})\n\t\t\tlast++\n\t\t}\n\t\tif edit.New != \"\" {\n\t\t\tfor _, content := range splitLines(edit.New) {\n\t\t\t\th.lines = append(h.lines, line{kind: opInsert, content: content})\n\t\t\t\ttoLine++\n\t\t\t}\n\t\t}\n\t}\n\tif h != nil {\n\t\t// add the edge to the final hunk\n\t\taddEqualLines(h, lines, last, last+contextLines)\n\t\tu.hunks = append(u.hunks, h)\n\t}\n\treturn u, nil\n}\n\nfunc splitLines(text string) []string {\n\tlines := strings.SplitAfter(text, \"\\n\")\n\tif lines[len(lines)-1] == \"\" {\n\t\tlines = lines[:len(lines)-1]\n\t}\n\treturn lines\n}\n\nfunc addEqualLines(h *hunk, lines []string, start, end int) int {\n\tdelta := 0\n\tfor i := start; i < end; i++ {\n\t\tif i < 0 {\n\t\t\tcontinue\n\t\t}\n\t\tif i >= len(lines) {\n\t\t\treturn delta\n\t\t}\n\t\th.lines = append(h.lines, line{kind: opEqual, content: lines[i]})\n\t\tdelta++\n\t}\n\treturn delta\n}\n\n// String converts a unified diff to the standard textual form for that diff.\n// The output of this function can be passed to tools like patch.\nfunc (u unified) String() string {\n\tif len(u.hunks) == 0 {\n\t\treturn \"\"\n\t}\n\tb := new(strings.Builder)\n\tfmt.Fprintf(b, \"--- %s\\n\", u.from)\n\tfmt.Fprintf(b, \"+++ %s\\n\", u.to)\n\tfor _, hunk := range u.hunks {\n\t\tfromCount, toCount := 0, 0\n\t\tfor _, l := range hunk.lines {\n\t\t\tswitch l.kind {\n\t\t\tcase opDelete:\n\t\t\t\tfromCount++\n\t\t\tcase opInsert:\n\t\t\t\ttoCount++\n\t\t\tdefault:\n\t\t\t\tfromCount++\n\t\t\t\ttoCount++\n\t\t\t}\n\t\t}\n\t\tfmt.Fprint(b, \"@@\")\n\t\tif fromCount > 1 {\n\t\t\tfmt.Fprintf(b, \" -%d,%d\", hunk.fromLine, fromCount)\n\t\t} else if hunk.fromLine == 1 && fromCount == 0 {\n\t\t\t// Match odd GNU diff -u behavior adding to empty file.\n\t\t\tfmt.Fprintf(b, \" -0,0\")\n\t\t} else {\n\t\t\tfmt.Fprintf(b, \" -%d\", hunk.fromLine)\n\t\t}\n\t\tif toCount > 1 {\n\t\t\tfmt.Fprintf(b, \" +%d,%d\", hunk.toLine, toCount)\n\t\t} else if hunk.toLine == 1 && toCount == 0 {\n\t\t\t// Match odd GNU diff -u behavior adding to empty file.\n\t\t\tfmt.Fprintf(b, \" +0,0\")\n\t\t} else {\n\t\t\tfmt.Fprintf(b, \" +%d\", hunk.toLine)\n\t\t}\n\t\tfmt.Fprint(b, \" @@\\n\")\n\t\tfor _, l := range hunk.lines {\n\t\t\tswitch l.kind {\n\t\t\tcase opDelete:\n\t\t\t\tfmt.Fprintf(b, \"-%s\", l.content)\n\t\t\tcase opInsert:\n\t\t\t\tfmt.Fprintf(b, \"+%s\", l.content)\n\t\t\tdefault:\n\t\t\t\tfmt.Fprintf(b, \" %s\", l.content)\n\t\t\t}\n\t\t\tif !strings.HasSuffix(l.content, \"\\n\") {\n\t\t\t\tfmt.Fprintf(b, \"\\n\\\\ No newline at end of file\\n\")\n\t\t\t}\n\t\t}\n\t}\n\treturn b.String()\n}\n"
  },
  {
    "path": "internal/x/tools/driverutil/readfile.go",
    "content": "// Copyright 2020 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage driverutil\n\n// This file defines helpers for implementing [analysis.Pass.ReadFile].\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\n\t\"golang.org/x/tools/go/analysis\"\n)\n\n// A ReadFileFunc is a function that returns the\n// contents of a file, such as [os.ReadFile].\ntype ReadFileFunc = func(filename string) ([]byte, error)\n\n// CheckedReadFile returns a wrapper around a Pass.ReadFile\n// function that performs the appropriate checks.\nfunc CheckedReadFile(pass *analysis.Pass, readFile ReadFileFunc) ReadFileFunc {\n\treturn func(filename string) ([]byte, error) {\n\t\tif err := CheckReadable(pass, filename); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn readFile(filename)\n\t}\n}\n\n// CheckReadable enforces the access policy defined by the ReadFile field of [analysis.Pass].\nfunc CheckReadable(pass *analysis.Pass, filename string) error {\n\tif slices.Contains(pass.OtherFiles, filename) ||\n\t\tslices.Contains(pass.IgnoredFiles, filename) {\n\t\treturn nil\n\t}\n\tfor _, f := range pass.Files {\n\t\tif pass.Fset.File(f.FileStart).Name() == filename {\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn fmt.Errorf(\"Pass.ReadFile: %s is not among OtherFiles, IgnoredFiles, or names of Files\", filename)\n}\n"
  },
  {
    "path": "internal/x/tools/driverutil/readme.md",
    "content": "# driverutil\n\nExtracted from `/internal/analysis/driverutil/` (related to `checker`).\nThis is just a copy of `readfile.go` and `url.go` without any changes.\n\nPreviously, it was `analysisinternal` and `analysisflags` packages.\n\n## History\n\n- https://github.com/golangci/golangci-lint/pull/6434\n  - sync with https://github.com/golang/tools/blob/v0.43.0/internal/analysis/driverutil/readfile.go\n\n## analysisinternal History\n\n- https://github.com/golangci/golangci-lint/pull/6076\n  - sync with https://github.com/golang/tools/blob/v0.37.0/internal/analysisinternal/\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync with https://github.com/golang/tools/blob/v0.28.0/internal/analysisinternal/\n\n## analysisflags History\n\n- https://github.com/golangci/golangci-lint/pull/6076\n  - sync with https://github.com/golang/tools/blob/v0.37.0/go/analysis/internal/analysisflags\n- https://github.com/golangci/golangci-lint/pull/5576\n  - sync with https://github.com/golang/tools/blob/v0.28.0/go/analysis/internal/analysisflags\n"
  },
  {
    "path": "internal/x/tools/driverutil/url.go",
    "content": "// Copyright 2023 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage driverutil\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\n\t\"golang.org/x/tools/go/analysis\"\n)\n\n// ResolveURL resolves the URL field for a Diagnostic from an Analyzer\n// and returns the URL. See Diagnostic.URL for details.\nfunc ResolveURL(a *analysis.Analyzer, d analysis.Diagnostic) (string, error) {\n\tif d.URL == \"\" && d.Category == \"\" && a.URL == \"\" {\n\t\treturn \"\", nil // do nothing\n\t}\n\traw := d.URL\n\tif d.URL == \"\" && d.Category != \"\" {\n\t\traw = \"#\" + d.Category\n\t}\n\tu, err := url.Parse(raw)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid Diagnostic.URL %q: %s\", raw, err)\n\t}\n\tbase, err := url.Parse(a.URL)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid Analyzer.URL %q: %s\", a.URL, err)\n\t}\n\treturn base.ResolveReference(u).String(), nil\n}\n"
  },
  {
    "path": "jsonschema/custom-gcl.jsonschema.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$ref\": \"#/$defs/Configuration\",\n  \"$defs\": {\n    \"Configuration\": {\n      \"properties\": {\n        \"version\": {\n          \"type\": \"string\",\n          \"description\": \"golangci-lint version.\"\n        },\n        \"name\": {\n          \"type\": \"string\",\n          \"description\": \"Name of the binary.\"\n        },\n        \"destination\": {\n          \"type\": \"string\",\n          \"description\": \"Destination is the path to a directory to store the binary.\"\n        },\n        \"plugins\": {\n          \"items\": {\n            \"$ref\": \"#/$defs/Plugin\"\n          },\n          \"type\": \"array\",\n          \"description\": \"Plugins information.\"\n        }\n      },\n      \"additionalProperties\": false,\n      \"type\": \"object\",\n      \"required\": [\n        \"version\"\n      ],\n      \"description\": \"Configuration represents the configuration file.\"\n    },\n    \"Plugin\": {\n      \"oneOf\": [\n        {\n          \"required\": [\n            \"version\"\n          ],\n          \"title\": \"version\"\n        },\n        {\n          \"required\": [\n            \"path\"\n          ],\n          \"title\": \"path\"\n        }\n      ],\n      \"properties\": {\n        \"module\": {\n          \"type\": \"string\",\n          \"description\": \"Module name.\"\n        },\n        \"import\": {\n          \"type\": \"string\",\n          \"description\": \"Import to use.\"\n        },\n        \"version\": {\n          \"type\": \"string\",\n          \"description\": \"Version of the module.\\nOnly for module available through a Go proxy.\"\n        },\n        \"path\": {\n          \"type\": \"string\",\n          \"description\": \"Path to the local module.\\nOnly for local module.\"\n        }\n      },\n      \"additionalProperties\": false,\n      \"type\": \"object\",\n      \"required\": [\n        \"module\"\n      ],\n      \"description\": \"Plugin represents information about a plugin.\"\n    }\n  },\n  \"description\": \"mygcl configuration definition file\"\n}"
  },
  {
    "path": "jsonschema/golangci.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupOption\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\",\n        \"zeroByteRepeat\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\",\n        \"require-stdlib-doclink\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G116\",\n        \"G117\",\n        \"G118\",\n        \"G119\",\n        \"G120\",\n        \"G121\",\n        \"G122\",\n        \"G123\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G408\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\",\n        \"G701\",\n        \"G702\",\n        \"G703\",\n        \"G704\",\n        \"G705\",\n        \"G706\",\n        \"G707\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"epoch-naming\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"forbidden-call-in-wg-go\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"inefficient-map-lookup\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-naming\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-if\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-slices-sort\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"modernize-analyzers\": {\n      \"enum\": [\n        \"any\",\n        \"fmtappendf\",\n        \"forvar\",\n        \"mapsloop\",\n        \"minmax\",\n        \"newexpr\",\n        \"omitzero\",\n        \"plusbuild\",\n        \"rangeint\",\n        \"reflecttypefor\",\n        \"slicescontains\",\n        \"slicessort\",\n        \"stditerators\",\n        \"stringscut\",\n        \"stringscutprefix\",\n        \"stringsseq\",\n        \"stringsbuilder\",\n        \"testingcontext\",\n        \"unsafefuncs\",\n        \"waitgroup\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\",\n        \"after-block\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"modernize\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            },\n            \"comments-only\": {\n              \"description\": \"Checks only comments, skip strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `//`, `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            },\n            \"check-module-path\": {\n              \"description\": \"Check the validity of the module path.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"modernizeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable\": {\n              \"description\": \"List of analyzers to disable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/modernize-analyzers\"\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"concat-loop\": {\n              \"description\": \"Enable/disable optimization of concat loop.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"loop-other-ops\": {\n              \"description\": \"Optimization of `concat-loop` even with other operations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-default-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-aliased-wildcard\": {\n              \"description\": \"Enable aliased wildcard detection like SELECT t.*.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-concat\": {\n              \"description\": \"Enable string concatenation analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-format-strings\": {\n              \"description\": \"Enable format string analysis like fmt.Sprintf.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-builder\": {\n              \"description\": \"Enable strings.Builder analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-subqueries\": {\n              \"description\": \"Enable subquery analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-n1\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-sql-injection\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-tx-leaks\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow\": {\n              \"description\": \"Allow is a list of SQL patterns to allow (whitelist).\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Functions to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"sql-builders\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"squirrel\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"gorm\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"ent\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"pgx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"bun\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlboiler\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"jet\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"custom-rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"id\": {\n                    \"type\": \"string\"\n                  },\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"patterns\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"when\": {\n                    \"type\": \"string\"\n                  },\n                  \"message\": {\n                    \"type\": \"string\"\n                  },\n                  \"action\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"enable-build-vcs\": {\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"modernize\": {\n              \"$ref\": \"#/definitions/settings/definitions/modernizeSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Apply the fixes detected by the linters and formatters (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.next.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupOption\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\",\n        \"zeroByteRepeat\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\",\n        \"require-stdlib-doclink\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G116\",\n        \"G117\",\n        \"G118\",\n        \"G119\",\n        \"G120\",\n        \"G121\",\n        \"G122\",\n        \"G123\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G408\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\",\n        \"G701\",\n        \"G702\",\n        \"G703\",\n        \"G704\",\n        \"G705\",\n        \"G706\",\n        \"G707\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"epoch-naming\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"forbidden-call-in-wg-go\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"inefficient-map-lookup\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-naming\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-if\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-slices-sort\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"modernize-analyzers\": {\n      \"enum\": [\n        \"any\",\n        \"fmtappendf\",\n        \"forvar\",\n        \"mapsloop\",\n        \"minmax\",\n        \"newexpr\",\n        \"omitzero\",\n        \"plusbuild\",\n        \"rangeint\",\n        \"reflecttypefor\",\n        \"slicescontains\",\n        \"slicessort\",\n        \"stditerators\",\n        \"stringscut\",\n        \"stringscutprefix\",\n        \"stringsseq\",\n        \"stringsbuilder\",\n        \"testingcontext\",\n        \"unsafefuncs\",\n        \"waitgroup\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\",\n        \"after-block\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"modernize\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            },\n            \"comments-only\": {\n              \"description\": \"Checks only comments, skip strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `//`, `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            },\n            \"check-module-path\": {\n              \"description\": \"Check the validity of the module path.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"modernizeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable\": {\n              \"description\": \"List of analyzers to disable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/modernize-analyzers\"\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"concat-loop\": {\n              \"description\": \"Enable/disable optimization of concat loop.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"loop-other-ops\": {\n              \"description\": \"Optimization of `concat-loop` even with other operations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-default-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-aliased-wildcard\": {\n              \"description\": \"Enable aliased wildcard detection like SELECT t.*.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-concat\": {\n              \"description\": \"Enable string concatenation analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-format-strings\": {\n              \"description\": \"Enable format string analysis like fmt.Sprintf.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-builder\": {\n              \"description\": \"Enable strings.Builder analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-subqueries\": {\n              \"description\": \"Enable subquery analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-n1\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-sql-injection\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-tx-leaks\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow\": {\n              \"description\": \"Allow is a list of SQL patterns to allow (whitelist).\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Functions to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"sql-builders\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"squirrel\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"gorm\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"ent\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"pgx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"bun\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlboiler\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"jet\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"custom-rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"id\": {\n                    \"type\": \"string\"\n                  },\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"patterns\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"when\": {\n                    \"type\": \"string\"\n                  },\n                  \"message\": {\n                    \"type\": \"string\"\n                  },\n                  \"action\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"enable-build-vcs\": {\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"modernize\": {\n              \"$ref\": \"#/definitions/settings/definitions/modernizeSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Apply the fixes detected by the linters and formatters (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.57.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"commentFormatting\",\n        \"defaultCaseOrder\",\n        \"deferUnlambda\",\n        \"deferInLoop\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringsCompare\",\n        \"stringXbytes\",\n        \"suspiciousSorting\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeCmpSimplify\",\n        \"timeExprSimplify\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"deadcode\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"execinquery\",\n            \"exhaustive\",\n            \"exhaustivestruct\",\n            \"exhaustruct\",\n            \"exportloopref\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"goerr113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"golint\",\n            \"gomnd\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"ifshort\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"interfacer\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"maligned\",\n            \"mirror\",\n            \"misspell\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosnakecase\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"scopelint\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"structcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"typecheck\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"varcheck\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"github-actions\",\n                  \"teamcity\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore\": {\n              \"description\": \"DEPRECATED: use `exclude-functions` instead. Comma-separated list of pairs of the form \\\"pkg:regex\\\".\",\n              \"type\": \"string\",\n              \"default\": \"fmt:.*\"\n            },\n            \"exclude\": {\n              \"description\": \"DEPRECATED: use `exclude-functions` instead. Path to a file containing a list of functions to exclude from checking.\",\n              \"type\": \"string\",\n              \"examples\": [\"/path/to/file.txt\"]\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print.*$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"DEPRECATED: use 'sections' and 'prefix(github.com/org/project)' instead.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            },\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"lang-version\": {\n              \"description\": \"Select the Go version to target.\",\n              \"type\": \"string\",\n              \"default\": \"1.15\"\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"go\": {\n              \"description\": \"Targeted Go version\",\n              \"type\": \"string\",\n              \"default\": \"1.13\"\n            },\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"Order of return types to check.\",\n              \"items\": {\n                \"enum\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\"]\n              },\n              \"default\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context-only\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"go\": {\n              \"description\": \"Targeted Go version\",\n              \"type\": \"string\",\n              \"default\": \"1.13\"\n            },\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"go\": {\n              \"description\": \"Targeted Go version\",\n              \"type\": \"string\",\n              \"default\": \"1.13\"\n            },\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"enum\": [\n                        \"camel\",\n                        \"pascal\",\n                        \"kebab\",\n                        \"snake\",\n                        \"goCamel\",\n                        \"goPascal\",\n                        \"goKebab\",\n                        \"goSnake\",\n                        \"upper\",\n                        \"upperSnake\",\n                        \"lower\",\n                        \"header\"\n                      ]\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"go-require\",\n                  \"float-compare\",\n                  \"len\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              }\n            },\n            \"disable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"go-require\",\n                  \"float-compare\",\n                  \"len\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"]\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-dev-null\": {\n              \"description\": \"Suggest the use of os.DevNull.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"syslog-priority\": {\n              \"description\": \"Suggest the use of syslog.Priority.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated-strict\": {\n          \"description\": \"To follow strict Go generated file convention\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.58.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"commentFormatting\",\n        \"defaultCaseOrder\",\n        \"deferUnlambda\",\n        \"deferInLoop\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringsCompare\",\n        \"stringXbytes\",\n        \"suspiciousSorting\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeCmpSimplify\",\n        \"timeExprSimplify\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"deadcode\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"execinquery\",\n            \"exhaustive\",\n            \"exhaustivestruct\",\n            \"exhaustruct\",\n            \"exportloopref\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"golint\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"ifshort\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"interfacer\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"maligned\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosnakecase\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"scopelint\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"structcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"typecheck\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"varcheck\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"github-actions\",\n                  \"teamcity\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print.*$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"Order of return types to check.\",\n              \"items\": {\n                \"enum\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\"]\n              },\n              \"default\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"enum\": [\n                        \"camel\",\n                        \"pascal\",\n                        \"kebab\",\n                        \"snake\",\n                        \"goCamel\",\n                        \"goPascal\",\n                        \"goKebab\",\n                        \"goSnake\",\n                        \"upper\",\n                        \"upperSnake\",\n                        \"lower\",\n                        \"header\"\n                      ]\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"go-require\",\n                  \"float-compare\",\n                  \"len\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              }\n            },\n            \"disable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"go-require\",\n                  \"float-compare\",\n                  \"len\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"]\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated-strict\": {\n          \"description\": \"To follow strict Go generated file convention\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.59.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"commentFormatting\",\n        \"defaultCaseOrder\",\n        \"deferUnlambda\",\n        \"deferInLoop\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringsCompare\",\n        \"stringXbytes\",\n        \"suspiciousSorting\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeCmpSimplify\",\n        \"timeExprSimplify\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-import-alias\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"deadcode\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"execinquery\",\n            \"exhaustive\",\n            \"exhaustivestruct\",\n            \"exhaustruct\",\n            \"exportloopref\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"golint\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"ifshort\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"interfacer\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"maligned\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosnakecase\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"scopelint\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"structcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"typecheck\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"varcheck\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"github-actions\",\n                  \"teamcity\",\n                  \"sarif\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print.*$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"enum\": [\n                        \"camel\",\n                        \"pascal\",\n                        \"kebab\",\n                        \"snake\",\n                        \"goCamel\",\n                        \"goPascal\",\n                        \"goKebab\",\n                        \"goSnake\",\n                        \"upper\",\n                        \"upperSnake\",\n                        \"lower\",\n                        \"header\"\n                      ]\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"empty\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"require-error\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated\": {\n          \"description\": \"Mode of the generated files analysis.\",\n          \"enum\": [\"lax\", \"strict\", \"disable\"],\n          \"default\": \"lax\"\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.60.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"commentFormatting\",\n        \"defaultCaseOrder\",\n        \"deferUnlambda\",\n        \"deferInLoop\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringsCompare\",\n        \"stringXbytes\",\n        \"suspiciousSorting\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeCmpSimplify\",\n        \"timeExprSimplify\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-import-alias\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"deadcode\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"execinquery\",\n            \"exhaustive\",\n            \"exhaustivestruct\",\n            \"exhaustruct\",\n            \"exportloopref\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"golint\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"ifshort\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"interfacer\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"maligned\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosnakecase\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"scopelint\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"structcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"typecheck\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"varcheck\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"github-actions\",\n                  \"teamcity\",\n                  \"sarif\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print.*$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"enum\": [\n                        \"camel\",\n                        \"pascal\",\n                        \"kebab\",\n                        \"snake\",\n                        \"goCamel\",\n                        \"goPascal\",\n                        \"goKebab\",\n                        \"goSnake\",\n                        \"upper\",\n                        \"upperSnake\",\n                        \"lower\",\n                        \"header\"\n                      ]\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"empty\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"float-compare\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions if format string is used.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated\": {\n          \"description\": \"Mode of the generated files analysis.\",\n          \"enum\": [\"lax\", \"strict\", \"disable\"],\n          \"default\": \"lax\"\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.61.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"commentFormatting\",\n        \"defaultCaseOrder\",\n        \"deferUnlambda\",\n        \"deferInLoop\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringsCompare\",\n        \"stringXbytes\",\n        \"suspiciousSorting\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeCmpSimplify\",\n        \"timeExprSimplify\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-import-alias\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"deadcode\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"execinquery\",\n            \"exhaustive\",\n            \"exhaustivestruct\",\n            \"exhaustruct\",\n            \"exportloopref\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"golint\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"ifshort\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"interfacer\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"maligned\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosnakecase\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"scopelint\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"structcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"varcheck\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"junit-xml-extended\",\n                  \"github-actions\",\n                  \"teamcity\",\n                  \"sarif\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print(ln)?$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"ptr\", \"func\", \"iface\", \"map\", \"chan\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"enum\": [\n                        \"camel\",\n                        \"pascal\",\n                        \"kebab\",\n                        \"snake\",\n                        \"goCamel\",\n                        \"goPascal\",\n                        \"goKebab\",\n                        \"goSnake\",\n                        \"upper\",\n                        \"upperSnake\",\n                        \"lower\",\n                        \"header\"\n                      ]\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"empty\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"float-compare\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"empty\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions if format string is used.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated\": {\n          \"description\": \"Mode of the generated files analysis.\",\n          \"enum\": [\"lax\", \"strict\", \"disable\"],\n          \"default\": \"lax\"\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.62.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-import-alias\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exportloopref\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"junit-xml-extended\",\n                  \"github-actions\",\n                  \"teamcity\",\n                  \"sarif\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print(ln)?$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtype\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iface\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"enum\": [\n                        \"camel\",\n                        \"pascal\",\n                        \"kebab\",\n                        \"snake\",\n                        \"goCamel\",\n                        \"goPascal\",\n                        \"goKebab\",\n                        \"goSnake\",\n                        \"upper\",\n                        \"upperSnake\",\n                        \"lower\",\n                        \"header\"\n                      ]\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated\": {\n          \"description\": \"Mode of the generated files analysis.\",\n          \"enum\": [\"lax\", \"strict\", \"disable\"],\n          \"default\": \"lax\"\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.63.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-import-alias\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exportloopref\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"junit-xml-extended\",\n                  \"github-actions\",\n                  \"teamcity\",\n                  \"sarif\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print(ln)?$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtype\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iface\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetesting\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated\": {\n          \"description\": \"Mode of the generated files analysis.\",\n          \"enum\": [\"lax\", \"strict\", \"disable\"],\n          \"default\": \"lax\"\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.64.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"junit-xml-extended\",\n                  \"github-actions\",\n                  \"teamcity\",\n                  \"sarif\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"fatcontext\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print(ln)?$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtype\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iface\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetesting\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"lax\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"stdErrorHandling\",\n                  \"commonFalsePositives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linters\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated\": {\n          \"description\": \"Mode of the generated files analysis.\",\n          \"enum\": [\"lax\", \"strict\", \"disable\"],\n          \"default\": \"lax\"\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"EXC0001\",\n              \"EXC0002\",\n              \"EXC0003\",\n              \"EXC0004\",\n              \"EXC0005\",\n              \"EXC0006\",\n              \"EXC0007\",\n              \"EXC0008\",\n              \"EXC0009\",\n              \"EXC0010\",\n              \"EXC0011\",\n              \"EXC0012\",\n              \"EXC0013\",\n              \"EXC0014\",\n              \"EXC0015\"\n            ]\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v1.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"linters\": {\n      \"$comment\": \"anyOf with enum is used to allow auto completion of non-custom linters\",\n      \"description\": \"Linters usable.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"gci\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"gofmt\",\n            \"gofumpt\",\n            \"goheader\",\n            \"goimports\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"tenv\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"default\": \"stdout\",\n                \"anyOf\": [\n                  {\n                    \"enum\": [ \"stdout\", \"stderr\" ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"format\": {\n                \"default\": \"colored-line-number\",\n                \"enum\": [\n                  \"colored-line-number\",\n                  \"line-number\",\n                  \"json\",\n                  \"colored-tab\",\n                  \"tab\",\n                  \"html\",\n                  \"checkstyle\",\n                  \"code-climate\",\n                  \"junit-xml\",\n                  \"junit-xml-extended\",\n                  \"github-actions\",\n                  \"teamcity\",\n                  \"sarif\"\n                ]\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"print-issued-lines\": {\n          \"description\": \"Print lines of code with issue.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"print-linter-name\": {\n          \"description\": \"Print linter name in the end of issue text.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        },\n        \"sort-results\": {\n          \"description\": \"Sort results by: filepath, line and column.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        }\n      }\n    },\n    \"linters-settings\": {\n      \"description\": \"All available settings of specific linters.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"dupword\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-test\": {\n              \"description\": \"Ignore *_test.go files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"bidichk\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclop\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-tests\": {\n              \"description\": \"Should the linter execute on test files as well\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorder\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsled\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"dupl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjson\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"check-generated\": {\n              \"description\": \"Check switch statements in generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustruct\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"fatcontext\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"examples\": [\"^print(ln)?$\"],\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"p\": {\n                        \"description\": \"Pattern\",\n                        \"type\": \"string\"\n                      },\n                      \"pkg\": {\n                        \"description\": \"Package\",\n                        \"type\": \"string\"\n                      },\n                      \"msg\": {\n                        \"description\": \"Message\",\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"funlen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gci\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"skip-generated\": {\n              \"description\": \"Skip generated files.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtype\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognit\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconst\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocritic\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocyclo\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godot\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godox\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"interfacebloat\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumpt\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheader\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimports\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.\",\n              \"type\": \"string\",\n              \"examples\": [\"github.com/org/project\"]\n            }\n          }\n        },\n        \"gomoddirectives\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguard\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local_replace_directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosimple\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"gosec\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"exclude-generated\": {\n              \"description\": \"Exclude generated files\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitan\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-tests\": {\n              \"description\": \"Ignore test files.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govet\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iface\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importas\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lll\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidx\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezero\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspell\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-words\": {\n              \"description\": \"List of words to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedret\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestif\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnil\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturn\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mnd\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linters\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturns\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltest\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"prealloc\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclared\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"Comma-separated list of predeclared identifiers to not report on.\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Include method names and field names (i.e., qualified names) in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetter\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"revive\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"ignore-generated-header\": {\n              \"type\": \"boolean\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"stylecheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"all\"]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\n                \"all\",\n                \"-ST1000\",\n                \"-ST1003\",\n                \"-ST1016\",\n                \"-ST1020\",\n                \"-ST1021\",\n                \"-ST1022\"\n              ]\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalign\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelle\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"tenv\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"all\": {\n              \"description\": \"The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"testifylint\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackage\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelper\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvars\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetesting\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvert\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparam\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unused\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelen\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespace\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheck\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreSigRegexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignorePackageGlobs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignoreInterfaceRegexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wsl\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvar\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"custom\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linters\"\n          }\n        },\n        \"enable-all\": {\n          \"description\": \"Whether to enable all linters. You can re-disable them with `disable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"disable-all\": {\n          \"description\": \"Whether to disable all linters. You can re-enable them with `enable` explicitly.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"presets\": {\n          \"description\": \"Allow to use different presets of linters\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"bugs\",\n              \"comment\",\n              \"complexity\",\n              \"error\",\n              \"format\",\n              \"import\",\n              \"metalinter\",\n              \"module\",\n              \"performance\",\n              \"sql\",\n              \"style\",\n              \"test\",\n              \"unused\"\n            ]\n          }\n        },\n        \"fast\": {\n          \"description\": \"Enable run of fast linters.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"lax\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"stdErrorHandling\",\n                  \"commonFalsePositives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linters\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"exclude\": {\n          \"description\": \"List of regular expressions of issue texts to exclude.\\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"exclude-rules\": {\n          \"description\": \"Exclude configuration per-path, per-linter, per-text and per-source\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"exclude-use-default\": {\n          \"description\": \"Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-case-sensitive\": {\n          \"description\": \"If set to true, exclude and exclude-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"exclude-generated\": {\n          \"description\": \"Mode of the generated files analysis.\",\n          \"enum\": [\"lax\", \"strict\", \"disable\"],\n          \"default\": \"lax\"\n        },\n        \"exclude-dirs\": {\n          \"description\": \"Which directories to exclude: issues from them won't be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. The regexp is applied on the full path.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\"generated.*\"]\n          },\n          \"default\": [],\n          \"examples\": [[\"src/external_libs\", \"autogenerated_by_my_lib\"]]\n        },\n        \"exclude-dirs-use-default\": {\n          \"description\": \"Enable exclusion of directories \\\"vendor\\\", \\\"third_party\\\", \\\"testdata\\\", \\\"examples\\\", \\\"Godeps\\\", and \\\"builtin\\\".\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"exclude-files\": {\n          \"description\": \"Which files to exclude: they will be analyzed, but issues from them will not be reported.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"description\": \"You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\\n\\\"/\\\" will be replaced by current OS file path separator to properly work on Windows.\",\n            \"type\": \"string\",\n            \"examples\": [\".*\\\\.my\\\\.go$\"]\n          },\n          \"default\": [],\n          \"examples\": [[\".*\\\\.my\\\\.go$\", \"lib/bad.go\"]]\n        },\n        \"include\": {\n          \"description\": \"The list of ids of default excludes to include or disable.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\n              \"EXC0001\",\n              \"EXC0002\",\n              \"EXC0003\",\n              \"EXC0004\",\n              \"EXC0005\",\n              \"EXC0006\",\n              \"EXC0007\",\n              \"EXC0008\",\n              \"EXC0009\",\n              \"EXC0010\",\n              \"EXC0011\",\n              \"EXC0012\",\n              \"EXC0013\",\n              \"EXC0014\",\n              \"EXC0015\"\n            ]\n          },\n          \"default\": []\n        },\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default-severity\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"case-sensitive\": {\n          \"description\": \"If set to true, severity-rules regular expressions become case sensitive.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linters\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default-severity\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.0.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G113\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-strings\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"string\"\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.1.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.10.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupOption\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\",\n        \"zeroByteRepeat\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\",\n        \"require-stdlib-doclink\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G116\",\n        \"G117\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\",\n        \"G701\",\n        \"G702\",\n        \"G703\",\n        \"G704\",\n        \"G705\",\n        \"G706\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"epoch-naming\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"forbidden-call-in-wg-go\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"inefficient-map-lookup\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-if\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-slices-sort\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"modernize-analyzers\": {\n      \"enum\": [\n        \"any\",\n        \"fmtappendf\",\n        \"forvar\",\n        \"mapsloop\",\n        \"minmax\",\n        \"newexpr\",\n        \"omitzero\",\n        \"plusbuild\",\n        \"rangeint\",\n        \"reflecttypefor\",\n        \"slicescontains\",\n        \"slicessort\",\n        \"stditerators\",\n        \"stringscut\",\n        \"stringscutprefix\",\n        \"stringsseq\",\n        \"stringsbuilder\",\n        \"testingcontext\",\n        \"unsafefuncs\",\n        \"waitgroup\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\",\n        \"after-block\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"modernize\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            },\n            \"comments-only\": {\n              \"description\": \"Checks only comments, skip strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `//`, `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            },\n            \"check-module-path\": {\n              \"description\": \"Check the validity of the module path.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"modernizeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable\": {\n              \"description\": \"List of analyzers to disable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/modernize-analyzers\"\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"concat-loop\": {\n              \"description\": \"Enable/disable optimization of concat loop.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"loop-other-ops\": {\n              \"description\": \"Optimization of `concat-loop` even with other operations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-default-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-aliased-wildcard\": {\n              \"description\": \"Enable aliased wildcard detection like SELECT t.*.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-concat\": {\n              \"description\": \"Enable string concatenation analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-format-strings\": {\n              \"description\": \"Enable format string analysis like fmt.Sprintf.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-builder\": {\n              \"description\": \"Enable strings.Builder analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-subqueries\": {\n              \"description\": \"Enable subquery analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-n1\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-sql-injection\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-tx-leaks\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow\": {\n              \"description\": \"Allow is a list of SQL patterns to allow (whitelist).\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Functions to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"sql-builders\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"squirrel\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"gorm\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"ent\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"pgx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"bun\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlboiler\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"jet\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"custom-rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"id\": {\n                    \"type\": \"string\"\n                  },\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"patterns\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"when\": {\n                    \"type\": \"string\"\n                  },\n                  \"message\": {\n                    \"type\": \"string\"\n                  },\n                  \"action\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"enable-build-vcs\": {\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"modernize\": {\n              \"$ref\": \"#/definitions/settings/definitions/modernizeSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Apply the fixes detected by the linters and formatters (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.2.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.3.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.4.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"useless-break\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.5.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"ioutilDeprecated\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Fix found issues (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.6.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupOption\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\",\n        \"zeroByteRepeat\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"modernize-analyzers\": {\n      \"enum\": [\n        \"any\",\n        \"bloop\",\n        \"fmtappendf\",\n        \"forvar\",\n        \"mapsloop\",\n        \"minmax\",\n        \"newexpr\",\n        \"omitzero\",\n        \"rangeint\",\n        \"reflecttypefor\",\n        \"slicescontains\",\n        \"slicessort\",\n        \"stditerators\",\n        \"stringscutprefix\",\n        \"stringsseq\",\n        \"stringsbuilder\",\n        \"testingcontext\",\n        \"waitgroup\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"modernize\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            },\n            \"comments-only\": {\n              \"description\": \"Checks only comments, skip strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"modernizeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable\": {\n              \"description\": \"List of analyzers to disable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/modernize-analyzers\"\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"concat-loop\": {\n              \"description\": \"Enable/disable optimization of concat loop.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"loop-other-ops\": {\n              \"description\": \"Optimization of `concat-loop` even with other operations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"modernize\": {\n              \"$ref\": \"#/definitions/settings/definitions/modernizeSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Apply the fixes detected by the linters and formatters (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.7.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupOption\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\",\n        \"zeroByteRepeat\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"forbidden-call-in-wg-go\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"inefficient-map-lookup\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-if\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"modernize-analyzers\": {\n      \"enum\": [\n        \"any\",\n        \"bloop\",\n        \"fmtappendf\",\n        \"forvar\",\n        \"mapsloop\",\n        \"minmax\",\n        \"newexpr\",\n        \"omitzero\",\n        \"plusbuild\",\n        \"rangeint\",\n        \"reflecttypefor\",\n        \"slicescontains\",\n        \"slicessort\",\n        \"stditerators\",\n        \"stringscutprefix\",\n        \"stringsseq\",\n        \"stringsbuilder\",\n        \"testingcontext\",\n        \"waitgroup\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"modernize\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            },\n            \"comments-only\": {\n              \"description\": \"Checks only comments, skip strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"modernizeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable\": {\n              \"description\": \"List of analyzers to disable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/modernize-analyzers\"\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"concat-loop\": {\n              \"description\": \"Enable/disable optimization of concat loop.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"loop-other-ops\": {\n              \"description\": \"Optimization of `concat-loop` even with other operations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-default-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"modernize\": {\n              \"$ref\": \"#/definitions/settings/definitions/modernizeSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Apply the fixes detected by the linters and formatters (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.8.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupOption\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\",\n        \"zeroByteRepeat\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\",\n        \"require-stdlib-doclink\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G116\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"forbidden-call-in-wg-go\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"inefficient-map-lookup\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-if\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"modernize-analyzers\": {\n      \"enum\": [\n        \"any\",\n        \"bloop\",\n        \"fmtappendf\",\n        \"forvar\",\n        \"mapsloop\",\n        \"minmax\",\n        \"newexpr\",\n        \"omitzero\",\n        \"plusbuild\",\n        \"rangeint\",\n        \"reflecttypefor\",\n        \"slicescontains\",\n        \"slicessort\",\n        \"stditerators\",\n        \"stringscut\",\n        \"stringscutprefix\",\n        \"stringsseq\",\n        \"stringsbuilder\",\n        \"testingcontext\",\n        \"unsafefuncs\",\n        \"waitgroup\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"modernize\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            },\n            \"comments-only\": {\n              \"description\": \"Checks only comments, skip strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `//`, `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            },\n            \"check-module-path\": {\n              \"description\": \"Check the validity of the module path.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"modernizeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable\": {\n              \"description\": \"List of analyzers to disable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/modernize-analyzers\"\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"concat-loop\": {\n              \"description\": \"Enable/disable optimization of concat loop.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"loop-other-ops\": {\n              \"description\": \"Optimization of `concat-loop` even with other operations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-default-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-aliased-wildcard\": {\n              \"description\": \"Enable aliased wildcard detection like SELECT t.*.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-concat\": {\n              \"description\": \"Enable string concatenation analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-format-strings\": {\n              \"description\": \"Enable format string analysis like fmt.Sprintf.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-builder\": {\n              \"description\": \"Enable strings.Builder analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-subqueries\": {\n              \"description\": \"Enable subquery analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Functions to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"sql-builders\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"squirrel\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"gorm\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"ent\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"pgx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"bun\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlboiler\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"jet\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"modernize\": {\n              \"$ref\": \"#/definitions/settings/definitions/modernizeSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Apply the fixes detected by the linters and formatters (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "jsonschema/golangci.v2.9.jsonschema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://json.schemastore.org/golangci-lint.json\",\n  \"definitions\": {\n    \"gocritic-checks\": {\n      \"enum\": [\n        \"appendAssign\",\n        \"appendCombine\",\n        \"argOrder\",\n        \"assignOp\",\n        \"badCall\",\n        \"badCond\",\n        \"badLock\",\n        \"badRegexp\",\n        \"badSorting\",\n        \"badSyncOnceFunc\",\n        \"boolExprSimplify\",\n        \"builtinShadow\",\n        \"builtinShadowDecl\",\n        \"captLocal\",\n        \"caseOrder\",\n        \"codegenComment\",\n        \"commentFormatting\",\n        \"commentedOutCode\",\n        \"commentedOutImport\",\n        \"defaultCaseOrder\",\n        \"deferInLoop\",\n        \"deferUnlambda\",\n        \"deprecatedComment\",\n        \"docStub\",\n        \"dupArg\",\n        \"dupBranchBody\",\n        \"dupCase\",\n        \"dupImport\",\n        \"dupOption\",\n        \"dupSubExpr\",\n        \"dynamicFmtString\",\n        \"elseif\",\n        \"emptyDecl\",\n        \"emptyFallthrough\",\n        \"emptyStringTest\",\n        \"equalFold\",\n        \"evalOrder\",\n        \"exitAfterDefer\",\n        \"exposedSyncMutex\",\n        \"externalErrorReassign\",\n        \"filepathJoin\",\n        \"flagDeref\",\n        \"flagName\",\n        \"hexLiteral\",\n        \"httpNoBody\",\n        \"hugeParam\",\n        \"ifElseChain\",\n        \"importShadow\",\n        \"indexAlloc\",\n        \"initClause\",\n        \"mapKey\",\n        \"methodExprCall\",\n        \"nestingReduce\",\n        \"newDeref\",\n        \"nilValReturn\",\n        \"octalLiteral\",\n        \"offBy1\",\n        \"paramTypeCombine\",\n        \"preferDecodeRune\",\n        \"preferFilepathJoin\",\n        \"preferFprint\",\n        \"preferStringWriter\",\n        \"preferWriteByte\",\n        \"ptrToRefParam\",\n        \"rangeAppendAll\",\n        \"rangeExprCopy\",\n        \"rangeValCopy\",\n        \"redundantSprint\",\n        \"regexpMust\",\n        \"regexpPattern\",\n        \"regexpSimplify\",\n        \"returnAfterHttpError\",\n        \"ruleguard\",\n        \"singleCaseSwitch\",\n        \"sliceClear\",\n        \"sloppyLen\",\n        \"sloppyReassign\",\n        \"sloppyTypeAssert\",\n        \"sortSlice\",\n        \"sprintfQuotedString\",\n        \"sqlQuery\",\n        \"stringConcatSimplify\",\n        \"stringXbytes\",\n        \"stringsCompare\",\n        \"switchTrue\",\n        \"syncMapLoadAndDelete\",\n        \"timeExprSimplify\",\n        \"todoCommentWithoutDetail\",\n        \"tooManyResultsChecker\",\n        \"truncateCmp\",\n        \"typeAssertChain\",\n        \"typeDefFirst\",\n        \"typeSwitchVar\",\n        \"typeUnparen\",\n        \"uncheckedInlineErr\",\n        \"underef\",\n        \"unlabelStmt\",\n        \"unlambda\",\n        \"unnamedResult\",\n        \"unnecessaryBlock\",\n        \"unnecessaryDefer\",\n        \"unslice\",\n        \"valSwap\",\n        \"weakCond\",\n        \"whyNoLint\",\n        \"wrapperFunc\",\n        \"yodaStyleExpr\",\n        \"zeroByteRepeat\"\n      ]\n    },\n    \"gocritic-tags\": {\n      \"enum\": [\n        \"diagnostic\",\n        \"style\",\n        \"performance\",\n        \"experimental\",\n        \"opinionated\",\n        \"security\"\n      ]\n    },\n    \"staticcheck-checks\": {\n      \"enum\": [\n        \"*\",\n        \"all\",\n        \"SA*\",\n        \"-SA*\",\n        \"SA1*\",\n        \"-SA1*\",\n        \"SA1000\",\n        \"-SA1000\",\n        \"SA1001\",\n        \"-SA1001\",\n        \"SA1002\",\n        \"-SA1002\",\n        \"SA1003\",\n        \"-SA1003\",\n        \"SA1004\",\n        \"-SA1004\",\n        \"SA1005\",\n        \"-SA1005\",\n        \"SA1006\",\n        \"-SA1006\",\n        \"SA1007\",\n        \"-SA1007\",\n        \"SA1008\",\n        \"-SA1008\",\n        \"SA1010\",\n        \"-SA1010\",\n        \"SA1011\",\n        \"-SA1011\",\n        \"SA1012\",\n        \"-SA1012\",\n        \"SA1013\",\n        \"-SA1013\",\n        \"SA1014\",\n        \"-SA1014\",\n        \"SA1015\",\n        \"-SA1015\",\n        \"SA1016\",\n        \"-SA1016\",\n        \"SA1017\",\n        \"-SA1017\",\n        \"SA1018\",\n        \"-SA1018\",\n        \"SA1019\",\n        \"-SA1019\",\n        \"SA1020\",\n        \"-SA1020\",\n        \"SA1021\",\n        \"-SA1021\",\n        \"SA1023\",\n        \"-SA1023\",\n        \"SA1024\",\n        \"-SA1024\",\n        \"SA1025\",\n        \"-SA1025\",\n        \"SA1026\",\n        \"-SA1026\",\n        \"SA1027\",\n        \"-SA1027\",\n        \"SA1028\",\n        \"-SA1028\",\n        \"SA1029\",\n        \"-SA1029\",\n        \"SA1030\",\n        \"-SA1030\",\n        \"SA1031\",\n        \"-SA1031\",\n        \"SA1032\",\n        \"-SA1032\",\n        \"SA2*\",\n        \"-SA2*\",\n        \"SA2000\",\n        \"-SA2000\",\n        \"SA2001\",\n        \"-SA2001\",\n        \"SA2002\",\n        \"-SA2002\",\n        \"SA2003\",\n        \"-SA2003\",\n        \"SA3*\",\n        \"-SA3*\",\n        \"SA3000\",\n        \"-SA3000\",\n        \"SA3001\",\n        \"-SA3001\",\n        \"SA4*\",\n        \"-SA4*\",\n        \"SA4000\",\n        \"-SA4000\",\n        \"SA4001\",\n        \"-SA4001\",\n        \"SA4003\",\n        \"-SA4003\",\n        \"SA4004\",\n        \"-SA4004\",\n        \"SA4005\",\n        \"-SA4005\",\n        \"SA4006\",\n        \"-SA4006\",\n        \"SA4008\",\n        \"-SA4008\",\n        \"SA4009\",\n        \"-SA4009\",\n        \"SA4010\",\n        \"-SA4010\",\n        \"SA4011\",\n        \"-SA4011\",\n        \"SA4012\",\n        \"-SA4012\",\n        \"SA4013\",\n        \"-SA4013\",\n        \"SA4014\",\n        \"-SA4014\",\n        \"SA4015\",\n        \"-SA4015\",\n        \"SA4016\",\n        \"-SA4016\",\n        \"SA4017\",\n        \"-SA4017\",\n        \"SA4018\",\n        \"-SA4018\",\n        \"SA4019\",\n        \"-SA4019\",\n        \"SA4020\",\n        \"-SA4020\",\n        \"SA4021\",\n        \"-SA4021\",\n        \"SA4022\",\n        \"-SA4022\",\n        \"SA4023\",\n        \"-SA4023\",\n        \"SA4024\",\n        \"-SA4024\",\n        \"SA4025\",\n        \"-SA4025\",\n        \"SA4026\",\n        \"-SA4026\",\n        \"SA4027\",\n        \"-SA4027\",\n        \"SA4028\",\n        \"-SA4028\",\n        \"SA4029\",\n        \"-SA4029\",\n        \"SA4030\",\n        \"-SA4030\",\n        \"SA4031\",\n        \"-SA4031\",\n        \"SA4032\",\n        \"-SA4032\",\n        \"SA5*\",\n        \"-SA5*\",\n        \"SA5000\",\n        \"-SA5000\",\n        \"SA5001\",\n        \"-SA5001\",\n        \"SA5002\",\n        \"-SA5002\",\n        \"SA5003\",\n        \"-SA5003\",\n        \"SA5004\",\n        \"-SA5004\",\n        \"SA5005\",\n        \"-SA5005\",\n        \"SA5007\",\n        \"-SA5007\",\n        \"SA5008\",\n        \"-SA5008\",\n        \"SA5009\",\n        \"-SA5009\",\n        \"SA5010\",\n        \"-SA5010\",\n        \"SA5011\",\n        \"-SA5011\",\n        \"SA5012\",\n        \"-SA5012\",\n        \"SA6*\",\n        \"-SA6*\",\n        \"SA6000\",\n        \"-SA6000\",\n        \"SA6001\",\n        \"-SA6001\",\n        \"SA6002\",\n        \"-SA6002\",\n        \"SA6003\",\n        \"-SA6003\",\n        \"SA6005\",\n        \"-SA6005\",\n        \"SA6006\",\n        \"-SA6006\",\n        \"SA9*\",\n        \"-SA9*\",\n        \"SA9001\",\n        \"-SA9001\",\n        \"SA9002\",\n        \"-SA9002\",\n        \"SA9003\",\n        \"-SA9003\",\n        \"SA9004\",\n        \"-SA9004\",\n        \"SA9005\",\n        \"-SA9005\",\n        \"SA9006\",\n        \"-SA9006\",\n        \"SA9007\",\n        \"-SA9007\",\n        \"SA9008\",\n        \"-SA9008\",\n        \"SA9009\",\n        \"-SA9009\",\n        \"ST*\",\n        \"-ST*\",\n        \"ST1*\",\n        \"-ST1*\",\n        \"ST1000\",\n        \"-ST1000\",\n        \"ST1001\",\n        \"-ST1001\",\n        \"ST1003\",\n        \"-ST1003\",\n        \"ST1005\",\n        \"-ST1005\",\n        \"ST1006\",\n        \"-ST1006\",\n        \"ST1008\",\n        \"-ST1008\",\n        \"ST1011\",\n        \"-ST1011\",\n        \"ST1012\",\n        \"-ST1012\",\n        \"ST1013\",\n        \"-ST1013\",\n        \"ST1015\",\n        \"-ST1015\",\n        \"ST1016\",\n        \"-ST1016\",\n        \"ST1017\",\n        \"-ST1017\",\n        \"ST1018\",\n        \"-ST1018\",\n        \"ST1019\",\n        \"-ST1019\",\n        \"ST1020\",\n        \"-ST1020\",\n        \"ST1021\",\n        \"-ST1021\",\n        \"ST1022\",\n        \"-ST1022\",\n        \"ST1023\",\n        \"-ST1023\",\n        \"S*\",\n        \"-S*\",\n        \"S1*\",\n        \"-S1*\",\n        \"S1000\",\n        \"-S1000\",\n        \"S1001\",\n        \"-S1001\",\n        \"S1002\",\n        \"-S1002\",\n        \"S1003\",\n        \"-S1003\",\n        \"S1004\",\n        \"-S1004\",\n        \"S1005\",\n        \"-S1005\",\n        \"S1006\",\n        \"-S1006\",\n        \"S1007\",\n        \"-S1007\",\n        \"S1008\",\n        \"-S1008\",\n        \"S1009\",\n        \"-S1009\",\n        \"S1010\",\n        \"-S1010\",\n        \"S1011\",\n        \"-S1011\",\n        \"S1012\",\n        \"-S1012\",\n        \"S1016\",\n        \"-S1016\",\n        \"S1017\",\n        \"-S1017\",\n        \"S1018\",\n        \"-S1018\",\n        \"S1019\",\n        \"-S1019\",\n        \"S1020\",\n        \"-S1020\",\n        \"S1021\",\n        \"-S1021\",\n        \"S1023\",\n        \"-S1023\",\n        \"S1024\",\n        \"-S1024\",\n        \"S1025\",\n        \"-S1025\",\n        \"S1028\",\n        \"-S1028\",\n        \"S1029\",\n        \"-S1029\",\n        \"S1030\",\n        \"-S1030\",\n        \"S1031\",\n        \"-S1031\",\n        \"S1032\",\n        \"-S1032\",\n        \"S1033\",\n        \"-S1033\",\n        \"S1034\",\n        \"-S1034\",\n        \"S1035\",\n        \"-S1035\",\n        \"S1036\",\n        \"-S1036\",\n        \"S1037\",\n        \"-S1037\",\n        \"S1038\",\n        \"-S1038\",\n        \"S1039\",\n        \"-S1039\",\n        \"S1040\",\n        \"-S1040\",\n        \"QF*\",\n        \"-QF*\",\n        \"QF1*\",\n        \"-QF1*\",\n        \"QF1001\",\n        \"-QF1001\",\n        \"QF1002\",\n        \"-QF1002\",\n        \"QF1003\",\n        \"-QF1003\",\n        \"QF1004\",\n        \"-QF1004\",\n        \"QF1005\",\n        \"-QF1005\",\n        \"QF1006\",\n        \"-QF1006\",\n        \"QF1007\",\n        \"-QF1007\",\n        \"QF1008\",\n        \"-QF1008\",\n        \"QF1009\",\n        \"-QF1009\",\n        \"QF1010\",\n        \"-QF1010\",\n        \"QF1011\",\n        \"-QF1011\",\n        \"QF1012\",\n        \"-QF1012\"\n      ]\n    },\n    \"godoclint-rules\": {\n      \"enum\": [\n        \"pkg-doc\",\n        \"single-pkg-doc\",\n        \"require-pkg-doc\",\n        \"start-with-name\",\n        \"require-doc\",\n        \"deprecated\",\n        \"max-len\",\n        \"no-unused-link\",\n        \"require-stdlib-doclink\"\n      ]\n    },\n    \"gosec-rules\": {\n      \"enum\": [\n        \"G101\",\n        \"G102\",\n        \"G103\",\n        \"G104\",\n        \"G106\",\n        \"G107\",\n        \"G108\",\n        \"G109\",\n        \"G110\",\n        \"G111\",\n        \"G112\",\n        \"G114\",\n        \"G115\",\n        \"G116\",\n        \"G201\",\n        \"G202\",\n        \"G203\",\n        \"G204\",\n        \"G301\",\n        \"G302\",\n        \"G303\",\n        \"G304\",\n        \"G305\",\n        \"G306\",\n        \"G307\",\n        \"G401\",\n        \"G402\",\n        \"G403\",\n        \"G404\",\n        \"G405\",\n        \"G406\",\n        \"G501\",\n        \"G502\",\n        \"G503\",\n        \"G504\",\n        \"G505\",\n        \"G506\",\n        \"G507\",\n        \"G601\",\n        \"G602\"\n      ]\n    },\n    \"govet-analyzers\": {\n      \"enum\": [\n        \"appends\",\n        \"asmdecl\",\n        \"assign\",\n        \"atomic\",\n        \"atomicalign\",\n        \"bools\",\n        \"buildtag\",\n        \"cgocall\",\n        \"composites\",\n        \"copylocks\",\n        \"deepequalerrors\",\n        \"defers\",\n        \"directive\",\n        \"errorsas\",\n        \"fieldalignment\",\n        \"findcall\",\n        \"framepointer\",\n        \"hostport\",\n        \"httpmux\",\n        \"httpresponse\",\n        \"ifaceassert\",\n        \"loopclosure\",\n        \"lostcancel\",\n        \"nilfunc\",\n        \"nilness\",\n        \"printf\",\n        \"reflectvaluecompare\",\n        \"shadow\",\n        \"shift\",\n        \"sigchanyzer\",\n        \"slog\",\n        \"sortslice\",\n        \"stdmethods\",\n        \"stdversion\",\n        \"stringintconv\",\n        \"structtag\",\n        \"testinggoroutine\",\n        \"tests\",\n        \"timeformat\",\n        \"unmarshal\",\n        \"unreachable\",\n        \"unsafeptr\",\n        \"unusedresult\",\n        \"unusedwrite\",\n        \"waitgroup\"\n      ]\n    },\n    \"revive-rules\": {\n      \"enum\": [\n        \"add-constant\",\n        \"argument-limit\",\n        \"atomic\",\n        \"banned-characters\",\n        \"bare-return\",\n        \"blank-imports\",\n        \"bool-literal-in-expr\",\n        \"call-to-gc\",\n        \"cognitive-complexity\",\n        \"comment-spacings\",\n        \"comments-density\",\n        \"confusing-naming\",\n        \"confusing-results\",\n        \"constant-logical-expr\",\n        \"context-as-argument\",\n        \"context-keys-type\",\n        \"cyclomatic\",\n        \"datarace\",\n        \"deep-exit\",\n        \"defer\",\n        \"dot-imports\",\n        \"duplicated-imports\",\n        \"early-return\",\n        \"empty-block\",\n        \"empty-lines\",\n        \"enforce-map-style\",\n        \"enforce-repeated-arg-type-style\",\n        \"enforce-slice-style\",\n        \"enforce-switch-style\",\n        \"epoch-naming\",\n        \"error-naming\",\n        \"error-return\",\n        \"error-strings\",\n        \"errorf\",\n        \"exported\",\n        \"file-header\",\n        \"file-length-limit\",\n        \"filename-format\",\n        \"flag-parameter\",\n        \"forbidden-call-in-wg-go\",\n        \"function-length\",\n        \"function-result-limit\",\n        \"get-return\",\n        \"identical-branches\",\n        \"identical-ifelseif-branches\",\n        \"identical-ifelseif-conditions\",\n        \"identical-switch-branches\",\n        \"identical-switch-conditions\",\n        \"if-return\",\n        \"import-alias-naming\",\n        \"import-shadowing\",\n        \"imports-blocklist\",\n        \"increment-decrement\",\n        \"indent-error-flow\",\n        \"inefficient-map-lookup\",\n        \"line-length-limit\",\n        \"max-control-nesting\",\n        \"max-public-structs\",\n        \"modifies-parameter\",\n        \"modifies-value-receiver\",\n        \"nested-structs\",\n        \"optimize-operands-order\",\n        \"package-comments\",\n        \"package-directory-mismatch\",\n        \"range-val-address\",\n        \"range-val-in-closure\",\n        \"range\",\n        \"receiver-naming\",\n        \"redefines-builtin-id\",\n        \"redundant-build-tag\",\n        \"redundant-import-alias\",\n        \"redundant-test-main-exit\",\n        \"string-format\",\n        \"string-of-int\",\n        \"struct-tag\",\n        \"superfluous-else\",\n        \"time-date\",\n        \"time-equal\",\n        \"time-naming\",\n        \"unchecked-type-assertion\",\n        \"unconditional-recursion\",\n        \"unexported-naming\",\n        \"unexported-return\",\n        \"unhandled-error\",\n        \"unnecessary-format\",\n        \"unnecessary-if\",\n        \"unnecessary-stmt\",\n        \"unreachable-code\",\n        \"unsecure-url-scheme\",\n        \"unused-parameter\",\n        \"unused-receiver\",\n        \"use-any\",\n        \"use-errors-new\",\n        \"use-fmt-print\",\n        \"use-slices-sort\",\n        \"use-waitgroup-go\",\n        \"useless-break\",\n        \"useless-fallthrough\",\n        \"var-declaration\",\n        \"var-naming\",\n        \"waitgroup-by-value\"\n      ]\n    },\n    \"iface-analyzers\": {\n      \"enum\": [\n        \"identical\",\n        \"unused\",\n        \"opaque\",\n        \"unexported\"\n      ]\n    },\n    \"tagliatelle-cases\": {\n      \"enum\": [\n        \"\",\n        \"camel\",\n        \"pascal\",\n        \"kebab\",\n        \"snake\",\n        \"goCamel\",\n        \"goPascal\",\n        \"goKebab\",\n        \"goSnake\",\n        \"upper\",\n        \"upperSnake\",\n        \"lower\",\n        \"header\"\n      ]\n    },\n    \"modernize-analyzers\": {\n      \"enum\": [\n        \"any\",\n        \"fmtappendf\",\n        \"forvar\",\n        \"mapsloop\",\n        \"minmax\",\n        \"newexpr\",\n        \"omitzero\",\n        \"plusbuild\",\n        \"rangeint\",\n        \"reflecttypefor\",\n        \"slicescontains\",\n        \"slicessort\",\n        \"stditerators\",\n        \"stringscut\",\n        \"stringscutprefix\",\n        \"stringsseq\",\n        \"stringsbuilder\",\n        \"testingcontext\",\n        \"unsafefuncs\",\n        \"waitgroup\"\n      ]\n    },\n    \"wsl-checks\": {\n      \"enum\": [\n        \"assign\",\n        \"branch\",\n        \"decl\",\n        \"defer\",\n        \"expr\",\n        \"for\",\n        \"go\",\n        \"if\",\n        \"inc-dec\",\n        \"label\",\n        \"range\",\n        \"return\",\n        \"select\",\n        \"send\",\n        \"switch\",\n        \"type-switch\",\n        \"append\",\n        \"assign-exclusive\",\n        \"assign-expr\",\n        \"err\",\n        \"leading-whitespace\",\n        \"trailing-whitespace\",\n        \"after-block\"\n      ]\n    },\n    \"relative-path-modes\": {\n      \"enum\": [\n        \"gomod\",\n        \"gitroot\",\n        \"cfg\",\n        \"wd\"\n      ]\n    },\n    \"simple-format\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"path\": {\n          \"$ref\": \"#/definitions/formats-path\",\n          \"default\": \"stdout\"\n        }\n      }\n    },\n    \"formats-path\" : {\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"stdout\",\n            \"stderr\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"linter-names\": {\n      \"$comment\": \"anyOf with enum is used to allow auto-completion of non-custom linters\",\n      \"description\": \"Usable linter names.\",\n      \"anyOf\": [\n        {\n          \"enum\": [\n            \"arangolint\",\n            \"asasalint\",\n            \"asciicheck\",\n            \"bidichk\",\n            \"bodyclose\",\n            \"canonicalheader\",\n            \"containedctx\",\n            \"contextcheck\",\n            \"copyloopvar\",\n            \"cyclop\",\n            \"decorder\",\n            \"depguard\",\n            \"dogsled\",\n            \"dupl\",\n            \"dupword\",\n            \"durationcheck\",\n            \"embeddedstructfieldcheck\",\n            \"errcheck\",\n            \"errchkjson\",\n            \"errname\",\n            \"errorlint\",\n            \"exhaustive\",\n            \"exhaustruct\",\n            \"exptostd\",\n            \"fatcontext\",\n            \"forbidigo\",\n            \"forcetypeassert\",\n            \"funcorder\",\n            \"funlen\",\n            \"ginkgolinter\",\n            \"gocheckcompilerdirectives\",\n            \"gochecknoglobals\",\n            \"gochecknoinits\",\n            \"gochecksumtype\",\n            \"gocognit\",\n            \"goconst\",\n            \"gocritic\",\n            \"gocyclo\",\n            \"godoclint\",\n            \"godot\",\n            \"godox\",\n            \"err113\",\n            \"goheader\",\n            \"gomoddirectives\",\n            \"gomodguard\",\n            \"goprintffuncname\",\n            \"gosec\",\n            \"gosimple\",\n            \"gosmopolitan\",\n            \"govet\",\n            \"grouper\",\n            \"iface\",\n            \"importas\",\n            \"inamedparam\",\n            \"ineffassign\",\n            \"interfacebloat\",\n            \"intrange\",\n            \"iotamixing\",\n            \"ireturn\",\n            \"lll\",\n            \"loggercheck\",\n            \"maintidx\",\n            \"makezero\",\n            \"mirror\",\n            \"misspell\",\n            \"mnd\",\n            \"modernize\",\n            \"musttag\",\n            \"nakedret\",\n            \"nestif\",\n            \"nilerr\",\n            \"nilnesserr\",\n            \"nilnil\",\n            \"nlreturn\",\n            \"noctx\",\n            \"noinlineerr\",\n            \"nolintlint\",\n            \"nonamedreturns\",\n            \"nosprintfhostport\",\n            \"paralleltest\",\n            \"perfsprint\",\n            \"prealloc\",\n            \"predeclared\",\n            \"promlinter\",\n            \"protogetter\",\n            \"reassign\",\n            \"recvcheck\",\n            \"revive\",\n            \"rowserrcheck\",\n            \"sloglint\",\n            \"sqlclosecheck\",\n            \"staticcheck\",\n            \"stylecheck\",\n            \"tagalign\",\n            \"tagliatelle\",\n            \"testableexamples\",\n            \"testifylint\",\n            \"testpackage\",\n            \"thelper\",\n            \"tparallel\",\n            \"unconvert\",\n            \"unparam\",\n            \"unused\",\n            \"usestdlibvars\",\n            \"usetesting\",\n            \"varnamelen\",\n            \"wastedassign\",\n            \"whitespace\",\n            \"wrapcheck\",\n            \"wsl\",\n            \"wsl_v5\",\n            \"zerologlint\"\n          ]\n        },\n        {\n          \"type\": \"string\"\n        }\n      ]\n    },\n    \"formatter-names\": {\n      \"description\": \"Usable formatter names.\",\n      \"enum\": [\n        \"gci\",\n        \"gofmt\",\n        \"gofumpt\",\n        \"goimports\",\n        \"golines\",\n        \"swaggo\"\n      ]\n    },\n    \"settings\": {\n      \"definitions\": {\n        \"dupwordSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"the\", \"and\", \"a\"]\n              }\n            },\n            \"ignore\": {\n              \"description\": \"Keywords used to ignore detection.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"0C0C\"]\n              }\n            },\n            \"comments-only\": {\n              \"description\": \"Checks only comments, skip strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"asasalintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude\": {\n              \"description\": \"To specify a set of function names to exclude.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"\\\\.Wrapf\"]\n              }\n            },\n            \"use-builtin-exclusions\": {\n              \"description\": \"To enable/disable the asasalint builtin exclusions of function names.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"bidichkSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"left-to-right-embedding\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-embedding\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-EMBEDDING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-formatting\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-FORMATTING\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-override\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-override\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-OVERRIDE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"left-to-right-isolate\": {\n              \"description\": \"Disallow: LEFT-TO-RIGHT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"right-to-left-isolate\": {\n              \"description\": \"Disallow: RIGHT-TO-LEFT-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"first-strong-isolate\": {\n              \"description\": \"Disallow: FIRST-STRONG-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"pop-directional-isolate\": {\n              \"description\": \"Disallow: POP-DIRECTIONAL-ISOLATE\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"cyclopSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-complexity\": {\n              \"description\": \"Max complexity the function can have\",\n              \"type\": \"integer\",\n              \"default\": 10,\n              \"minimum\": 0\n            },\n            \"package-average\": {\n              \"description\": \"Max average complexity in package\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"decorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dec-order\": {\n              \"type\": \"array\",\n              \"default\": [[\"type\", \"const\", \"var\", \"func\"]],\n              \"items\": {\n                \"enum\": [\"type\", \"const\", \"var\", \"func\"]\n              }\n            },\n            \"ignore-underscore-vars\": {\n              \"description\": \"Underscore vars (vars with \\\"_\\\" as the name) will be ignored at all checks\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-order-check\": {\n              \"description\": \"Order of declarations is not checked\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-init-func-first-check\": {\n              \"description\": \"Allow init func to be anywhere in file\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-dec-num-check\": {\n              \"description\": \"Multiple global type, const and var declarations are allowed\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-type-dec-num-check\": {\n              \"description\": \"Type declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-const-dec-num-check\": {\n              \"description\": \"Const declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            },\n            \"disable-var-dec-num-check\": {\n              \"description\": \"Var declarations will be ignored for dec num check\",\n              \"default\": true,\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"depguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"rules\": {\n              \"description\": \"Rules to apply.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"patternProperties\": {\n                \"^[^.]+$\": {\n                  \"description\": \"Name of a rule.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"list-mode\": {\n                      \"description\": \"Used to determine the package matching priority.\",\n                      \"enum\": [\"original\", \"strict\", \"lax\"],\n                      \"default\": \"original\"\n                    },\n                    \"files\": {\n                      \"description\": \"List of file globs that will match this list of settings to compare against.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"allow\": {\n                      \"description\": \"List of allowed packages.\",\n                      \"additionalProperties\": false,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"deny\": {\n                      \"description\": \"Packages that are not allowed where the value is a suggestion.\",\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"desc\": {\n                            \"description\": \"Description\",\n                            \"type\": \"string\"\n                          },\n                          \"pkg\": {\n                            \"description\": \"Package\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"dogsledSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-blank-identifiers\": {\n              \"description\": \"Check assignments with too many blank identifiers.\",\n              \"type\": \"integer\",\n              \"default\": 2,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"duplSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"threshold\": {\n              \"description\": \"Tokens count to trigger issue.\",\n              \"type\": \"integer\",\n              \"default\": 150,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"embeddedstructfieldcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"empty-line\": {\n              \"description\": \"Checks that there is an empty space between the embedded fields and regular fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-mutex\": {\n              \"description\": \"Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-type-assertions\": {\n              \"description\": \"Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-blank\": {\n              \"description\": \"Report about assignment of errors to blank identifier\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-functions\": {\n              \"description\": \"List of functions to exclude from checking, where each entry is a single function to exclude\",\n              \"type\": \"array\",\n              \"examples\": [\"io/ioutil.ReadFile\", \"io.Copy(*bytes.Buffer)\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"disable-default-exclusions\": {\n              \"description\": \"To disable the errcheck built-in exclude list\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"verbose\": {\n              \"description\": \"Display function signature instead of selector\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errchkjsonSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-error-free-encoding\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"report-no-exported\": {\n              \"description\": \"Issue on struct that doesn't have exported fields.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"errorlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"errorf\": {\n              \"description\": \"Check whether fmt.Errorf uses the %w verb for formatting errors\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"errorf-multi\": {\n              \"description\": \"Permit more than 1 %w verb, valid per Go 1.20\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"asserts\": {\n              \"description\": \"Check for plain type assertions and type switches.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"comparison\": {\n              \"description\": \"Check for plain error comparisons\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allowed-errors\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"allowed-errors-wildcard\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"err\": {\n                    \"type\": \"string\"\n                  },\n                  \"fun\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"exhaustiveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check\": {\n              \"description\": \"Program elements to check for exhaustiveness.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"switch\", \"map\"]\n              }\n            },\n            \"explicit-exhaustive-switch\": {\n              \"description\": \"Only run exhaustive check on switches with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"explicit-exhaustive-map\": {\n              \"description\": \"Only run exhaustive check on map literals with \\\"//exhaustive:enforce\\\" comment.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-case-required\": {\n              \"description\": \"Switch statement requires default case even if exhaustive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-enum-members\": {\n              \"description\": \"Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness\",\n              \"type\": \"string\"\n            },\n            \"ignore-enum-types\": {\n              \"description\": \"Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.\",\n              \"type\": \"string\"\n            },\n            \"package-scope-only\": {\n              \"description\": \"Consider enums only in package scopes, not in inner scopes.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"exhaustructSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"include\": {\n              \"description\": \"List of regular expressions to match struct packages and names.\",\n              \"type\": \"array\",\n              \"examples\": [\".*\\\\.Test\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"exclude\": {\n              \"description\": \"List of regular expressions to exclude struct packages and names from check.\",\n              \"type\": \"array\",\n              \"examples\": [\"cobra\\\\.Command$\"],\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty\": {\n              \"description\": \"Allows empty structures, effectively excluding them from the check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-rx\": {\n              \"description\": \"List of regular expressions to match type names that should be allowed to be empty.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-empty-returns\": {\n              \"description\": \"Allows empty structures in return statements.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-empty-declarations\": {\n              \"description\": \"Allows empty structures in variable declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"fatcontextSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-struct-pointers\": {\n              \"description\": \"Check for potential fat contexts in struct pointers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"forbidigoSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"exclude-godoc-examples\": {\n              \"description\": \"Exclude code in godoc examples.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"analyze-types\": {\n              \"description\": \"Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"forbid\": {\n              \"description\": \"List of identifiers to forbid (written using `regexp`)\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"description\": \"Pattern\",\n                    \"type\": \"string\"\n                  },\n                  \"pkg\": {\n                    \"description\": \"Package\",\n                    \"type\": \"string\"\n                  },\n                  \"msg\": {\n                    \"description\": \"Message\",\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"funcorderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"constructor\": {\n              \"description\": \"Checks that constructors are placed after the structure declaration.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"struct-method\": {\n              \"description\": \"Checks if the exported methods of a structure are placed before the non-exported ones.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"alphabetical\": {\n              \"description\": \"Checks if the constructors and/or structure methods are sorted alphabetically.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"funlenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"lines\": {\n              \"description\": \"Limit lines number per function.\",\n              \"type\": \"integer\",\n              \"default\": 60\n            },\n            \"statements\": {\n              \"description\": \"Limit statements number per function.\",\n              \"type\": \"integer\",\n              \"default\": 40\n            },\n            \"ignore-comments\": {\n              \"description\": \"Ignore comments when counting lines.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"gciSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"sections\": {\n              \"description\": \"Section configuration to compare against.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\n                      \"standard\",\n                      \"default\",\n                      \"blank\",\n                      \"dot\",\n                      \"alias\",\n                      \"localmodule\"\n                    ]\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"default\": [\"standard\", \"default\"]\n            },\n            \"no-inline-comments\": {\n              \"description\": \"Checks that no inline Comments are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-prefix-comments\": {\n              \"description\": \"Checks that no prefix Comments(comment lines above an import) are present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"custom-order\": {\n              \"description\": \"Enable custom order of sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-lex-order\": {\n              \"description\": \"Drops lexical ordering for custom sections.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ginkgolinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"suppress-len-assertion\": {\n              \"description\": \"Suppress the wrong length assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-nil-assertion\": {\n              \"description\": \"Suppress the wrong nil assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-err-assertion\": {\n              \"description\": \"Suppress the wrong error assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-compare-assertion\": {\n              \"description\": \"Suppress the wrong comparison assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-async-assertion\": {\n              \"description\": \"Suppress the function all in async assertion warning.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"suppress-type-compare-assertion\": {\n              \"description\": \"Suppress warning for comparing values from different types, like int32 and uint32.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-focus-container\": {\n              \"description\": \"Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-havelen-zero\": {\n              \"description\": \"Don't trigger warnings for HaveLen(0).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-expect-to\": {\n              \"description\": \"Force using `Expect` with `To`, `ToNot` or `NotTo`\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"validate-async-intervals\": {\n              \"description\": \"Best effort validation of async intervals (timeout and polling).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbid-spec-pollution\": {\n              \"description\": \"Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-succeed\": {\n              \"description\": \"Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-assertion-description\": {\n              \"description\": \"Force adding assertion descriptions to gomega matchers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-tonot\": {\n              \"description\": \"Force using `ToNot`, `ShouldNot` instead of `To(Not())`.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gochecksumtypeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"default-signifies-exhaustive\": {\n              \"description\": \"Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"include-shared-interfaces\": {\n              \"description\": \"Include shared interfaces in the exhaustiviness check.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocognitSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimal code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"goconstSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"match-constant\": {\n              \"description\": \"Look for existing constants matching the values\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"min-len\": {\n              \"description\": \"Minimum length of string constant.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"min-occurrences\": {\n              \"description\": \"Minimum occurrences count to trigger.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"ignore-calls\": {\n              \"description\": \"Ignore when constant is not used as function argument\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"ignore-string-values\": {\n              \"description\": \"Exclude strings matching the given regular expression\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"numbers\": {\n              \"description\": \"Search also for duplicated numbers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"min\": {\n              \"description\": \"Minimum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"max\": {\n              \"description\": \"Maximum value, only works with `numbers`\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"find-duplicates\": {\n              \"description\": \"Detects constants with identical values\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"eval-const-expressions\": {\n              \"description\": \"Evaluates of constant expressions like Prefix + \\\"suffix\\\"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocriticSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enabled-checks\": {\n              \"description\": \"Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              }\n            },\n            \"disabled-checks\": {\n              \"description\": \"Which checks should be disabled.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-checks\"\n              },\n              \"default\": []\n            },\n            \"enabled-tags\": {\n              \"description\": \"Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"disabled-tags\": {\n              \"description\": \"Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/gocritic-tags\"\n              }\n            },\n            \"settings\": {\n              \"description\": \"Settings passed to gocritic. Properties must be valid and enabled check names.\",\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"captLocal\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"paramsOnly\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"commentedOutCode\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minLength\" : {\n                      \"type\": \"number\",\n                      \"default\": 15\n                    }\n                  }\n                },\n                \"elseif\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipBalanced\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"hugeParam\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 80\n                    }\n                  }\n                },\n                \"ifElseChain\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"minThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 2\n                    }\n                  }\n                },\n                \"nestingReduce\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"bodyWidth\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"rangeExprCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 512\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"rangeValCopy\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"sizeThreshold\" : {\n                      \"type\": \"number\",\n                      \"default\": 128\n                    },\n                    \"skipTestFuncs\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"ruleguard\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"debug\" : {\n                      \"type\": \"string\"\n                    },\n                    \"enable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"disable\" : {\n                      \"type\": \"string\"\n                    },\n                    \"failOn\" : {\n                      \"type\": \"string\"\n                    },\n                    \"rules\" : {\n                      \"type\": \"string\"\n                    }\n                  }\n                },\n                \"tooManyResultsChecker\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"maxResults\" : {\n                      \"type\": \"number\",\n                      \"default\": 5\n                    }\n                  }\n                },\n                \"truncateCmp\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipArchDependent\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"underef\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"skipRecvDeref\" : {\n                      \"type\": \"boolean\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"unnamedResult\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"checkExported\" : {\n                      \"type\": \"boolean\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            },\n            \"disable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-all\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gocycloSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum code complexity to report (we recommend 10-20).\",\n              \"type\": \"integer\",\n              \"default\": 30\n            }\n          }\n        },\n        \"godoclintSettings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"default\": {\n              \"type\": \"string\",\n              \"enum\": [\"all\", \"basic\", \"none\"],\n              \"default\": \"basic\",\n              \"description\": \"Default set of rules to enable.\"\n            },\n            \"enable\": {\n              \"description\": \"List of rules to enable in addition to the default set.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"List of rules to disable.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"$ref\": \"#/definitions/godoclint-rules\"\n              }\n            },\n            \"options\": {\n              \"type\": \"object\",\n              \"description\": \"A map for setting individual rule options.\",\n              \"properties\": {\n                \"max-len\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"length\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Maximum line length for godocs, not including the `//`, `/*` or `*/` tokens.\",\n                      \"default\": 77\n                    }\n                  }\n                },\n                \"require-doc\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"ignore-exported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore exported (public) symbols when applying the `require-doc` rule.\",\n                      \"default\": false\n                    },\n                    \"ignore-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Ignore unexported (private) symbols when applying the `require-doc` rule.\",\n                      \"default\": true\n                    }\n                  }\n                },\n                \"start-with-name\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"include-unexported\": {\n                      \"type\": \"boolean\",\n                      \"description\": \"Include unexported symbols when applying the `start-with-name` rule.\",\n                      \"default\": false\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"godotSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"scope\": {\n              \"description\": \"Comments to be checked.\",\n              \"enum\": [\"declarations\", \"toplevel\", \"all\", \"noinline\"],\n              \"default\": \"declarations\"\n            },\n            \"exclude\": {\n              \"description\": \"List of regexps for excluding particular comment lines from check.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"period\": {\n              \"description\": \"Check that each sentence ends with a period.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"capital\": {\n              \"description\": \"Check that each sentence starts with a capital letter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-all\": {\n              \"description\": \"DEPRECATED: Check all top-level comments, not only declarations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"godoxSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"keywords\": {\n              \"description\": \"Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [\"TODO\", \"BUG\", \"FIXME\"]\n            }\n          }\n        },\n        \"gofmtSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simplify\": {\n              \"description\": \"Simplify code.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"rewrite-rules\": {\n              \"description\": \"Apply the rewrite rules to the source before reformatting.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"replacement\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"golinesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-len\": {\n              \"type\": \"integer\",\n              \"default\": 100\n            },\n            \"tab-len\": {\n              \"type\": \"integer\",\n              \"default\": 4\n            },\n            \"shorten-comments\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"reformat-tags\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"chain-split-dots\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"interfacebloatSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max\": {\n              \"description\": \"The maximum number of methods allowed for an interface.\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gofumptSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-rules\": {\n              \"description\": \"Choose whether or not to use the extra rules that are disabled by default.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"module-path\": {\n              \"description\": \" Module path which contains the source code being formatted.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"goheaderSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"values\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"const\": {\n                  \"description\": \"Constants to use in the template.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"description\": \"Value for the constant.\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"additionalProperties\": false,\n                  \"examples\": [\n                    {\n                      \"YEAR\": \"2030\",\n                      \"COMPANY\": \"MY FUTURISTIC COMPANY\"\n                    }\n                  ]\n                },\n                \"regexp\": {\n                  \"description\": \"Regular expressions to use in your template.\",\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"examples\": [\n                    {\n                      \"AUTHOR\": \".*@mycompany\\\\.com\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"template\": {\n              \"description\": \"Template to put on top of every file.\",\n              \"type\": \"string\",\n              \"examples\": [\n                \"{{ MY COMPANY }}\\nSPDX-License-Identifier: Apache-2.0\\n\\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\\nyou may not use this file except in compliance with the License.\\nYou may obtain a copy of the License at:\\n\\n    http://www.apache.org/licenses/LICENSE-2.0\\n\\nUnless required by applicable law or agreed to in writing, software\\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\nSee the License for the specific language governing permissions and\\nlimitations under the License.\"\n              ]\n            },\n            \"template-path\": {\n              \"description\": \"Path to the file containing the template source.\",\n              \"type\": \"string\",\n              \"examples\": [\"my_header_template.txt\"]\n            }\n          },\n          \"oneOf\": [\n            { \"required\": [\"template\"] },\n            { \"required\": [\"template-path\"] }\n          ]\n        },\n        \"goimportsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"local-prefixes\": {\n              \"description\": \"Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"gomoddirectivesSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"replace-local\": {\n              \"description\": \"Allow local `replace` directives.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"replace-allow-list\": {\n              \"description\": \"List of allowed `replace` directives.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"retract-allow-no-explanation\": {\n              \"description\": \"Allow to not explain why the version has been retracted in the `retract` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exclude-forbidden\": {\n              \"description\": \"Forbid the use of the `exclude` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-forbidden\": {\n              \"description\": \"Forbid the use of the `ignore` directives. (>= go1.25)\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-forbidden\": {\n              \"description\": \"Forbid the use of the `toolchain` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"toolchain-pattern\": {\n              \"description\": \"Defines a pattern to validate `toolchain` directive.\",\n              \"type\": \"string\"\n            },\n            \"tool-forbidden\": {\n              \"description\": \"Forbid the use of the `tool` directives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-debug-forbidden\": {\n              \"description\": \"Forbid the use of the `godebug` directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"go-version-pattern\": {\n              \"description\": \"Defines a pattern to validate `go` minimum version directive.\",\n              \"type\": \"string\",\n              \"default\": \"\"\n            },\n            \"check-module-path\": {\n              \"description\": \"Check the validity of the module path.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"gomodguardSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allowed\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of allowed modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"gopkg.in/yaml.v2\"]\n                  }\n                },\n                \"domains\": {\n                  \"description\": \"List of allowed module domains.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"golang.org\"]\n                  }\n                }\n              }\n            },\n            \"blocked\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"modules\": {\n                  \"description\": \"List of blocked modules.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.+$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"recommendations\": {\n                            \"description\": \"Recommended modules that should be used instead.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the recommended module should be used.\",\n                            \"type\": \"string\"\n                          }\n                        }\n                      }\n                    },\n                    \"additionalProperties\": false\n                  }\n                },\n                \"versions\": {\n                  \"description\": \"List of blocked module version constraints.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"patternProperties\": {\n                      \"^.*$\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"version\": {\n                            \"description\": \"Version constraint.\",\n                            \"type\": \"string\"\n                          },\n                          \"reason\": {\n                            \"description\": \"Reason why the version constraint exists.\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"reason\"]\n                      }\n                    }\n                  }\n                },\n                \"local-replace-directives\": {\n                  \"description\": \"Raise lint issues if loading local path with replace directive\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            }\n          }\n        },\n        \"gosecSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"includes\": {\n              \"type\": \"array\",\n              \"description\": \"To select a subset of rules to run\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"excludes\": {\n              \"type\": \"array\",\n              \"description\": \"To specify a set of rules to explicitly exclude\",\n              \"examples\": [[\"G401\"]],\n              \"items\": {\n                \"$ref\": \"#/definitions/gosec-rules\"\n              }\n            },\n            \"severity\": {\n              \"description\": \"Filter out the issues with a lower severity than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"confidence\": {\n              \"description\": \"Filter out the issues with a lower confidence than the given value\",\n              \"type\": \"string\",\n              \"enum\": [\"low\", \"medium\", \"high\"],\n              \"default\": \"low\"\n            },\n            \"config\": {\n              \"description\": \"To specify the configuration of rules\",\n              \"type\": \"object\"\n            },\n            \"concurrency\": {\n              \"description\": \"Concurrency value\",\n              \"type\": \"integer\"\n            }\n          }\n        },\n        \"gosmopolitanSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-time-local\": {\n              \"description\": \"Allow and ignore `time.Local` usages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"escape-hatches\": {\n              \"description\": \"List of fully qualified names in the `full/pkg/path.name` form, to act as \\\"i18n escape hatches\\\".\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"watch-for-scripts\": {\n              \"description\": \"List of Unicode scripts to watch for any usage in string literals.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"govetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"settings\": {\n              \"description\": \"Settings per analyzer. Map of analyzer name to specific settings.\\nRun `go tool vet help` to find out more.\",\n              \"type\": \"object\",\n              \"propertyNames\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              },\n              \"patternProperties\": {\n                \"^.*$\": {\n                  \"description\": \"Run `go tool vet help <analyzer>` to see all settings.\",\n                  \"type\": \"object\"\n                }\n              }\n            },\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"disable\": {\n              \"description\": \"Disable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/govet-analyzers\"\n              }\n            },\n            \"enable-all\": {\n              \"description\": \"Enable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all analyzers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"grouperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"const-require-single-const\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"const-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-single-import\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"import-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-single-type\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"type-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-single-var\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"var-require-grouping\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ifaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable\": {\n              \"description\": \"Enable analyzers by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/iface-analyzers\"\n              }\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"unused\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"exclude\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"importasSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"no-unaliased\": {\n              \"description\": \"Do not allow unaliased imports of aliased packages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-extra-aliases\": {\n              \"description\": \"Do not allow non-required aliases.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"alias\": {\n              \"description\": \"List of aliases\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"pkg\": {\n                    \"description\": \"Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1\",\n                    \"type\": \"string\"\n                  },\n                  \"alias\": {\n                    \"description\": \"Package alias e.g. autoscalingv1alpha1\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"pkg\", \"alias\"]\n              }\n            }\n          }\n        },\n        \"inamedparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-single-param\": {\n              \"description\": \"Skips check for interface methods with only a single parameter.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ineffassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-escaping-errors\": {\n              \"description\": \"Check escaping variables of type error, may cause false positives.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"iotamixingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-individual\": {\n              \"description\": \"Whether to report individual consts rather than just the const block.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"ireturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"Use either `reject` or `allow` properties for interfaces matching.\",\n          \"properties\": {\n            \"allow\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            },\n            \"reject\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"enum\": [\"anon\", \"error\", \"empty\", \"stdlib\"]\n                  }\n                ]\n              }\n            }\n          },\n          \"anyOf\": [\n            {\n              \"not\": {\n                \"properties\": {\n                  \"allow\": {\n                    \"const\": \"reject\"\n                  }\n                }\n              },\n              \"required\": [\"allow\"]\n            },\n            {\n              \"required\": [\"reject\"]\n            }\n          ]\n        },\n        \"lllSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"tab-width\": {\n              \"description\": \"Width of \\\"\\\\t\\\" in spaces.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 1\n            },\n            \"line-length\": {\n              \"description\": \"Maximum allowed line length, lines longer will be reported.\",\n              \"type\": \"integer\",\n              \"minimum\": 1,\n              \"default\": 120\n            }\n          }\n        },\n        \"maintidxSettings\": {\n          \"description\": \"Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"under\": {\n              \"description\": \"Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)\",\n              \"type\": \"number\",\n              \"default\": 20\n            }\n          }\n        },\n        \"makezeroSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"always\": {\n              \"description\": \"Allow only slices initialized with a length of zero.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"loggercheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kitlog\": {\n              \"description\": \"Allow check for the github.com/go-kit/log library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"klog\": {\n              \"description\": \"Allow check for the k8s.io/klog/v2 library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"logr\": {\n              \"description\": \"Allow check for the github.com/go-logr/logr library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"slog\": {\n              \"description\": \"Allow check for the log/slog library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"zap\": {\n              \"description\": \"Allow check for the \\\"sugar logger\\\" from go.uber.org/zap library.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"require-string-key\": {\n              \"description\": \"Require all logging keys to be inlined constant strings.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-printf-like\": {\n              \"description\": \"Require printf-like format specifier (%s, %d for example) not present.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"rules\": {\n              \"description\": \"List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"misspellSettings\": {\n          \"description\": \"Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"locale\": {\n              \"enum\": [\"US\", \"UK\"]\n            },\n            \"ignore-rules\": {\n              \"description\": \"List of rules to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"mode\": {\n              \"description\": \"Mode of the analysis.\",\n              \"enum\": [\"restricted\", \"\", \"default\"],\n              \"default\": \"\"\n            },\n            \"extra-words\": {\n              \"description\": \"Extra word corrections.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"correction\": {\n                    \"type\": \"string\"\n                  },\n                  \"typo\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"musttagSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"functions\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"tag\": {\n                    \"type\": \"string\"\n                  },\n                  \"arg-pos\": {\n                    \"type\": \"integer\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"nakedretSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-func-lines\": {\n              \"description\": \"Report if a function has more lines of code than this value and it has naked returns.\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 30\n            }\n          }\n        },\n        \"nestifSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"min-complexity\": {\n              \"description\": \"Minimum complexity of \\\"if\\\" statements to report.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            }\n          }\n        },\n        \"nilnilSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"only-two\":  {\n              \"type\": \"boolean\",\n              \"description\": \"To check functions with only two return values.\",\n              \"default\": true\n            },\n            \"detect-opposite\": {\n              \"type\": \"boolean\",\n              \"description\": \"In addition, detect opposite situation (simultaneous return of non-nil error and valid value).\",\n              \"default\": false\n            },\n            \"checked-types\": {\n              \"type\": \"array\",\n              \"description\": \"List of return types to check.\",\n              \"items\": {\n                \"enum\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n              },\n              \"default\": [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"]\n            }\n          }\n        },\n        \"nlreturnSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"block-size\": {\n              \"description\": \"set block size that is still ok\",\n              \"type\": \"number\",\n              \"default\": 0,\n              \"minimum\": 0\n            }\n          }\n        },\n        \"mndSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignored-files\": {\n              \"description\": \"List of file patterns to exclude from analysis.\",\n              \"examples\": [[\"magic1_.*.go\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Comma-separated list of function patterns to exclude from the analysis.\",\n              \"examples\": [[\"math.*\", \"http.StatusText\", \"make\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-numbers\": {\n              \"description\": \"List of numbers to exclude from analysis.\",\n              \"examples\": [[\"1000\", \"1234_567_890\", \"3.14159264\"]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"checks\": {\n              \"description\": \"The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"argument\",\n                  \"case\",\n                  \"condition\",\n                  \"operation\",\n                  \"return\",\n                  \"assign\"\n                ]\n              }\n            }\n          }\n        },\n        \"modernizeSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable\": {\n              \"description\": \"List of analyzers to disable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/modernize-analyzers\"\n              }\n            }\n          }\n        },\n        \"nolintlintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-unused\": {\n              \"description\": \"Enable to ensure that nolint directives are all used.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-no-explanation\": {\n              \"description\": \"Exclude these linters from requiring an explanation.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/linter-names\"\n              },\n              \"default\": []\n            },\n            \"require-explanation\": {\n              \"description\": \"Enable to require an explanation of nonzero length after each nolint directive.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"require-specific\": {\n              \"description\": \"Enable to require nolint directives to mention the specific linter being suppressed.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reassignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"patterns\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"recvcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"disable-builtin\": {\n              \"description\": \"Disables the built-in method exclusions.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"exclusions\": {\n              \"description\": \"User-defined method exclusions.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"nonamedreturnsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"report-error-in-defer\": {\n              \"description\": \"Report named error if it is assigned inside defer.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"paralleltestSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore-missing\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"ignore-missing-subtests\": {\n              \"description\": \"Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"perfsprintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"integer-format\": {\n              \"description\": \"Enable/disable optimization of integer formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"int-conversion\": {\n              \"description\": \"Optimizes even if it requires an int or uint type cast.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"error-format\": {\n              \"description\": \"Enable/disable optimization of error formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"err-error\": {\n              \"description\": \"Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"errorf\": {\n              \"description\": \"Optimizes `fmt.Errorf`.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"string-format\": {\n              \"description\": \"Enable/disable optimization of string formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sprintf1\": {\n              \"description\": \"Optimizes `fmt.Sprintf` with only one argument.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"strconcat\": {\n              \"description\": \"Optimizes into strings concatenation.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"bool-format\": {\n              \"description\": \"Enable/disable optimization of bool formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"hex-format\": {\n              \"description\": \"Enable/disable optimization of hex formatting.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"concat-loop\": {\n              \"description\": \"Enable/disable optimization of concat loop.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"loop-other-ops\": {\n              \"description\": \"Optimization of `concat-loop` even with other operations.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"preallocSettings\": {\n          \"description\": \"We do not recommend using this linter before doing performance profiling.\\nFor most programs usage of `prealloc` will be premature optimization.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"simple\": {\n              \"description\": \"Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"range-loops\": {\n              \"description\": \"Report preallocation suggestions on range loops.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"for-loops\": {\n              \"description\": \"Report preallocation suggestions on for loops.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"predeclaredSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"ignore\": {\n              \"description\": \"List of predeclared identifiers to not report on.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"qualified-name\": {\n              \"description\": \"Include method names and field names in checks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"promlinterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"strict\": {},\n            \"disabled-linters\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"Help\",\n                  \"MetricUnits\",\n                  \"Counter\",\n                  \"HistogramSummaryReserved\",\n                  \"MetricTypeInName\",\n                  \"ReservedChars\",\n                  \"CamelCase\",\n                  \"UnitAbbreviations\"\n                ]\n              }\n            }\n          }\n        },\n        \"protogetterSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-generated-by\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"protoc-gen-go-my-own-generator\"]\n              }\n            },\n            \"skip-files\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"*.pb.go\"]\n              }\n            },\n            \"skip-any-generated\": {\n              \"description\": \"Skip any generated files from the checking.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"replace-first-arg-in-append\": {\n              \"description\": \"Skip first argument of append function.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"reviveSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"examples\": [\n            {\n              \"ignore-generated-header\": true,\n              \"severity\": \"warning\",\n              \"rules\": [\n                {\n                  \"name\": \"indent-error-flow\",\n                  \"severity\": \"warning\"\n                },\n                {\n                  \"name\": \"add-constant\",\n                  \"severity\": \"warning\",\n                  \"arguments\": [\n                    {\n                      \"maxLitCount\": \"3\",\n                      \"allowStrs\": \"\\\"\\\"\",\n                      \"allowInts\": \"0,1,2\",\n                      \"allowFloats\": \"0.0,0.,1.0,1.,2.0,2.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"properties\": {\n            \"max-open-files\": {\n              \"type\": \"integer\"\n            },\n            \"confidence\": {\n              \"type\": \"number\"\n            },\n            \"severity\": {\n              \"type\": \"string\",\n              \"enum\": [\"warning\", \"error\"]\n            },\n            \"enable-all-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable-default-rules\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"directives\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"specify-disable-reason\"]\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"required\": [\"name\"],\n                \"properties\": {\n                  \"name\": {\n                    \"$ref\": \"#/definitions/revive-rules\",\n                    \"title\": \"The rule name\"\n                  },\n                  \"disabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"severity\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"warning\", \"error\"]\n                  },\n                  \"exclude\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"arguments\": {\n                    \"type\": \"array\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"rowserrcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"packages\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"description\": \"\",\n                \"type\": \"string\",\n                \"examples\": [\"github.com/jmoiron/sqlx\"]\n              }\n            }\n          }\n        },\n        \"sloglintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"kv-only\": {\n              \"description\": \"Enforce using key-value pairs only (incompatible with attr-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-global\": {\n              \"description\": \"Enforce not using global loggers.\",\n              \"enum\": [\"\", \"all\", \"default\"],\n              \"default\": \"\"\n            },\n            \"no-mixed-args\": {\n              \"description\": \"Enforce not mixing key-value pairs and attributes.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"context\": {\n              \"description\": \"Enforce using methods that accept a context.\",\n              \"enum\": [\"\", \"all\", \"scope\"],\n              \"default\": \"\"\n            },\n            \"static-msg\": {\n              \"description\": \"Enforce using static values for log messages.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"msg-style\": {\n              \"description\": \"Enforce message style.\",\n              \"enum\": [\"\", \"lowercased\", \"capitalized\"],\n              \"default\": \"\"\n            },\n            \"key-naming-case\": {\n              \"description\": \"Enforce a single key naming convention.\",\n              \"enum\": [\"snake\", \"kebab\", \"camel\", \"pascal\"]\n            },\n            \"attr-only\": {\n              \"description\": \"Enforce using attributes only (incompatible with kv-only).\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"no-raw-keys\": {\n              \"description\": \"Enforce using constants instead of raw keys.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"forbidden-keys\": {\n              \"description\": \"Enforce not using specific keys.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"args-on-sep-lines\": {\n              \"description\": \"Enforce putting arguments on separate lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"spancheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"description\": \"Checks to enable.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\"end\", \"record-error\", \"set-status\"]\n              }\n            },\n            \"ignore-check-signatures\": {\n              \"description\": \"A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"extra-start-span-signatures\": {\n              \"description\": \"A list of regexes for additional function signatures that create spans.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"staticcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"checks\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"anyOf\": [\n                  {\n                    \"$ref\": \"#/definitions/staticcheck-checks\"\n                  },\n                  {\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            \"dot-import-whitelist\": {\n              \"description\": \"By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"http-status-code-whitelist\": {\n              \"description\": \"ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.\",\n              \"default\": [\"200\", \"400\", \"404\", \"500\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"100\",\n                  \"101\",\n                  \"102\",\n                  \"103\",\n                  \"200\",\n                  \"201\",\n                  \"202\",\n                  \"203\",\n                  \"204\",\n                  \"205\",\n                  \"206\",\n                  \"207\",\n                  \"208\",\n                  \"226\",\n                  \"300\",\n                  \"301\",\n                  \"302\",\n                  \"303\",\n                  \"304\",\n                  \"305\",\n                  \"306\",\n                  \"307\",\n                  \"308\",\n                  \"400\",\n                  \"401\",\n                  \"402\",\n                  \"403\",\n                  \"404\",\n                  \"405\",\n                  \"406\",\n                  \"407\",\n                  \"408\",\n                  \"409\",\n                  \"410\",\n                  \"411\",\n                  \"412\",\n                  \"413\",\n                  \"414\",\n                  \"415\",\n                  \"416\",\n                  \"417\",\n                  \"418\",\n                  \"421\",\n                  \"422\",\n                  \"423\",\n                  \"424\",\n                  \"425\",\n                  \"426\",\n                  \"428\",\n                  \"429\",\n                  \"431\",\n                  \"451\",\n                  \"500\",\n                  \"501\",\n                  \"502\",\n                  \"503\",\n                  \"504\",\n                  \"505\",\n                  \"506\",\n                  \"507\",\n                  \"508\",\n                  \"510\",\n                  \"511\"\n                ]\n              }\n            },\n            \"initialisms\": {\n              \"description\": \"ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"default\": [\n                  \"ACL\",\n                  \"API\",\n                  \"ASCII\",\n                  \"CPU\",\n                  \"CSS\",\n                  \"DNS\",\n                  \"EOF\",\n                  \"GUID\",\n                  \"HTML\",\n                  \"HTTP\",\n                  \"HTTPS\",\n                  \"ID\",\n                  \"IP\",\n                  \"JSON\",\n                  \"QPS\",\n                  \"RAM\",\n                  \"RPC\",\n                  \"SLA\",\n                  \"SMTP\",\n                  \"SQL\",\n                  \"SSH\",\n                  \"TCP\",\n                  \"TLS\",\n                  \"TTL\",\n                  \"UDP\",\n                  \"UI\",\n                  \"GID\",\n                  \"UID\",\n                  \"UUID\",\n                  \"URI\",\n                  \"URL\",\n                  \"UTF8\",\n                  \"VM\",\n                  \"XML\",\n                  \"XMPP\",\n                  \"XSRF\",\n                  \"XSS\",\n                  \"SIP\",\n                  \"RTP\",\n                  \"AMQP\",\n                  \"DB\",\n                  \"TS\"\n                ]\n              }\n            }\n          }\n        },\n        \"tagalignSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"align\": {\n              \"description\": \"Align and sort can be used together or separately.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"sort\": {\n              \"description\": \"Whether enable tags sort.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"order\": {\n              \"description\": \"Specify the order of tags, the other tags will be sorted by name.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"default\": [],\n              \"examples\": [\n                [\n                  \"json\",\n                  \"yaml\",\n                  \"yml\",\n                  \"toml\",\n                  \"mapstructure\",\n                  \"binding\",\n                  \"validate\"\n                ]\n              ]\n            },\n            \"strict\": {\n              \"description\": \"Whether enable strict style.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"tagliatelleSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"case\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"use-field-name\": {\n                  \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"ignored-fields\": {\n                  \"description\": \"The field names to ignore.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"examples\": [\"example\"]\n                  }\n                },\n                \"rules\": {\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"$ref\": \"#/definitions/tagliatelle-cases\"\n                    }\n                  }\n                },\n                \"extended-rules\": {\n                  \"description\": \"Defines the association between tag name and case.\",\n                  \"type\": \"object\",\n                  \"patternProperties\": {\n                    \"^.+$\": {\n                      \"type\": \"object\",\n                      \"additionalProperties\": false,\n                      \"required\": [\"case\"],\n                      \"properties\": {\n                        \"case\": {\n                          \"$ref\": \"#/definitions/tagliatelle-cases\"\n                        },\n                        \"extra-initialisms\": {\n                          \"type\": \"boolean\",\n                          \"default\": false\n                        },\n                        \"initialism-overrides\": {\n                          \"type\": \"object\",\n                          \"patternProperties\": {\n                            \"^.+$\": {\n                              \"type\": \"boolean\",\n                              \"default\": false\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"overrides\": {\n                  \"description\": \"Overrides the default/root configuration.\",\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\"pkg\"],\n                    \"properties\": {\n                      \"pkg\": {\n                        \"description\": \"A package path.\",\n                        \"type\": \"string\"\n                      },\n                      \"use-field-name\": {\n                        \"description\": \"Use the struct field name to check the name of the struct tag.\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"ignored-fields\": {\n                        \"description\": \"The field names to ignore.\",\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\",\n                          \"examples\": [\"example\"]\n                        }\n                      },\n                      \"ignore\": {\n                        \"description\": \"Ignore the package (takes precedence over all other configurations).\",\n                        \"type\": \"boolean\",\n                        \"default\": false\n                      },\n                      \"rules\": {\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"$ref\": \"#/definitions/tagliatelle-cases\"\n                          }\n                        }\n                      },\n                      \"extended-rules\": {\n                        \"description\": \"Defines the association between tag name and case.\",\n                        \"type\": \"object\",\n                        \"patternProperties\": {\n                          \"^.+$\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": false,\n                            \"required\": [\"case\"],\n                            \"properties\": {\n                              \"case\": {\n                                \"$ref\": \"#/definitions/tagliatelle-cases\"\n                              },\n                              \"extra-initialisms\": {\n                                \"type\": \"boolean\",\n                                \"default\": false\n                              },\n                              \"initialism-overrides\": {\n                                \"type\": \"object\",\n                                \"patternProperties\": {\n                                  \"^.+$\": {\n                                    \"type\": \"boolean\",\n                                    \"default\": false\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"testifylintSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"enable-all\": {\n              \"description\": \"Enable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"disable-all\": {\n              \"description\": \"Disable all checkers.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"enable\": {\n              \"description\": \"Enable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ]\n              },\n              \"default\": [\n                \"blank-import\",\n                \"bool-compare\",\n                \"compares\",\n                \"contains\",\n                \"empty\",\n                \"encoded-compare\",\n                \"equal-values\",\n                \"error-is-as\",\n                \"error-nil\",\n                \"expected-actual\",\n                \"float-compare\",\n                \"formatter\",\n                \"go-require\",\n                \"len\",\n                \"negative-positive\",\n                \"nil-compare\",\n                \"regexp\",\n                \"require-error\",\n                \"suite-broken-parallel\",\n                \"suite-dont-use-pkg\",\n                \"suite-extra-assert-call\",\n                \"suite-method-signature\",\n                \"suite-subtest-run\",\n                \"useless-assert\"\n              ]\n            },\n            \"disable\": {\n              \"description\": \"Disable specific checkers.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"blank-import\",\n                  \"bool-compare\",\n                  \"compares\",\n                  \"contains\",\n                  \"empty\",\n                  \"encoded-compare\",\n                  \"equal-values\",\n                  \"error-is-as\",\n                  \"error-nil\",\n                  \"expected-actual\",\n                  \"float-compare\",\n                  \"formatter\",\n                  \"go-require\",\n                  \"len\",\n                  \"negative-positive\",\n                  \"nil-compare\",\n                  \"regexp\",\n                  \"require-error\",\n                  \"suite-broken-parallel\",\n                  \"suite-dont-use-pkg\",\n                  \"suite-extra-assert-call\",\n                  \"suite-method-signature\",\n                  \"suite-subtest-run\",\n                  \"suite-thelper\",\n                  \"useless-assert\"\n                ],\n                \"default\": [\n                  \"suite-thelper\"\n                ]\n              }\n            },\n            \"bool-compare\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-custom-types\": {\n                  \"description\": \"To ignore user defined types (over builtin bool).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"expected-actual\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"pattern\": {\n                  \"description\": \"Regexp for expected variable name.\",\n                  \"type\": \"string\",\n                  \"default\": \"(^(exp(ected)?|want(ed)?)([A-Z]\\\\w*)?$)|(^(\\\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)\"\n                }\n              }\n            },\n            \"formatter\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"check-format-string\": {\n                  \"description\": \"To enable go vet's printf checks.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"require-f-funcs\": {\n                  \"description\": \"To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                },\n                \"require-string-msg\": {\n                  \"description\": \"To require that the first element of msgAndArgs (msg) has a string type.\",\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"go-require\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"ignore-http-handlers\": {\n                  \"description\": \"To ignore HTTP handlers (like http.HandlerFunc).\",\n                  \"type\": \"boolean\",\n                  \"default\": false\n                }\n              }\n            },\n            \"require-error\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"fn-pattern\": {\n                  \"description\": \"Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.\",\n                  \"type\": \"string\",\n                  \"default\": \"\"\n                }\n              }\n            },\n            \"suite-extra-assert-call\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"mode\": {\n                  \"description\": \"To require or remove extra Assert() call?\",\n                  \"type\": \"string\",\n                  \"enum\": [\"remove\", \"require\"],\n                  \"default\": \"remove\"\n                }\n              }\n            }\n          }\n        },\n        \"testpackageSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"skip-regexp\": {\n              \"description\": \"Files with names matching this regular expression are skipped.\",\n              \"type\": \"string\",\n              \"examples\": [\"(export|internal)_test\\\\.go\"]\n            },\n            \"allow-packages\": {\n              \"description\": \"List of packages that don't end with _test that tests are allowed to be in.\",\n              \"type\": \"array\",\n              \"uniqueItems\": true,\n              \"items\": {\n                \"type\": \"string\",\n                \"examples\": [\"example\"]\n              }\n            }\n          }\n        },\n        \"thelperSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"test\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `t.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.T is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.T param has t name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"benchmark\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `b.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.B is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.B param has b name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"tb\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `tb.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.TB is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.TB param has tb name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            },\n            \"fuzz\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"begin\": {\n                  \"description\": \"Check if `f.Helper()` begins helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"first\": {\n                  \"description\": \"Check if *testing.F is first param of helper function.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                },\n                \"name\": {\n                  \"description\": \"Check if *testing.F param has f name.\",\n                  \"default\": true,\n                  \"type\": \"boolean\"\n                }\n              }\n            }\n          }\n        },\n        \"usestdlibvarsSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"http-method\": {\n              \"description\": \"Suggest the use of http.MethodXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"http-status-code\": {\n              \"description\": \"Suggest the use of http.StatusXX.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"time-weekday\": {\n              \"description\": \"Suggest the use of time.Weekday.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-month\": {\n              \"description\": \"Suggest the use of time.Month.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-layout\": {\n              \"description\": \"Suggest the use of time.Layout.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"time-date-month\": {\n              \"description\": \"Suggest the use of time.Month in time.Date.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"crypto-hash\": {\n              \"description\": \"Suggest the use of crypto.Hash.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"default-rpc-path\": {\n              \"description\": \"Suggest the use of rpc.DefaultXXPath.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"sql-isolation-level\": {\n              \"description\": \"Suggest the use of sql.LevelXX.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"tls-signature-scheme\": {\n              \"description\": \"Suggest the use of tls.SignatureScheme.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"constant-kind\": {\n              \"description\": \"Suggest the use of constant.Kind.String().\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"usetestingSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"context-background\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"context-todo\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"os-chdir\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-mkdir-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-setenv\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-create-temp\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"os-temp-dir\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unconvertSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"fast-math\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"safe\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unparamSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-exported\": {\n              \"description\": \"Inspect exported functions. Set to true if no external program/library imports your code.\\n\\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\\nwith golangci-lint call it on a directory with the changed file.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"unqueryvetSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-sql-builders\": {\n              \"description\": \"Enable SQL builder checking.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-aliased-wildcard\": {\n              \"description\": \"Enable aliased wildcard detection like SELECT t.*.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-concat\": {\n              \"description\": \"Enable string concatenation analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-format-strings\": {\n              \"description\": \"Enable format string analysis like fmt.Sprintf.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-string-builder\": {\n              \"description\": \"Enable strings.Builder analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-subqueries\": {\n              \"description\": \"Enable subquery analysis.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"check-n1\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-sql-injection\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"check-tx-leaks\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allowed-patterns\": {\n              \"description\": \"Regex patterns for acceptable SELECT * usage.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow\": {\n              \"description\": \"Allow is a list of SQL patterns to allow (whitelist).\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignored-functions\": {\n              \"description\": \"Functions to ignore.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"sql-builders\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"squirrel\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"gorm\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"ent\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"pgx\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"bun\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"sqlboiler\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"jet\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"custom-rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"id\": {\n                    \"type\": \"string\"\n                  },\n                  \"pattern\": {\n                    \"type\": \"string\"\n                  },\n                  \"patterns\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"when\": {\n                    \"type\": \"string\"\n                  },\n                  \"message\": {\n                    \"type\": \"string\"\n                  },\n                  \"action\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"unusedSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"field-writes-are-uses\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"post-statements-are-reads\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"exported-fields-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"parameters-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"local-variables-are-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"generated-is-used\": {\n              \"description\": \"\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"varnamelenSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"max-distance\": {\n              \"description\": \"Variables used in at most this N-many lines will be ignored.\",\n              \"type\": \"integer\",\n              \"default\": 5\n            },\n            \"min-name-length\": {\n              \"description\": \"The minimum length of a variable's name that is considered `long`.\",\n              \"type\": \"integer\",\n              \"default\": 3\n            },\n            \"check-receiver\": {\n              \"description\": \"Check method receiver names.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-return\": {\n              \"description\": \"Check named return values.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"check-type-param\": {\n              \"description\": \"Check type parameters.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-type-assert-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a type assertion\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-map-index-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a map index.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-chan-recv-ok\": {\n              \"description\": \"Ignore `ok` variables that hold the bool return value of a channel receive.\",\n              \"default\": false,\n              \"type\": \"boolean\"\n            },\n            \"ignore-names\": {\n              \"description\": \"Optional list of variable names that should be ignored completely.\",\n              \"default\": [[]],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-decls\": {\n              \"description\": \"Optional list of variable declarations that should be ignored completely.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"examples\": [\n                [\"c echo.Context\", \"t testing.T\", \"f *foo.Bar\", \"const C\"]\n              ]\n            }\n          }\n        },\n        \"whitespaceSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"multi-if\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line if statement\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"multi-func\": {\n              \"description\": \"Enforces newlines (or comments) after every multi-line function signature\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wrapcheckSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"extra-ignore-sigs\": {\n              \"description\": \"An array of strings specifying additional substrings of signatures to ignore.\",\n              \"default\": [\n                \".CustomError(\",\n                \".SpecificWrap(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sigs\": {\n              \"description\": \"An array of strings which specify substrings of signatures to ignore.\",\n              \"default\": [\n                \".Errorf(\",\n                \"errors.New(\",\n                \"errors.Unwrap(\",\n                \".Wrap(\",\n                \".Wrapf(\",\n                \".WithMessage(\",\n                \".WithMessagef(\",\n                \".WithStack(\"\n              ],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-sig-regexps\": {\n              \"description\": \"An array of strings which specify regular expressions of signatures to ignore.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-package-globs\": {\n              \"description\": \"An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"ignore-interface-regexps\": {\n              \"description\": \"An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.\",\n              \"default\": [\"\"],\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"report-internal-errors\": {\n              \"description\": \"Determines whether wrapcheck should report errors returned from inside the package.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"wslSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-assign-and-anything\": {\n              \"description\": \"Controls if you may cuddle assignments and anything without needing an empty line between them.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-assign-and-call\": {\n              \"description\": \"Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-cuddle-declarations\": {\n              \"description\": \"Allow declarations (var) to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-cuddle-with-calls\": {\n              \"description\": \"A list of call idents that everything can be cuddled with.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-with-rhs\": {\n              \"description\": \"AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"allow-cuddle-used-in-block\": {\n              \"description\": \"Allow cuddling with any block as long as the variable is used somewhere in the block\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-multiline-assign\": {\n              \"description\": \"Allow multiline assignments to be cuddled.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-separated-leading-comment\": {\n              \"description\": \"Allow leading comments to be separated with empty lines.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"allow-trailing-comment\": {\n              \"description\": \"Allow trailing comments in ending of blocks.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"error-variable-names\": {\n              \"description\": \"When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"force-case-trailing-whitespace\": {\n              \"description\": \"Force newlines in end of case at this limit (0 = never).\",\n              \"type\": \"integer\",\n              \"minimum\": 0,\n              \"default\": 0\n            },\n            \"force-err-cuddling\": {\n              \"description\": \"Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"force-short-decl-cuddling\": {\n              \"description\": \"Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.\",\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"strict-append\": {\n              \"description\": \"If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.\",\n              \"type\": \"boolean\",\n              \"default\": true\n            }\n          }\n        },\n        \"wslSettingsV5\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"allow-first-in-block\": {\n              \"type\": \"boolean\",\n              \"default\": true\n            },\n            \"allow-whole-block\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"branch-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 2\n            },\n            \"case-max-lines\": {\n              \"type\": \"integer\",\n              \"default\": 0\n            },\n            \"default\": {\n              \"enum\": [\"all\", \"none\", \"default\", \"\"],\n              \"default\": \"default\"\n            },\n            \"enable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            },\n            \"disable\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/wsl-checks\"\n              }\n            }\n          }\n        },\n        \"copyloopvarSettings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"check-alias\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        },\n        \"customSettings\": {\n          \"description\": \"The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\\nEach custom linter should have a unique name.\",\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^.*$\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"type\": {\n                  \"description\": \"The plugin type.\",\n                  \"enum\": [\"module\", \"goplugin\"],\n                  \"default\": \"goplugin\"\n                },\n                \"path\": {\n                  \"description\": \"The path to the plugin *.so. Can be absolute or local.\",\n                  \"type\": \"string\",\n                  \"examples\": [\"/path/to/example.so\"]\n                },\n                \"description\": {\n                  \"description\": \"The description of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"original-url\": {\n                  \"description\": \"Intended to point to the repo location of the linter, for documentation purposes only.\",\n                  \"type\": \"string\"\n                },\n                \"settings\": {\n                  \"description\": \"Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.\",\n                  \"type\": \"object\"\n                }\n              },\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"type\": {\"enum\": [\"module\"] }\n                  },\n                  \"required\": [\"type\"]\n                },\n                {\n                  \"required\": [\"path\"]\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"version\"],\n  \"properties\": {\n    \"version\": {\n      \"type\": \"string\",\n      \"default\": \"2\"\n    },\n    \"run\": {\n      \"description\": \"Options for analysis running,\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"concurrency\": {\n          \"description\": \"Number of concurrent runners. Defaults to the number of available CPU cores.\",\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"examples\": [4]\n        },\n        \"timeout\": {\n          \"description\": \"Timeout for the analysis.\",\n          \"type\": \"string\",\n          \"pattern\": \"^((\\\\d+h)?(\\\\d+m)?(\\\\d+(?:\\\\.\\\\d)?s)?|0)$\",\n          \"default\": \"1m\",\n          \"examples\": [\"30s\", \"5m\", \"5m30s\"]\n        },\n        \"issues-exit-code\": {\n          \"description\": \"Exit code when at least one issue was found.\",\n          \"type\": \"integer\",\n          \"default\": 1\n        },\n        \"tests\": {\n          \"description\": \"Enable inclusion of test files.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"build-tags\": {\n          \"description\": \"List of build tags to pass to all linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"default\": [],\n          \"examples\": [[\"mytag\"]]\n        },\n        \"modules-download-mode\": {\n          \"description\": \"Option to pass to \\\"go list -mod={option}\\\".\\nSee \\\"go help modules\\\" for more information.\",\n          \"enum\": [\"mod\", \"readonly\", \"vendor\"]\n        },\n        \"enable-build-vcs\": {\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-parallel-runners\": {\n          \"description\": \"Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"allow-serial-runners\": {\n          \"description\": \"Allow multiple golangci-lint instances running, but serialize them around a lock.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"go\": {\n          \"description\": \"Targeted Go version.\",\n          \"type\": \"string\",\n          \"default\": \"1.17\"\n        },\n        \"relative-path-mode\": {\n          \"description\": \"The mode used to evaluate relative paths.\",\n          \"type\": \"string\",\n          \"$ref\": \"#/definitions/relative-path-modes\",\n          \"default\": \"wd\"\n        }\n      }\n    },\n    \"output\": {\n      \"description\": \"Output configuration options.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"formats\": {\n          \"description\": \"Output formats to use.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"text\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"print-issued-lines\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"json\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"tab\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"print-linter-name\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                },\n                \"colors\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"html\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"checkstyle\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"code-climate\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"junit-xml\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"properties\": {\n                \"path\": {\n                  \"$ref\": \"#/definitions/formats-path\",\n                  \"default\": \"stdout\"\n                },\n                \"extended\": {\n                  \"type\": \"boolean\",\n                  \"default\": true\n                }\n              }\n            },\n            \"teamcity\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            },\n            \"sarif\": {\n              \"$ref\": \"#/definitions/simple-format\"\n            }\n          }\n        },\n        \"path-mode\": {\n          \"type\": \"string\",\n          \"default\": \"\",\n          \"examples\": [\"abs\"]\n        },\n        \"path-prefix\": {\n          \"description\": \"Add a prefix to the output file references.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"show-stats\": {\n          \"description\": \"Show statistics per linter.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"sort-order\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"enum\": [\"linter\", \"severity\", \"file\"]\n          }\n        }\n      }\n    },\n    \"linters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"enum\": [\n            \"standard\",\n            \"all\",\n            \"none\",\n            \"fast\"\n          ]\n        },\n        \"enable\": {\n          \"description\": \"List of enabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"disable\": {\n          \"description\": \"List of disabled linters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/linter-names\"\n          }\n        },\n        \"settings\": {\n          \"description\": \"All available settings of specific linters.\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"dupword\": {\n              \"$ref\": \"#/definitions/settings/definitions/dupwordSettings\"\n            },\n            \"asasalint\": {\n              \"$ref\": \"#/definitions/settings/definitions/asasalintSettings\"\n            },\n            \"bidichk\": {\n              \"$ref\": \"#/definitions/settings/definitions/bidichkSettings\"\n            },\n            \"cyclop\": {\n              \"$ref\": \"#/definitions/settings/definitions/cyclopSettings\"\n            },\n            \"decorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/decorderSettings\"\n            },\n            \"depguard\":{\n              \"$ref\": \"#/definitions/settings/definitions/depguardSettings\"\n            },\n            \"dogsled\": {\n              \"$ref\": \"#/definitions/settings/definitions/dogsledSettings\"\n            },\n            \"dupl\": {\n              \"$ref\": \"#/definitions/settings/definitions/duplSettings\"\n            },\n            \"embeddedstructfieldcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/embeddedstructfieldcheckSettings\"\n            },\n            \"errcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/errcheckSettings\"\n            },\n            \"errchkjson\": {\n              \"$ref\": \"#/definitions/settings/definitions/errchkjsonSettings\"\n            },\n            \"errorlint\": {\n              \"$ref\": \"#/definitions/settings/definitions/errorlintSettings\"\n            },\n            \"exhaustive\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustiveSettings\"\n            },\n            \"exhaustruct\": {\n              \"$ref\": \"#/definitions/settings/definitions/exhaustructSettings\"\n            },\n            \"fatcontext\": {\n              \"$ref\": \"#/definitions/settings/definitions/fatcontextSettings\"\n            },\n            \"forbidigo\": {\n              \"$ref\": \"#/definitions/settings/definitions/forbidigoSettings\"\n            },\n            \"funcorder\": {\n              \"$ref\": \"#/definitions/settings/definitions/funcorderSettings\"\n            },\n            \"funlen\": {\n              \"$ref\": \"#/definitions/settings/definitions/funlenSettings\"\n            },\n            \"ginkgolinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/ginkgolinterSettings\"\n            },\n            \"gochecksumtype\": {\n              \"$ref\": \"#/definitions/settings/definitions/gochecksumtypeSettings\"\n            },\n            \"gocognit\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocognitSettings\"\n            },\n            \"goconst\": {\n              \"$ref\": \"#/definitions/settings/definitions/goconstSettings\"\n            },\n            \"gocritic\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocriticSettings\"\n            },\n            \"gocyclo\": {\n              \"$ref\": \"#/definitions/settings/definitions/gocycloSettings\"\n            },\n            \"godoclint\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoclintSettings\"\n            },\n            \"godot\": {\n              \"$ref\": \"#/definitions/settings/definitions/godotSettings\"\n            },\n            \"godox\": {\n              \"$ref\": \"#/definitions/settings/definitions/godoxSettings\"\n            },\n            \"interfacebloat\":{\n              \"$ref\": \"#/definitions/settings/definitions/interfacebloatSettings\"\n            },\n            \"goheader\": {\n              \"$ref\": \"#/definitions/settings/definitions/goheaderSettings\"\n            },\n            \"gomoddirectives\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomoddirectivesSettings\"\n            },\n            \"gomodguard\": {\n              \"$ref\": \"#/definitions/settings/definitions/gomodguardSettings\"\n            },\n            \"gosec\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosecSettings\"\n            },\n            \"gosmopolitan\": {\n              \"$ref\": \"#/definitions/settings/definitions/gosmopolitanSettings\"\n            },\n            \"govet\": {\n              \"$ref\": \"#/definitions/settings/definitions/govetSettings\"\n            },\n            \"grouper\": {\n              \"$ref\": \"#/definitions/settings/definitions/grouperSettings\"\n            },\n            \"iface\": {\n              \"$ref\": \"#/definitions/settings/definitions/ifaceSettings\"\n            },\n            \"importas\": {\n              \"$ref\": \"#/definitions/settings/definitions/importasSettings\"\n            },\n            \"inamedparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/inamedparamSettings\"\n            },\n            \"ineffassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/ineffassignSettings\"\n            },\n            \"iotamixing\": {\n              \"$ref\": \"#/definitions/settings/definitions/iotamixingSettings\"\n            },\n            \"ireturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/ireturnSettings\"\n            },\n            \"lll\": {\n              \"$ref\": \"#/definitions/settings/definitions/lllSettings\"\n            },\n            \"maintidx\": {\n              \"$ref\": \"#/definitions/settings/definitions/maintidxSettings\"\n            },\n            \"makezero\":{\n              \"$ref\": \"#/definitions/settings/definitions/makezeroSettings\"\n            },\n            \"loggercheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/loggercheckSettings\"\n            },\n            \"misspell\": {\n              \"$ref\": \"#/definitions/settings/definitions/misspellSettings\"\n            },\n            \"musttag\": {\n              \"$ref\": \"#/definitions/settings/definitions/musttagSettings\"\n            },\n            \"nakedret\": {\n              \"$ref\": \"#/definitions/settings/definitions/nakedretSettings\"\n            },\n            \"nestif\": {\n              \"$ref\": \"#/definitions/settings/definitions/nestifSettings\"\n            },\n            \"nilnil\": {\n              \"$ref\": \"#/definitions/settings/definitions/nilnilSettings\"\n            },\n            \"nlreturn\": {\n              \"$ref\": \"#/definitions/settings/definitions/nlreturnSettings\"\n            },\n            \"mnd\": {\n              \"$ref\": \"#/definitions/settings/definitions/mndSettings\"\n            },\n            \"modernize\": {\n              \"$ref\": \"#/definitions/settings/definitions/modernizeSettings\"\n            },\n            \"nolintlint\":{\n              \"$ref\": \"#/definitions/settings/definitions/nolintlintSettings\"\n            },\n            \"reassign\": {\n              \"$ref\": \"#/definitions/settings/definitions/reassignSettings\"\n            },\n            \"recvcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/recvcheckSettings\"\n            },\n            \"nonamedreturns\": {\n              \"$ref\": \"#/definitions/settings/definitions/nonamedreturnsSettings\"\n            },\n            \"paralleltest\": {\n              \"$ref\": \"#/definitions/settings/definitions/paralleltestSettings\"\n            },\n            \"perfsprint\": {\n              \"$ref\": \"#/definitions/settings/definitions/perfsprintSettings\"\n            },\n            \"prealloc\": {\n              \"$ref\": \"#/definitions/settings/definitions/preallocSettings\"\n            },\n            \"predeclared\": {\n              \"$ref\": \"#/definitions/settings/definitions/predeclaredSettings\"\n            },\n            \"promlinter\": {\n              \"$ref\": \"#/definitions/settings/definitions/promlinterSettings\"\n            },\n            \"protogetter\": {\n              \"$ref\": \"#/definitions/settings/definitions/protogetterSettings\"\n            },\n            \"revive\": {\n              \"$ref\": \"#/definitions/settings/definitions/reviveSettings\"\n            },\n            \"rowserrcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/rowserrcheckSettings\"\n            },\n            \"sloglint\": {\n              \"$ref\": \"#/definitions/settings/definitions/sloglintSettings\"\n            },\n            \"spancheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/spancheckSettings\"\n            },\n            \"staticcheck\":{\n              \"$ref\": \"#/definitions/settings/definitions/staticcheckSettings\"\n            },\n            \"tagalign\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagalignSettings\"\n            },\n            \"tagliatelle\": {\n              \"$ref\": \"#/definitions/settings/definitions/tagliatelleSettings\"\n            },\n            \"testifylint\": {\n              \"$ref\": \"#/definitions/settings/definitions/testifylintSettings\"\n            },\n            \"testpackage\": {\n              \"$ref\": \"#/definitions/settings/definitions/testpackageSettings\"\n            },\n            \"thelper\": {\n              \"$ref\": \"#/definitions/settings/definitions/thelperSettings\"\n            },\n            \"usestdlibvars\": {\n              \"$ref\": \"#/definitions/settings/definitions/usestdlibvarsSettings\"\n            },\n            \"usetesting\": {\n              \"$ref\": \"#/definitions/settings/definitions/usetestingSettings\"\n            },\n            \"unconvert\": {\n              \"$ref\": \"#/definitions/settings/definitions/unconvertSettings\"\n            },\n            \"unparam\": {\n              \"$ref\": \"#/definitions/settings/definitions/unparamSettings\"\n            },\n            \"unqueryvet\": {\n              \"$ref\": \"#/definitions/settings/definitions/unqueryvetSettings\"\n            },\n            \"unused\": {\n              \"$ref\": \"#/definitions/settings/definitions/unusedSettings\"\n            },\n            \"varnamelen\": {\n              \"$ref\": \"#/definitions/settings/definitions/varnamelenSettings\"\n            },\n            \"whitespace\": {\n              \"$ref\": \"#/definitions/settings/definitions/whitespaceSettings\"\n            },\n            \"wrapcheck\": {\n              \"$ref\": \"#/definitions/settings/definitions/wrapcheckSettings\"\n            },\n            \"wsl\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettings\"\n            },\n            \"wsl_v5\": {\n              \"$ref\": \"#/definitions/settings/definitions/wslSettingsV5\"\n            },\n            \"copyloopvar\": {\n              \"$ref\": \"#/definitions/settings/definitions/copyloopvarSettings\"\n            },\n            \"custom\":{\n              \"$ref\": \"#/definitions/settings/definitions/customSettings\"\n            }\n          }\n        },\n        \"exclusions\":{\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"presets\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"enum\": [\n                  \"comments\",\n                  \"std-error-handling\",\n                  \"common-false-positives\",\n                  \"legacy\"\n                ]\n              }\n            },\n            \"rules\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"path\": {\n                    \"type\": \"string\"\n                  },\n                  \"path-except\": {\n                    \"type\": \"string\"\n                  },\n                  \"linters\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/definitions/linter-names\"\n                    }\n                  },\n                  \"text\": {\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"anyOf\": [\n                  { \"required\": [\"path\"] },\n                  { \"required\": [\"path-except\"] },\n                  { \"required\": [\"linters\"] },\n                  { \"required\": [\"text\"] },\n                  { \"required\": [\"source\"] }\n                ]\n              }\n            },\n            \"paths\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"paths-except\":  {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        }\n      }\n    },\n    \"formatters\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"enable\": {\n          \"description\": \"List of enabled formatters.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/formatter-names\"\n          }\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"gci\": {\n              \"$ref\": \"#/definitions/settings/definitions/gciSettings\"\n            },\n            \"gofmt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofmtSettings\"\n            },\n            \"gofumpt\": {\n              \"$ref\": \"#/definitions/settings/definitions/gofumptSettings\"\n            },\n            \"goimports\": {\n              \"$ref\": \"#/definitions/settings/definitions/goimportsSettings\"\n            },\n            \"golines\": {\n              \"$ref\": \"#/definitions/settings/definitions/golinesSettings\"\n            }\n          }\n        },\n        \"exclusions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"generated\": {\n              \"enum\": [\"strict\", \"lax\", \"disable\"],\n              \"default\": \"strict\"\n            },\n            \"paths\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            },\n            \"warn-unused\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          }\n        }\n      }\n    },\n    \"issues\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"max-issues-per-linter\": {\n          \"description\": \"Maximum issues count per one linter. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 50,\n          \"minimum\": 0\n        },\n        \"max-same-issues\": {\n          \"description\": \"Maximum count of issues with the same text. Set to 0 to disable.\",\n          \"type\": \"integer\",\n          \"default\": 3,\n          \"minimum\": 0\n        },\n        \"new\": {\n          \"description\": \"Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"new-from-merge-base\": {\n          \"description\": \"Show only new issues created after the best common ancestor (merge-base against HEAD).\",\n          \"type\": \"string\"\n        },\n        \"new-from-rev\": {\n          \"description\": \"Show only new issues created after this git revision.\",\n          \"type\": \"string\"\n        },\n        \"new-from-patch\": {\n          \"description\": \"Show only new issues created in git patch with this file path.\",\n          \"type\": \"string\",\n          \"examples\": [\"path/to/patch/file\"]\n        },\n        \"fix\": {\n          \"description\": \"Apply the fixes detected by the linters and formatters (if it's supported by the linter).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"uniq-by-line\": {\n          \"description\": \"Make issues output unique by line.\",\n          \"type\": \"boolean\",\n          \"default\": true\n        },\n        \"whole-files\": {\n          \"description\": \"Show issues in any part of update files (requires new-from-rev or new-from-patch).\",\n          \"type\": \"boolean\",\n          \"default\": false\n        }\n      }\n    },\n    \"severity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"default\": {\n          \"description\": \"Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.\",\n          \"type\": \"string\",\n          \"default\": \"\"\n        },\n        \"rules\": {\n          \"description\": \"When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\\nOnly affects out formats that support setting severity information.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"severity\": {\n                \"type\": \"string\"\n              },\n              \"path\": {\n                \"type\": \"string\"\n              },\n              \"path-except\": {\n                \"type\": \"string\"\n              },\n              \"linters\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/definitions/linter-names\"\n                }\n              },\n              \"text\": {\n                \"type\": \"string\"\n              },\n              \"source\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"severity\"],\n            \"anyOf\": [\n              { \"required\": [\"path\"] },\n              { \"required\": [\"path-except\"] },\n              { \"required\": [\"linters\"] },\n              { \"required\": [\"text\"] },\n              { \"required\": [\"source\"] }\n            ]\n          },\n          \"default\": []\n        }\n      },\n      \"required\": [\"default\"]\n    }\n  }\n}\n"
  },
  {
    "path": "pkg/commands/cache.go",
    "content": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/cache\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype cacheCommand struct {\n\tcmd *cobra.Command\n}\n\nfunc newCacheCommand() *cacheCommand {\n\tc := &cacheCommand{}\n\n\tcacheCmd := &cobra.Command{\n\t\tUse:   \"cache\",\n\t\tShort: \"Cache control and information.\",\n\t\tArgs:  cobra.NoArgs,\n\t\tRunE: func(cmd *cobra.Command, _ []string) error {\n\t\t\treturn cmd.Help()\n\t\t},\n\t}\n\n\tcacheCmd.AddCommand(\n\t\t&cobra.Command{\n\t\t\tUse:               \"clean\",\n\t\t\tShort:             \"Clean cache\",\n\t\t\tArgs:              cobra.NoArgs,\n\t\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\t\tRunE:              c.executeClean,\n\t\t},\n\t\t&cobra.Command{\n\t\t\tUse:               \"status\",\n\t\t\tShort:             \"Show cache status\",\n\t\t\tArgs:              cobra.NoArgs,\n\t\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\t\tRun:               c.executeStatus,\n\t\t},\n\t)\n\n\tc.cmd = cacheCmd\n\n\treturn c\n}\n\nfunc (*cacheCommand) executeClean(_ *cobra.Command, _ []string) error {\n\tcacheDir := cache.DefaultDir()\n\n\tif err := os.RemoveAll(cacheDir); err != nil {\n\t\treturn fmt.Errorf(\"failed to remove dir %s: %w\", cacheDir, err)\n\t}\n\n\treturn nil\n}\n\nfunc (*cacheCommand) executeStatus(_ *cobra.Command, _ []string) {\n\tcacheDir := cache.DefaultDir()\n\n\t_, _ = fmt.Fprintf(logutils.StdOut, \"Dir: %s\\n\", cacheDir)\n\n\tcacheSizeBytes, err := dirSizeBytes(cacheDir)\n\tif err == nil {\n\t\t_, _ = fmt.Fprintf(logutils.StdOut, \"Size: %s\\n\", fsutils.PrettifyBytesCount(cacheSizeBytes))\n\t}\n}\n\nfunc dirSizeBytes(path string) (int64, error) {\n\tvar size int64\n\terr := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {\n\t\tif err == nil && !info.IsDir() {\n\t\t\tsize += info.Size()\n\t\t}\n\t\treturn err\n\t})\n\treturn size, err\n}\n"
  },
  {
    "path": "pkg/commands/config.go",
    "content": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype pathOptions struct {\n\tJSON bool\n}\n\ntype configCommand struct {\n\tviper *viper.Viper\n\tcmd   *cobra.Command\n\n\topts       config.LoaderOptions\n\tverifyOpts verifyOptions\n\tpathOpts   pathOptions\n\n\tbuildInfo BuildInfo\n\n\tlog logutils.Log\n}\n\nfunc newConfigCommand(log logutils.Log, info BuildInfo) *configCommand {\n\tc := &configCommand{\n\t\tviper:     viper.New(),\n\t\tlog:       log,\n\t\tbuildInfo: info,\n\t}\n\n\tconfigCmd := &cobra.Command{\n\t\tUse:   \"config\",\n\t\tShort: \"Configuration file information and verification.\",\n\t\tArgs:  cobra.NoArgs,\n\t\tRunE: func(cmd *cobra.Command, _ []string) error {\n\t\t\treturn cmd.Help()\n\t\t},\n\t\tPersistentPreRunE: c.preRunE,\n\t}\n\n\tverifyCommand := &cobra.Command{\n\t\tUse:               \"verify\",\n\t\tShort:             \"Verify configuration against JSON schema.\",\n\t\tArgs:              cobra.NoArgs,\n\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\tRunE:              c.executeVerify,\n\t\tSilenceUsage:      true,\n\t\tSilenceErrors:     true,\n\t}\n\n\tpathCommand := &cobra.Command{\n\t\tUse:               \"path\",\n\t\tShort:             \"Print used configuration path.\",\n\t\tArgs:              cobra.NoArgs,\n\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\tRunE:              c.executePath,\n\t}\n\n\tconfigCmd.AddCommand(\n\t\tpathCommand,\n\t\tverifyCommand,\n\t)\n\n\tflagSet := configCmd.PersistentFlags()\n\tflagSet.SortFlags = false // sort them as they are defined here\n\n\tsetupConfigFileFlagSet(flagSet, &c.opts)\n\n\t// ex: --schema jsonschema/golangci.next.jsonschema.json\n\tverifyFlagSet := verifyCommand.Flags()\n\tverifyFlagSet.StringVar(&c.verifyOpts.schemaURL, \"schema\", \"\", color.GreenString(\"JSON schema URL\"))\n\t_ = verifyFlagSet.MarkHidden(\"schema\")\n\n\tpathFlagSet := pathCommand.Flags()\n\tpathFlagSet.BoolVar(&c.pathOpts.JSON, \"json\", false, color.GreenString(\"Display as JSON\"))\n\n\tc.cmd = configCmd\n\n\treturn c\n}\n\nfunc (c *configCommand) preRunE(cmd *cobra.Command, args []string) error {\n\t// The command doesn't depend on the real configuration.\n\t// It only needs to know the path of the configuration file.\n\tcfg := config.NewDefault()\n\n\tloader := config.NewLintersLoader(c.log.Child(logutils.DebugKeyConfigReader), c.viper, cmd.Flags(), c.opts, cfg, args)\n\n\terr := loader.Load(config.LoadOptions{})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't load config: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (c *configCommand) executePath(cmd *cobra.Command, _ []string) error {\n\tusedConfigFile := c.getUsedConfig()\n\n\tif c.pathOpts.JSON {\n\t\tabs, err := filepath.Abs(usedConfigFile)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn json.NewEncoder(cmd.OutOrStdout()).Encode(map[string]string{\n\t\t\t\"path\":         usedConfigFile,\n\t\t\t\"absolutePath\": abs,\n\t\t})\n\t}\n\n\tif usedConfigFile == \"\" {\n\t\tc.log.Warnf(\"No config file detected\")\n\t\tos.Exit(exitcodes.NoConfigFileDetected)\n\t}\n\n\tcmd.Println(usedConfigFile)\n\n\treturn nil\n}\n\n// getUsedConfig returns the resolved path to the golangci config file,\n// or the empty string if no configuration could be found.\nfunc (c *configCommand) getUsedConfig() string {\n\tusedConfigFile := c.viper.ConfigFileUsed()\n\tif usedConfigFile == \"\" {\n\t\treturn \"\"\n\t}\n\n\tprettyUsedConfigFile, err := fsutils.ShortestRelPath(usedConfigFile, \"\")\n\tif err != nil {\n\t\tc.log.Warnf(\"Can't pretty print config file path: %s\", err)\n\t\treturn usedConfigFile\n\t}\n\n\treturn prettyUsedConfigFile\n}\n"
  },
  {
    "path": "pkg/commands/config_verify.go",
    "content": "package commands\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\thcversion \"github.com/hashicorp/go-version\"\n\t\"github.com/pelletier/go-toml/v2\"\n\t\"github.com/santhosh-tekuri/jsonschema/v6\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/pflag\"\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n)\n\ntype verifyOptions struct {\n\tschemaURL string // For debugging purpose only (Flag only).\n}\n\nfunc (c *configCommand) executeVerify(cmd *cobra.Command, _ []string) error {\n\tusedConfigFile := c.getUsedConfig()\n\tif usedConfigFile == \"\" {\n\t\tc.log.Warnf(\"No config file detected\")\n\t\tos.Exit(exitcodes.NoConfigFileDetected)\n\t}\n\n\tschemaURL, err := createSchemaURL(cmd.Flags(), c.buildInfo)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get JSON schema: %w\", err)\n\t}\n\n\tc.log.Infof(\"Verifying the configuration file %q with the JSON Schema from %s\", usedConfigFile, schemaURL)\n\n\terr = validateConfiguration(schemaURL, usedConfigFile)\n\tif err != nil {\n\t\tvar v *jsonschema.ValidationError\n\t\tif !errors.As(err, &v) {\n\t\t\treturn fmt.Errorf(\"[%s] validate: %w\", usedConfigFile, err)\n\t\t}\n\n\t\tprintValidationDetail(cmd, v.DetailedOutput())\n\n\t\treturn errors.New(\"the configuration contains invalid elements\")\n\t}\n\n\treturn nil\n}\n\nfunc createSchemaURL(flags *pflag.FlagSet, buildInfo BuildInfo) (string, error) {\n\tschemaURL, err := flags.GetString(\"schema\")\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"get schema flag: %w\", err)\n\t}\n\n\tif schemaURL != \"\" {\n\t\treturn schemaURL, nil\n\t}\n\n\tswitch {\n\tcase buildInfo.Version != \"\" && buildInfo.Version != \"(devel)\":\n\t\tversion, err := hcversion.NewVersion(buildInfo.Version)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"parse version: %w\", err)\n\t\t}\n\n\t\tif version.Core().Equal(hcversion.Must(hcversion.NewVersion(\"v0.0.0\"))) {\n\t\t\tcommit, err := extractCommitHash(buildInfo)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\n\t\t\treturn fmt.Sprintf(\"https://raw.githubusercontent.com/golangci/golangci-lint/%s/jsonschema/golangci.next.jsonschema.json\",\n\t\t\t\tcommit), nil\n\t\t}\n\n\t\treturn fmt.Sprintf(\"https://golangci-lint.run/jsonschema/golangci.v%d.%d.jsonschema.json\",\n\t\t\tversion.Segments()[0], version.Segments()[1]), nil\n\n\tcase buildInfo.Commit != \"\" && buildInfo.Commit != \"?\":\n\t\tcommit, err := extractCommitHash(buildInfo)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\treturn fmt.Sprintf(\"https://raw.githubusercontent.com/golangci/golangci-lint/%s/jsonschema/golangci.next.jsonschema.json\",\n\t\t\tcommit), nil\n\n\tdefault:\n\t\treturn \"\", errors.New(\"version not found\")\n\t}\n}\n\nfunc extractCommitHash(buildInfo BuildInfo) (string, error) {\n\tif buildInfo.Commit == \"\" || buildInfo.Commit == \"?\" {\n\t\treturn \"\", errors.New(\"empty commit information\")\n\t}\n\n\tif buildInfo.Commit == \"unknown\" {\n\t\treturn \"\", errors.New(\"unknown commit information\")\n\t}\n\n\tcommit := buildInfo.Commit\n\n\tif after, ok := strings.CutPrefix(commit, \"(\"); ok {\n\t\tc, _, ok := strings.Cut(after, \",\")\n\t\tif !ok {\n\t\t\treturn \"\", errors.New(\"commit information not found\")\n\t\t}\n\n\t\tcommit = c\n\t}\n\n\tif commit == \"unknown\" {\n\t\treturn \"\", errors.New(\"unknown commit information\")\n\t}\n\n\treturn commit, nil\n}\n\nfunc validateConfiguration(schemaPath, targetFile string) error {\n\tcompiler := jsonschema.NewCompiler()\n\tcompiler.UseLoader(jsonschema.SchemeURLLoader{\n\t\t\"file\":  jsonschema.FileLoader{},\n\t\t\"https\": newJSONSchemaHTTPLoader(),\n\t})\n\tcompiler.DefaultDraft(jsonschema.Draft7)\n\n\tschema, err := compiler.Compile(schemaPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"compile schema: %w\", err)\n\t}\n\n\tvar m any\n\n\tswitch strings.ToLower(filepath.Ext(targetFile)) {\n\tcase \".yaml\", \".yml\", \".json\":\n\t\tm, err = decodeYamlFile(targetFile)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\tcase \".toml\":\n\t\tm, err = decodeTomlFile(targetFile)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\tdefault:\n\t\t// unsupported\n\t\treturn errors.New(\"unsupported configuration format\")\n\t}\n\n\treturn schema.Validate(m)\n}\n\nfunc printValidationDetail(cmd *cobra.Command, detail *jsonschema.OutputUnit) {\n\tif detail.Error != nil {\n\t\tdata, _ := json.Marshal(detail.Error)\n\t\tdetails, _ := strconv.Unquote(string(data))\n\n\t\tcmd.PrintErrf(\"jsonschema: %q does not validate with %q: %s\\n\",\n\t\t\tstrings.ReplaceAll(strings.TrimPrefix(detail.InstanceLocation, \"/\"), \"/\", \".\"), detail.KeywordLocation, details)\n\t}\n\n\tfor _, d := range detail.Errors {\n\t\tprintValidationDetail(cmd, &d)\n\t}\n}\n\nfunc decodeYamlFile(filename string) (any, error) {\n\tfile, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"[%s] file open: %w\", filename, err)\n\t}\n\n\tdefer func() { _ = file.Close() }()\n\n\tvar m any\n\terr = yaml.NewDecoder(file).Decode(&m)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"[%s] YAML decode: %w\", filename, err)\n\t}\n\n\treturn m, nil\n}\n\nfunc decodeTomlFile(filename string) (any, error) {\n\tfile, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"[%s] file open: %w\", filename, err)\n\t}\n\n\tdefer func() { _ = file.Close() }()\n\n\tvar m any\n\terr = toml.NewDecoder(file).Decode(&m)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"[%s] TOML decode: %w\", filename, err)\n\t}\n\n\treturn m, nil\n}\n\ntype jsonschemaHTTPLoader struct {\n\t*http.Client\n}\n\nfunc newJSONSchemaHTTPLoader() *jsonschemaHTTPLoader {\n\treturn &jsonschemaHTTPLoader{Client: &http.Client{\n\t\tTimeout: 2 * time.Second,\n\t}}\n}\n\nfunc (l jsonschemaHTTPLoader) Load(url string) (any, error) {\n\treq, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url, http.NoBody)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tresp, err := l.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn nil, fmt.Errorf(\"%s returned status code %d\", url, resp.StatusCode)\n\t}\n\n\treturn jsonschema.UnmarshalJSON(resp.Body)\n}\n"
  },
  {
    "path": "pkg/commands/config_verify_test.go",
    "content": "package commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/spf13/pflag\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_createSchemaURL(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tflag     string\n\t\tinfo     BuildInfo\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"schema flag only\",\n\t\t\tflag:     \"https://example.com\",\n\t\t\texpected: \"https://example.com\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"schema flag and build info\",\n\t\t\tflag: \"https://example.com\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"v1.0.0\",\n\t\t\t\tCommit:  \"cd8b11773c6c1f595e8eb98c0d4310af20ae20df\",\n\t\t\t},\n\t\t\texpected: \"https://example.com\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"version and commit\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"v1.0.0\",\n\t\t\t\tCommit:  \"cd8b11773c6c1f595e8eb98c0d4310af20ae20df\",\n\t\t\t},\n\t\t\texpected: \"https://golangci-lint.run/jsonschema/golangci.v1.0.jsonschema.json\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"commit only\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tCommit: \"cd8b11773c6c1f595e8eb98c0d4310af20ae20df\",\n\t\t\t},\n\t\t\texpected: \"https://raw.githubusercontent.com/golangci/golangci-lint/cd8b11773c6c1f595e8eb98c0d4310af20ae20df/jsonschema/golangci.next.jsonschema.json\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"version devel and commit\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"(devel)\",\n\t\t\t\tCommit:  \"cd8b11773c6c1f595e8eb98c0d4310af20ae20df\",\n\t\t\t},\n\t\t\texpected: \"https://raw.githubusercontent.com/golangci/golangci-lint/cd8b11773c6c1f595e8eb98c0d4310af20ae20df/jsonschema/golangci.next.jsonschema.json\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"composite commit info\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"\",\n\t\t\t\tCommit:  `(cd8b11773c6c1f595e8eb98c0d4310af20ae20df, modified: \"false\", mod sum: \"123\")`,\n\t\t\t},\n\t\t\texpected: \"https://raw.githubusercontent.com/golangci/golangci-lint/cd8b11773c6c1f595e8eb98c0d4310af20ae20df/jsonschema/golangci.next.jsonschema.json\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"v0 version\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"v0.0.0-20250213211019-0a603e49e5e9\",\n\t\t\t\tCommit:  `(0a603e49e5e9870f5f9f2035bcbe42cd9620a9d5, modified: \"false\", mod sum: \"123\")`,\n\t\t\t},\n\t\t\texpected: \"https://raw.githubusercontent.com/golangci/golangci-lint/0a603e49e5e9870f5f9f2035bcbe42cd9620a9d5/jsonschema/golangci.next.jsonschema.json\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"dirty\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"v1.64.6-0.20250225205237-3eecab1ebde9+dirty\",\n\t\t\t\tCommit:  `(3eecab1ebde9, modified: \"false\", mod sum: \"123\")`,\n\t\t\t},\n\t\t\texpected: \"https://golangci-lint.run/jsonschema/golangci.v1.64.jsonschema.json\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tflags := pflag.NewFlagSet(\"test\", pflag.ContinueOnError)\n\t\t\tflags.String(\"schema\", \"\", \"\")\n\t\t\tif test.flag != \"\" {\n\t\t\t\t_ = flags.Set(\"schema\", test.flag)\n\t\t\t}\n\n\t\t\tschemaURL, err := createSchemaURL(flags, test.info)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, schemaURL)\n\t\t})\n\t}\n}\n\nfunc Test_createSchemaURL_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tinfo     BuildInfo\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"unknown commit\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tCommit: \"unknown\",\n\t\t\t},\n\t\t\texpected: \"unknown commit information\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"detailed unknown commit\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"\",\n\t\t\t\tCommit:  `(unknown, modified: ?, mod sum: \"\")`,\n\t\t\t},\n\t\t\texpected: \"unknown commit information\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"commit ?\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tCommit: \"?\",\n\t\t\t},\n\t\t\texpected: \"version not found\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"version devel only\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"(devel)\",\n\t\t\t},\n\t\t\texpected: \"version not found\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid version\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"example\",\n\t\t\t},\n\t\t\texpected: \"parse version: malformed version: example\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid composite commit info\",\n\t\t\tinfo: BuildInfo{\n\t\t\t\tVersion: \"\",\n\t\t\t\tCommit:  `(cd8b11773c6c1f595e8eb98c0d4310af20ae20df)`,\n\t\t\t},\n\t\t\texpected: \"commit information not found\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tflags := pflag.NewFlagSet(\"test\", pflag.ContinueOnError)\n\t\t\tflags.String(\"schema\", \"\", \"\")\n\n\t\t\t_, err := createSchemaURL(flags, test.info)\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/custom.go",
    "content": "package commands\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nconst envKeepTempFiles = \"CUSTOM_GCL_KEEP_TEMP_FILES\"\n\ntype customOptions struct {\n\tversion     string\n\tname        string\n\tdestination string\n}\n\ntype customCommand struct {\n\tcmd *cobra.Command\n\n\tcfg *internal.Configuration\n\n\topts customOptions\n\n\tlog logutils.Log\n}\n\nfunc newCustomCommand(logger logutils.Log) *customCommand {\n\tc := &customCommand{log: logger}\n\n\tcustomCmd := &cobra.Command{\n\t\tUse:          \"custom\",\n\t\tShort:        \"Build a version of golangci-lint with custom linters.\",\n\t\tArgs:         cobra.NoArgs,\n\t\tPreRunE:      c.preRunE,\n\t\tRunE:         c.runE,\n\t\tSilenceUsage: true,\n\t}\n\n\tflagSet := customCmd.PersistentFlags()\n\tflagSet.SortFlags = false // sort them as they are defined here\n\n\tflagSet.StringVar(&c.opts.version, \"version\", \"\", color.GreenString(\"The golangci-lint version used to build the custom binary\"))\n\tflagSet.StringVar(&c.opts.name, \"name\", \"\", color.GreenString(\"The name of the custom binary\"))\n\tflagSet.StringVar(&c.opts.destination, \"destination\", \"\", color.GreenString(\"The directory path used to store the custom binary\"))\n\n\tc.cmd = customCmd\n\n\treturn c\n}\n\nfunc (c *customCommand) preRunE(_ *cobra.Command, _ []string) error {\n\tcfg, err := internal.LoadConfiguration()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif c.opts.version != \"\" {\n\t\tcfg.Version = c.opts.version\n\t}\n\n\tif c.opts.name != \"\" {\n\t\tcfg.Name = c.opts.name\n\t}\n\n\tif c.opts.destination != \"\" {\n\t\tcfg.Destination = c.opts.destination\n\t}\n\n\terr = cfg.Validate()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.cfg = cfg\n\n\treturn nil\n}\n\nfunc (c *customCommand) runE(cmd *cobra.Command, _ []string) error {\n\ttmp, err := os.MkdirTemp(os.TempDir(), \"custom-gcl\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create temporary directory: %w\", err)\n\t}\n\n\tdefer func() {\n\t\tif os.Getenv(envKeepTempFiles) != \"\" {\n\t\t\tlog.Printf(\"WARN: The env var %s has been detected: the temporary directory is preserved: %s\", envKeepTempFiles, tmp)\n\n\t\t\treturn\n\t\t}\n\n\t\t_ = os.RemoveAll(tmp)\n\t}()\n\n\terr = internal.NewBuilder(c.log, c.cfg, tmp).Build(cmd.Context())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"build process: %w\", err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/commands/flagsets.go",
    "content": "package commands\n\nimport (\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/pflag\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n)\n\nconst defaultMaxIssuesPerLinter = 50\n\nfunc setupLintersFlagSet(v *viper.Viper, fs *pflag.FlagSet) {\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"default\", \"linters.default\", config.GroupStandard,\n\t\tcolor.GreenString(\"Default set of linters to enable\"))\n\n\tinternal.AddHackedStringSliceP(fs, \"disable\", \"D\", color.GreenString(\"Disable specific linter\"))\n\tinternal.AddHackedStringSliceP(fs, \"enable\", \"E\", color.GreenString(\"Enable specific linter\"))\n\n\tfs.StringSlice(\"enable-only\", nil,\n\t\tcolor.GreenString(\"Override linters configuration section to only run the specific linter(s)\")) // Flags only.\n\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"fast-only\", \"linters.fast-only\", false,\n\t\tcolor.GreenString(\"Filter enabled linters to run only fast linters\"))\n}\n\nfunc setupFormattersFlagSet(v *viper.Viper, fs *pflag.FlagSet) {\n\tinternal.AddFlagAndBindP(v, fs, fs.StringSliceP, \"enable\", \"E\", \"formatters.enable\", nil,\n\t\tcolor.GreenString(\"Enable specific formatter\"))\n}\n\nfunc setupRunFlagSet(v *viper.Viper, fs *pflag.FlagSet) {\n\tinternal.AddFlagAndBindP(v, fs, fs.IntP, \"concurrency\", \"j\", \"run.concurrency\", 0,\n\t\tcolor.GreenString(\"Number of CPUs to use (Default: Automatically set to match Linux container CPU quota\"+\n\t\t\t\" and fall back to the number of logical CPUs in the machine)\"))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"modules-download-mode\", \"run.modules-download-mode\", \"\",\n\t\tcolor.GreenString(\"Modules download mode. If not empty, passed as -mod=<mode> to go tools\"))\n\tinternal.AddFlagAndBind(v, fs, fs.Int, \"issues-exit-code\", \"run.issues-exit-code\", exitcodes.IssuesFound,\n\t\tcolor.GreenString(\"Exit code when issues were found\"))\n\tinternal.AddHackedStringSlice(fs, \"build-tags\", color.GreenString(\"Build tags\"))\n\n\tinternal.AddFlagAndBind(v, fs, fs.Duration, \"timeout\", \"run.timeout\", defaultTimeout,\n\t\tcolor.GreenString(\"Timeout for total work. Disabled by default\"))\n\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"tests\", \"run.tests\", true, color.GreenString(\"Analyze tests (*_test.go)\"))\n\n\tinternal.AddDeprecatedHackedStringSlice(fs, \"skip-files\", color.GreenString(\"Regexps of files to skip\"))\n\tinternal.AddDeprecatedHackedStringSlice(fs, \"skip-dirs\", color.GreenString(\"Regexps of directories to skip\"))\n\n\tconst allowParallelDesc = \"Allow multiple parallel golangci-lint instances running.\\n\" +\n\t\t\"If false (default) - golangci-lint acquires file lock on start.\"\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"allow-parallel-runners\", \"run.allow-parallel-runners\", false,\n\t\tcolor.GreenString(allowParallelDesc))\n\tconst allowSerialDesc = \"Allow multiple golangci-lint instances running, but serialize them around a lock.\\n\" +\n\t\t\"If false (default) - golangci-lint exits with an error if it fails to acquire file lock on start.\"\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"allow-serial-runners\", \"run.allow-serial-runners\", false, color.GreenString(allowSerialDesc))\n}\n\nfunc setupOutputFlagSet(v *viper.Viper, fs *pflag.FlagSet) {\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"path-prefix\", \"output.path-prefix\", \"\",\n\t\tcolor.GreenString(\"Path prefix to add to output\"))\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"path-mode\", \"output.path-mode\", \"\",\n\t\tcolor.GreenString(\"Path mode to use (empty, or 'abs')\"))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"show-stats\", \"output.show-stats\", true, color.GreenString(\"Show statistics per linter\"))\n\n\tsetupOutputFormatsFlagSet(v, fs)\n}\n\nfunc setupOutputFormatsFlagSet(v *viper.Viper, fs *pflag.FlagSet) {\n\toutputPathDesc := \"Output path can be either `stdout`, `stderr` or path to the file to write to.\"\n\tprintLinterNameDesc := \"Print linter name in the end of issue text.\"\n\tcolorsDesc := \"Use colors.\"\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.text.path\", \"output.formats.text.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"output.text.print-linter-name\", \"output.formats.text.print-linter-name\", true,\n\t\tcolor.GreenString(printLinterNameDesc))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"output.text.print-issued-lines\", \"output.formats.text.print-issued-lines\", true,\n\t\tcolor.GreenString(\"Print lines of code with issue.\"))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"output.text.colors\", \"output.formats.text.colors\", true,\n\t\tcolor.GreenString(colorsDesc))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.json.path\", \"output.formats.json.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.tab.path\", \"output.formats.tab.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"output.tab.print-linter-name\", \"output.formats.tab.print-linter-name\",\n\t\ttrue, color.GreenString(printLinterNameDesc))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"output.tab.colors\", \"output.formats.tab.colors\", true,\n\t\tcolor.GreenString(colorsDesc))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.html.path\", \"output.formats.html.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.checkstyle.path\", \"output.formats.checkstyle.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.code-climate.path\", \"output.formats.code-climate.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.junit-xml.path\", \"output.formats.junit-xml.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"output.junit-xml.extended\", \"output.formats.junit-xml.extended\", false,\n\t\tcolor.GreenString(\"Support extra JUnit XML fields.\"))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.teamcity.path\", \"output.formats.teamcity.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"output.sarif.path\", \"output.formats.sarif.path\", \"\",\n\t\tcolor.GreenString(outputPathDesc))\n}\n\nfunc setupIssuesFlagSet(v *viper.Viper, fs *pflag.FlagSet) {\n\tinternal.AddFlagAndBind(v, fs, fs.Int, \"max-issues-per-linter\", \"issues.max-issues-per-linter\", defaultMaxIssuesPerLinter,\n\t\tcolor.GreenString(\"Maximum issues count per one linter. Set to 0 to disable\"))\n\tinternal.AddFlagAndBind(v, fs, fs.Int, \"max-same-issues\", \"issues.max-same-issues\", 3,\n\t\tcolor.GreenString(\"Maximum count of issues with the same text. Set to 0 to disable\"))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"uniq-by-line\", \"issues.uniq-by-line\", true,\n\t\tcolor.GreenString(\"Make issues output unique by line\"))\n\n\tconst newDesc = \"Show only new issues: if there are unstaged changes or untracked files, only those changes \" +\n\t\t\"are analyzed, else only changes in HEAD~ are analyzed.\\nIt's a super-useful option for integration \" +\n\t\t\"of golangci-lint into existing large codebase.\\nIt's not practical to fix all existing issues at \" +\n\t\t\"the moment of integration: much better to not allow issues in new code.\\nFor CI setups, prefer \" +\n\t\t\"--new-from-rev=HEAD~, as --new can skip linting the current patch if any scripts generate \" +\n\t\t\"unstaged files before golangci-lint runs.\"\n\tinternal.AddFlagAndBindP(v, fs, fs.BoolP, \"new\", \"n\", \"issues.new\", false, color.GreenString(newDesc))\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"new-from-rev\", \"issues.new-from-rev\", \"\",\n\t\tcolor.GreenString(\"Show only new issues created after git revision `REV`\"))\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"new-from-patch\", \"issues.new-from-patch\", \"\",\n\t\tcolor.GreenString(\"Show only new issues created in git patch with file path `PATH`\"))\n\tinternal.AddFlagAndBind(v, fs, fs.String, \"new-from-merge-base\", \"issues.new-from-merge-base\", \"\",\n\t\tcolor.GreenString(\"Show only new issues created after the best common ancestor (merge-base against HEAD)\"))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"whole-files\", \"issues.whole-files\", false,\n\t\tcolor.GreenString(\"Show issues in any part of update files (requires new-from-rev or new-from-patch)\"))\n\tinternal.AddFlagAndBind(v, fs, fs.Bool, \"fix\", \"issues.fix\", false,\n\t\tcolor.GreenString(\"Apply the fixes detected by the linters and formatters (if it's supported by the linter)\"))\n}\n"
  },
  {
    "path": "pkg/commands/fmt.go",
    "content": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformat\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result/processors\"\n)\n\ntype fmtOptions struct {\n\tconfig.LoaderOptions\n\n\tdiff        bool // Flag only.\n\tdiffColored bool // Flag only.\n\tstdin       bool // Flag only.\n}\n\ntype fmtCommand struct {\n\tviper *viper.Viper\n\tcmd   *cobra.Command\n\n\topts fmtOptions\n\n\tcfg *config.Config\n\n\tbuildInfo BuildInfo\n\n\trunner *goformat.Runner\n\n\tlog logutils.Log\n}\n\nfunc newFmtCommand(logger logutils.Log, info BuildInfo) *fmtCommand {\n\tc := &fmtCommand{\n\t\tviper:     viper.New(),\n\t\tlog:       logger,\n\t\tcfg:       config.NewDefault(),\n\t\tbuildInfo: info,\n\t}\n\n\tfmtCmd := &cobra.Command{\n\t\tUse:               \"fmt\",\n\t\tShort:             \"Format Go source files.\",\n\t\tRunE:              c.execute,\n\t\tPreRunE:           c.preRunE,\n\t\tPersistentPreRunE: c.persistentPreRunE,\n\t\tPersistentPostRun: c.persistentPostRun,\n\t\tSilenceUsage:      true,\n\t}\n\n\tfmtCmd.SetOut(logutils.StdOut) // use custom output to properly color it in Windows terminals\n\tfmtCmd.SetErr(logutils.StdErr)\n\n\tfs := fmtCmd.Flags()\n\tfs.SortFlags = false // sort them as they are defined here\n\n\tsetupConfigFileFlagSet(fs, &c.opts.LoaderOptions)\n\n\tsetupFormattersFlagSet(c.viper, fs)\n\n\tfs.BoolVarP(&c.opts.diff, \"diff\", \"d\", false, color.GreenString(\"Display diffs instead of rewriting files\"))\n\tfs.BoolVar(&c.opts.diffColored, \"diff-colored\", false, color.GreenString(\"Display diffs instead of rewriting files (with colors)\"))\n\tfs.BoolVar(&c.opts.stdin, \"stdin\", false, color.GreenString(\"Use standard input for piping source files\"))\n\n\tc.cmd = fmtCmd\n\n\treturn c\n}\n\nfunc (c *fmtCommand) persistentPreRunE(cmd *cobra.Command, args []string) error {\n\tc.log.Infof(\"%s\", c.buildInfo.String())\n\n\tloader := config.NewFormattersLoader(c.log.Child(logutils.DebugKeyConfigReader), c.viper, cmd.Flags(), c.opts.LoaderOptions, c.cfg, args)\n\n\terr := loader.Load(config.LoadOptions{CheckDeprecation: true, Validation: true})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't load config: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (c *fmtCommand) preRunE(_ *cobra.Command, _ []string) error {\n\tif c.cfg.GetConfigDir() != \"\" && c.cfg.Version != \"2\" {\n\t\treturn fmt.Errorf(\"invalid version of the configuration: %q\", c.cfg.Version)\n\t}\n\n\tmetaFormatter, err := goformatters.NewMetaFormatter(c.log, &c.cfg.Formatters, &c.cfg.Run)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create meta-formatter: %w\", err)\n\t}\n\n\tmatcher := processors.NewGeneratedFileMatcher(c.cfg.Formatters.Exclusions.Generated)\n\n\topts, err := goformat.NewRunnerOptions(c.cfg, c.opts.diff, c.opts.diffColored, c.opts.stdin)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"build walk options: %w\", err)\n\t}\n\n\tc.runner = goformat.NewRunner(c.log, metaFormatter, matcher, opts)\n\n\treturn nil\n}\n\nfunc (c *fmtCommand) execute(_ *cobra.Command, args []string) error {\n\tpaths := cleanArgs(args)\n\n\tc.log.Infof(\"Formatting Go files...\")\n\n\terr := c.runner.Run(paths)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to process files: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (c *fmtCommand) persistentPostRun(_ *cobra.Command, _ []string) {\n\tif c.runner.ExitCode() != 0 {\n\t\tos.Exit(c.runner.ExitCode())\n\t}\n}\n\nfunc cleanArgs(args []string) []string {\n\tif len(args) == 0 {\n\t\treturn []string{\".\"}\n\t}\n\n\tvar expanded []string\n\tfor _, arg := range args {\n\t\texpanded = append(expanded, filepath.Clean(strings.ReplaceAll(arg, \"...\", \"\")))\n\t}\n\n\treturn expanded\n}\n"
  },
  {
    "path": "pkg/commands/formatters.go",
    "content": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype formattersHelp struct {\n\tEnabled  []formatterHelp\n\tDisabled []formatterHelp\n}\n\ntype formattersOptions struct {\n\tconfig.LoaderOptions\n\tJSON bool\n}\n\ntype formattersCommand struct {\n\tviper *viper.Viper\n\tcmd   *cobra.Command\n\n\topts formattersOptions\n\n\tcfg *config.Config\n\n\tlog logutils.Log\n\n\tdbManager *lintersdb.Manager\n}\n\nfunc newFormattersCommand(logger logutils.Log) *formattersCommand {\n\tc := &formattersCommand{\n\t\tviper: viper.New(),\n\t\tcfg:   config.NewDefault(),\n\t\tlog:   logger,\n\t}\n\n\tformattersCmd := &cobra.Command{\n\t\tUse:               \"formatters\",\n\t\tShort:             \"List current formatters configuration.\",\n\t\tArgs:              cobra.NoArgs,\n\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\tRunE:              c.execute,\n\t\tPreRunE:           c.preRunE,\n\t\tSilenceUsage:      true,\n\t}\n\n\tfs := formattersCmd.Flags()\n\tfs.SortFlags = false // sort them as they are defined here\n\n\tsetupConfigFileFlagSet(fs, &c.opts.LoaderOptions)\n\n\tsetupFormattersFlagSet(c.viper, fs)\n\n\tfs.BoolVar(&c.opts.JSON, \"json\", false, color.GreenString(\"Display as JSON\"))\n\n\tc.cmd = formattersCmd\n\n\treturn c\n}\n\nfunc (c *formattersCommand) preRunE(cmd *cobra.Command, args []string) error {\n\tloader := config.NewFormattersLoader(c.log.Child(logutils.DebugKeyConfigReader), c.viper, cmd.Flags(), c.opts.LoaderOptions, c.cfg, args)\n\n\terr := loader.Load(config.LoadOptions{Validation: true})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't load config: %w\", err)\n\t}\n\n\tdbManager, err := lintersdb.NewManager(c.log.Child(logutils.DebugKeyLintersDB), c.cfg,\n\t\tlintersdb.NewLinterBuilder(), lintersdb.NewPluginModuleBuilder(c.log), lintersdb.NewPluginGoBuilder(c.log))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.dbManager = dbManager\n\n\treturn nil\n}\n\nfunc (c *formattersCommand) execute(_ *cobra.Command, _ []string) error {\n\tenabledLintersMap, err := c.dbManager.GetEnabledLintersMap()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't get enabled formatters: %w\", err)\n\t}\n\n\tvar enabledFormatters []*linter.Config\n\tvar disabledFormatters []*linter.Config\n\n\tfor _, lc := range c.dbManager.GetAllSupportedLinterConfigs() {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif !goformatters.IsFormatter(lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif enabledLintersMap[lc.Name()] == nil {\n\t\t\tdisabledFormatters = append(disabledFormatters, lc)\n\t\t} else {\n\t\t\tenabledFormatters = append(enabledFormatters, lc)\n\t\t}\n\t}\n\n\tif c.opts.JSON {\n\t\tformatters := formattersHelp{}\n\n\t\tfor _, lc := range enabledFormatters {\n\t\t\tformatters.Enabled = append(formatters.Enabled, newFormatterHelp(lc))\n\t\t}\n\n\t\tfor _, lc := range disabledFormatters {\n\t\t\tformatters.Disabled = append(formatters.Disabled, newFormatterHelp(lc))\n\t\t}\n\n\t\treturn json.NewEncoder(c.cmd.OutOrStdout()).Encode(formatters)\n\t}\n\n\tcolor.Green(\"Enabled by your configuration formatters:\\n\")\n\tprintFormatters(enabledFormatters)\n\n\tcolor.Red(\"\\nDisabled by your configuration formatters:\\n\")\n\tprintFormatters(disabledFormatters)\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/commands/help.go",
    "content": "package commands\n\nimport (\n\t\"strings\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype helpOptions struct {\n\tJSON bool\n}\n\ntype helpCommand struct {\n\tcmd *cobra.Command\n\n\topts helpOptions\n\n\tdbManager *lintersdb.Manager\n\n\tlog logutils.Log\n}\n\nfunc newHelpCommand(logger logutils.Log) *helpCommand {\n\tc := &helpCommand{log: logger}\n\n\thelpCmd := &cobra.Command{\n\t\tUse:   \"help\",\n\t\tShort: \"Display extra help\",\n\t\tArgs:  cobra.NoArgs,\n\t\tRunE: func(cmd *cobra.Command, _ []string) error {\n\t\t\treturn cmd.Help()\n\t\t},\n\t}\n\n\tlintersCmd := &cobra.Command{\n\t\tUse:               \"linters\",\n\t\tShort:             \"Display help for linters.\",\n\t\tArgs:              cobra.NoArgs,\n\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\tRunE:              c.lintersExecute,\n\t\tPreRunE:           c.lintersPreRunE,\n\t}\n\n\tfsLinter := lintersCmd.Flags()\n\tfsLinter.SortFlags = false // sort them as they are defined here\n\n\tfsLinter.BoolVar(&c.opts.JSON, \"json\", false, color.GreenString(\"Display as JSON\"))\n\n\thelpCmd.AddCommand(lintersCmd)\n\n\tformattersCmd := &cobra.Command{\n\t\tUse:               \"formatters\",\n\t\tShort:             \"Display help for formatters.\",\n\t\tArgs:              cobra.NoArgs,\n\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\tRunE:              c.formattersExecute,\n\t\tPreRunE:           c.formattersPreRunE,\n\t}\n\n\tfsFormatter := formattersCmd.Flags()\n\tfsFormatter.SortFlags = false // sort them as they are defined here\n\n\tfsFormatter.BoolVar(&c.opts.JSON, \"json\", false, color.GreenString(\"Display as JSON\"))\n\n\thelpCmd.AddCommand(formattersCmd)\n\n\tc.cmd = helpCmd\n\n\treturn c\n}\n\nfunc formatDescription(desc string) string {\n\tdesc = strings.TrimSpace(desc)\n\n\tif desc == \"\" {\n\t\treturn desc\n\t}\n\n\t// If the linter description spans multiple lines, truncate everything following the first newline\n\tendFirstLine := strings.IndexRune(desc, '\\n')\n\tif endFirstLine > 0 {\n\t\tdesc = desc[:endFirstLine]\n\t}\n\n\trawDesc := []rune(desc)\n\n\tr, _ := utf8.DecodeRuneInString(desc)\n\trawDesc[0] = unicode.ToUpper(r)\n\n\tif rawDesc[len(rawDesc)-1] != '.' {\n\t\trawDesc = append(rawDesc, '.')\n\t}\n\n\treturn string(rawDesc)\n}\n"
  },
  {
    "path": "pkg/commands/help_formatters.go",
    "content": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype formatterHelp struct {\n\tName        string `json:\"name\"`\n\tDesc        string `json:\"description\"`\n\tDeprecated  bool   `json:\"deprecated\"`\n\tSince       string `json:\"since\"`\n\tOriginalURL string `json:\"originalURL,omitempty\"`\n}\n\nfunc newFormatterHelp(lc *linter.Config) formatterHelp {\n\treturn formatterHelp{\n\t\tName:        lc.Name(),\n\t\tDesc:        formatDescription(lc.Linter.Desc()),\n\t\tDeprecated:  lc.IsDeprecated(),\n\t\tSince:       lc.Since,\n\t\tOriginalURL: lc.OriginalURL,\n\t}\n}\n\nfunc (c *helpCommand) formattersPreRunE(_ *cobra.Command, _ []string) error {\n\t// The command doesn't depend on the real configuration.\n\tdbManager, err := lintersdb.NewManager(c.log.Child(logutils.DebugKeyLintersDB), config.NewDefault(), lintersdb.NewLinterBuilder())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.dbManager = dbManager\n\n\treturn nil\n}\n\nfunc (c *helpCommand) formattersExecute(_ *cobra.Command, _ []string) error {\n\tif c.opts.JSON {\n\t\treturn c.formattersPrintJSON()\n\t}\n\n\tc.formattersPrint()\n\n\treturn nil\n}\n\nfunc (c *helpCommand) formattersPrintJSON() error {\n\tvar formatters []formatterHelp\n\n\tfor _, lc := range c.dbManager.GetAllSupportedLinterConfigs() {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif !goformatters.IsFormatter(lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tformatters = append(formatters, newFormatterHelp(lc))\n\t}\n\n\treturn json.NewEncoder(c.cmd.OutOrStdout()).Encode(formatters)\n}\n\nfunc (c *helpCommand) formattersPrint() {\n\tvar lcs []*linter.Config\n\tfor _, lc := range c.dbManager.GetAllSupportedLinterConfigs() {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif !goformatters.IsFormatter(lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tlcs = append(lcs, lc)\n\t}\n\n\tcolor.Green(\"Disabled by default formatters:\\n\")\n\tprintFormatters(lcs)\n}\n\nfunc printFormatters(lcs []*linter.Config) {\n\tslices.SortFunc(lcs, func(a, b *linter.Config) int {\n\t\tif a.IsDeprecated() && b.IsDeprecated() {\n\t\t\treturn strings.Compare(a.Name(), b.Name())\n\t\t}\n\n\t\tif a.IsDeprecated() {\n\t\t\treturn 1\n\t\t}\n\n\t\tif b.IsDeprecated() {\n\t\t\treturn -1\n\t\t}\n\n\t\treturn strings.Compare(a.Name(), b.Name())\n\t})\n\n\tfor _, lc := range lcs {\n\t\tdesc := formatDescription(lc.Linter.Desc())\n\n\t\tdeprecatedMark := \"\"\n\t\tif lc.IsDeprecated() {\n\t\t\tdeprecatedMark = \" [\" + color.RedString(\"deprecated\") + \"]\"\n\t\t}\n\n\t\t_, _ = fmt.Fprintf(logutils.StdOut, \"%s%s: %s\\n\",\n\t\t\tcolor.YellowString(lc.Name()), deprecatedMark, desc)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/help_linters.go",
    "content": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"maps\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype linterHelp struct {\n\tName        string   `json:\"name\"`\n\tDesc        string   `json:\"description\"`\n\tGroups      []string `json:\"groups\"`\n\tFast        bool     `json:\"fast\"`\n\tAutoFix     bool     `json:\"autoFix\"`\n\tDeprecated  bool     `json:\"deprecated\"`\n\tSince       string   `json:\"since\"`\n\tOriginalURL string   `json:\"originalURL,omitempty\"`\n}\n\nfunc newLinterHelp(lc *linter.Config) linterHelp {\n\tgroups := []string{config.GroupAll}\n\n\tif !lc.IsSlowLinter() {\n\t\tgroups = append(groups, config.GroupFast)\n\t}\n\n\treturn linterHelp{\n\t\tName:        lc.Name(),\n\t\tDesc:        formatDescription(lc.Linter.Desc()),\n\t\tGroups:      slices.Concat(groups, slices.Collect(maps.Keys(lc.Groups))),\n\t\tFast:        !lc.IsSlowLinter(),\n\t\tAutoFix:     lc.CanAutoFix,\n\t\tDeprecated:  lc.IsDeprecated(),\n\t\tSince:       lc.Since,\n\t\tOriginalURL: lc.OriginalURL,\n\t}\n}\n\nfunc (c *helpCommand) lintersPreRunE(_ *cobra.Command, _ []string) error {\n\t// The command doesn't depend on the real configuration.\n\tdbManager, err := lintersdb.NewManager(c.log.Child(logutils.DebugKeyLintersDB), config.NewDefault(), lintersdb.NewLinterBuilder())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.dbManager = dbManager\n\n\treturn nil\n}\n\nfunc (c *helpCommand) lintersExecute(_ *cobra.Command, _ []string) error {\n\tif c.opts.JSON {\n\t\treturn c.lintersPrintJSON()\n\t}\n\n\tc.lintersPrint()\n\n\treturn nil\n}\n\nfunc (c *helpCommand) lintersPrintJSON() error {\n\tvar linters []linterHelp\n\n\tfor _, lc := range c.dbManager.GetAllSupportedLinterConfigs() {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif goformatters.IsFormatter(lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tlinters = append(linters, newLinterHelp(lc))\n\t}\n\n\treturn json.NewEncoder(c.cmd.OutOrStdout()).Encode(linters)\n}\n\nfunc (c *helpCommand) lintersPrint() {\n\tvar enabledLCs, disabledLCs []*linter.Config\n\tfor _, lc := range c.dbManager.GetAllSupportedLinterConfigs() {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif goformatters.IsFormatter(lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif lc.FromGroup(config.GroupStandard) {\n\t\t\tenabledLCs = append(enabledLCs, lc)\n\t\t} else {\n\t\t\tdisabledLCs = append(disabledLCs, lc)\n\t\t}\n\t}\n\n\tcolor.Green(\"Enabled by default linters:\\n\")\n\tprintLinters(enabledLCs)\n\n\tcolor.Red(\"\\nDisabled by default linters:\\n\")\n\tprintLinters(disabledLCs)\n}\n\nfunc printLinters(lcs []*linter.Config) {\n\tslices.SortFunc(lcs, func(a, b *linter.Config) int {\n\t\tif a.IsDeprecated() && b.IsDeprecated() {\n\t\t\treturn strings.Compare(a.Name(), b.Name())\n\t\t}\n\n\t\tif a.IsDeprecated() {\n\t\t\treturn 1\n\t\t}\n\n\t\tif b.IsDeprecated() {\n\t\t\treturn -1\n\t\t}\n\n\t\treturn strings.Compare(a.Name(), b.Name())\n\t})\n\n\tfor _, lc := range lcs {\n\t\tdesc := formatDescription(lc.Linter.Desc())\n\n\t\tdeprecatedMark := \"\"\n\t\tif lc.IsDeprecated() {\n\t\t\tdeprecatedMark = \" [\" + color.RedString(\"deprecated\") + \"]\"\n\t\t}\n\n\t\tvar capabilities []string\n\t\tif !lc.IsSlowLinter() {\n\t\t\tcapabilities = append(capabilities, color.BlueString(\"fast\"))\n\t\t}\n\t\tif lc.CanAutoFix {\n\t\t\tcapabilities = append(capabilities, color.GreenString(\"auto-fix\"))\n\t\t}\n\n\t\tvar capability string\n\t\tif capabilities != nil {\n\t\t\tcapability = \" [\" + strings.Join(capabilities, \", \") + \"]\"\n\t\t}\n\n\t\t_, _ = fmt.Fprintf(logutils.StdOut, \"%s%s: %s%s\\n\",\n\t\t\tcolor.YellowString(lc.Name()), deprecatedMark, desc, capability)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/help_test.go",
    "content": "package commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Test_formatDescription(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tdoc      string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"empty description\",\n\t\t\tdoc:      \"\",\n\t\t\texpected: \"\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"simple description\",\n\t\t\tdoc:      \"this is a test\",\n\t\t\texpected: \"This is a test.\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"formatted description\",\n\t\t\tdoc:      \"This is a test.\",\n\t\t\texpected: \"This is a test.\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"multiline description\",\n\t\t\tdoc:      \"this is a test\\nanother line\\n\",\n\t\t\texpected: \"This is a test.\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"leading newline\",\n\t\t\tdoc:      \"\\nThis is a test.\",\n\t\t\texpected: \"This is a test.\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tv := formatDescription(test.doc)\n\n\t\t\tassert.Equal(t, test.expected, v)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/builder.go",
    "content": "package internal\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode\"\n\n\t\"golang.org/x/mod/sumdb/dirhash\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\n// Builder runs all the required commands to build a binary.\ntype Builder struct {\n\tcfg *Configuration\n\n\tlog logutils.Log\n\n\troot string\n\trepo string\n}\n\n// NewBuilder creates a new Builder.\nfunc NewBuilder(logger logutils.Log, cfg *Configuration, root string) *Builder {\n\treturn &Builder{\n\t\tcfg:  cfg,\n\t\tlog:  logger,\n\t\troot: root,\n\t\trepo: filepath.Join(root, \"golangci-lint\"),\n\t}\n}\n\n// Build builds the custom binary.\nfunc (b Builder) Build(ctx context.Context) error {\n\tb.log.Infof(\"Cloning golangci-lint repository\")\n\n\terr := b.clone(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"clone golangci-lint: %w\", err)\n\t}\n\n\tb.log.Infof(\"Adding plugin imports\")\n\n\terr = b.updatePluginsFile()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"update plugin file: %w\", err)\n\t}\n\n\tb.log.Infof(\"Adding replace directives\")\n\n\terr = b.addToGoMod(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"add to go.mod: %w\", err)\n\t}\n\n\tb.log.Infof(\"Running go mod tidy\")\n\n\terr = b.goModTidy(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"go mod tidy: %w\", err)\n\t}\n\n\tb.log.Infof(\"Building golangci-lint binary\")\n\n\tbinaryName := b.getBinaryName()\n\n\terr = b.goBuild(ctx, binaryName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"build golangci-lint binary: %w\", err)\n\t}\n\n\tb.log.Infof(\"Moving golangci-lint binary\")\n\n\terr = b.copyBinary(binaryName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"move golangci-lint binary: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) clone(ctx context.Context) error {\n\t//nolint:gosec // the variable is sanitized.\n\tcmd := exec.CommandContext(ctx,\n\t\t\"git\", \"clone\", \"--branch\", sanitizeVersion(b.cfg.Version),\n\t\t\"--single-branch\", \"--depth\", \"1\", \"-c\", \"advice.detachedHead=false\", \"-q\",\n\t\t\"https://github.com/golangci/golangci-lint.git\",\n\t)\n\tcmd.Dir = b.root\n\n\toutput, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tb.log.Infof(\"%s\", string(output))\n\n\t\treturn fmt.Errorf(\"%s: %w\", strings.Join(cmd.Args, \" \"), err)\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) addToGoMod(ctx context.Context) error {\n\tfor _, plugin := range b.cfg.Plugins {\n\t\tif plugin.Path != \"\" {\n\t\t\terr := b.addReplaceDirective(ctx, plugin)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\terr := b.goGet(ctx, plugin)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) goGet(ctx context.Context, plugin *Plugin) error {\n\t//nolint:gosec // the variables are user related.\n\tcmd := exec.CommandContext(ctx, \"go\", \"get\", plugin.Module+\"@\"+plugin.Version)\n\tcmd.Dir = b.repo\n\n\tb.log.Infof(\"run: %s\", strings.Join(cmd.Args, \" \"))\n\n\toutput, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tb.log.Warnf(\"%s\", string(output))\n\n\t\treturn fmt.Errorf(\"%s: %w\", strings.Join(cmd.Args, \" \"), err)\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) addReplaceDirective(ctx context.Context, plugin *Plugin) error {\n\treplace := fmt.Sprintf(\"%s=%s\", plugin.Module, plugin.Path)\n\n\tcmd := exec.CommandContext(ctx, \"go\", \"mod\", \"edit\", \"-replace\", replace)\n\tcmd.Dir = b.repo\n\n\tb.log.Infof(\"run: %s\", strings.Join(cmd.Args, \" \"))\n\n\toutput, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tb.log.Warnf(\"%s\", string(output))\n\n\t\treturn fmt.Errorf(\"%s: %w\", strings.Join(cmd.Args, \" \"), err)\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) goModTidy(ctx context.Context) error {\n\tcmd := exec.CommandContext(ctx, \"go\", \"mod\", \"tidy\")\n\tcmd.Dir = b.repo\n\n\toutput, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tb.log.Warnf(\"%s\", string(output))\n\n\t\treturn fmt.Errorf(\"%s: %w\", strings.Join(cmd.Args, \" \"), err)\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) goBuild(ctx context.Context, binaryName string) error {\n\tversion, err := b.createVersion(b.cfg.Version)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"custom version: %w\", err)\n\t}\n\n\tb.log.Infof(\"version: %s\", version)\n\n\t//nolint:gosec // the variable is sanitized.\n\tcmd := exec.CommandContext(ctx, \"go\", \"build\",\n\t\t\"-ldflags\",\n\t\tfmt.Sprintf(\"-s -w -X 'main.version=%s' -X 'main.date=%s'\", version, time.Now().UTC().String()),\n\t\t\"-o\", binaryName,\n\t\t\"./cmd/golangci-lint\",\n\t)\n\tcmd.Dir = b.repo\n\n\toutput, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tb.log.Warnf(\"%s\", string(output))\n\n\t\treturn fmt.Errorf(\"%s: %w\", strings.Join(cmd.Args, \" \"), err)\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) copyBinary(binaryName string) error {\n\tsrc := filepath.Join(b.repo, binaryName)\n\n\tsource, err := os.Open(filepath.Clean(src))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open source file: %w\", err)\n\t}\n\n\tdefer func() { _ = source.Close() }()\n\n\tinfo, err := source.Stat()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"stat source file: %w\", err)\n\t}\n\n\tif b.cfg.Destination != \"\" {\n\t\terr = os.MkdirAll(b.cfg.Destination, os.ModePerm)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"create destination directory: %w\", err)\n\t\t}\n\t}\n\n\tdst, err := os.OpenFile(filepath.Join(b.cfg.Destination, binaryName), os.O_RDWR|os.O_CREATE|os.O_TRUNC, info.Mode())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create destination file: %w\", err)\n\t}\n\n\tdefer func() { _ = dst.Close() }()\n\n\t_, err = io.Copy(dst, source)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"copy source to destination: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (b Builder) getBinaryName() string {\n\tname := b.cfg.Name\n\tif runtime.GOOS == \"windows\" {\n\t\tname += \".exe\"\n\t}\n\n\treturn name\n}\n\nfunc (b Builder) createVersion(orig string) (string, error) {\n\thash := sha256.New()\n\n\tfor _, plugin := range b.cfg.Plugins {\n\t\tif plugin.Path == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tdh, err := hashDir(plugin.Path, \"\", dirhash.DefaultHash)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"hash plugin directory: %w\", err)\n\t\t}\n\n\t\tb.log.Infof(\"%s: %s\", plugin.Path, dh)\n\n\t\thash.Write([]byte(dh))\n\t}\n\n\treturn fmt.Sprintf(\"%s-custom-gcl-%s\",\n\t\tsanitizeVersion(orig),\n\t\tsanitizeVersion(base64.URLEncoding.EncodeToString(hash.Sum(nil))),\n\t), nil\n}\n\nfunc sanitizeVersion(v string) string {\n\tfn := func(c rune) bool {\n\t\treturn !unicode.IsLetter(c) && !unicode.IsNumber(c) && c != '.' && c != '/'\n\t}\n\n\treturn strings.Join(strings.FieldsFunc(v, fn), \"\")\n}\n"
  },
  {
    "path": "pkg/commands/internal/builder_test.go",
    "content": "package internal\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Test_sanitizeVersion(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tinput    string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"ampersand\",\n\t\t\tinput:    \" te&st\",\n\t\t\texpected: \"test\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"pipe\",\n\t\t\tinput:    \" te|st\",\n\t\t\texpected: \"test\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"version\",\n\t\t\tinput:    \"v1.2.3\",\n\t\t\texpected: \"v1.2.3\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"branch\",\n\t\t\tinput:    \"feat/test\",\n\t\t\texpected: \"feat/test\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"branch\",\n\t\t\tinput:    \"value --key\",\n\t\t\texpected: \"valuekey\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"hash\",\n\t\t\tinput:    \"cd8b1177\",\n\t\t\texpected: \"cd8b1177\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tv := sanitizeVersion(test.input)\n\n\t\t\tassert.Equal(t, test.expected, v)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/configuration.go",
    "content": "package internal\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"go.yaml.in/yaml/v3\"\n)\n\nconst base = \".custom-gcl\"\n\nconst defaultBinaryName = \"custom-gcl\"\n\n// Configuration represents the configuration file.\ntype Configuration struct {\n\t// golangci-lint version.\n\tVersion string `yaml:\"version\"`\n\n\t// Name of the binary.\n\tName string `yaml:\"name,omitempty\"`\n\n\t// Destination is the path to a directory to store the binary.\n\tDestination string `yaml:\"destination,omitempty\"`\n\n\t// Plugins information.\n\tPlugins []*Plugin `yaml:\"plugins,omitempty\"`\n}\n\n// Validate checks and clean the configuration.\nfunc (c *Configuration) Validate() error {\n\tif strings.TrimSpace(c.Version) == \"\" {\n\t\treturn errors.New(\"root field 'version' is required\")\n\t}\n\n\tif strings.TrimSpace(c.Name) == \"\" {\n\t\tc.Name = defaultBinaryName\n\t}\n\n\tif len(c.Plugins) == 0 {\n\t\treturn errors.New(\"no plugins defined\")\n\t}\n\n\tfor _, plugin := range c.Plugins {\n\t\tif strings.TrimSpace(plugin.Module) == \"\" {\n\t\t\treturn errors.New(\"field 'module' is required\")\n\t\t}\n\n\t\tif strings.TrimSpace(plugin.Import) == \"\" {\n\t\t\tplugin.Import = plugin.Module\n\t\t}\n\n\t\tif strings.TrimSpace(plugin.Path) == \"\" && strings.TrimSpace(plugin.Version) == \"\" {\n\t\t\treturn errors.New(\"missing information: 'version' or 'path' should be provided\")\n\t\t}\n\n\t\tif strings.TrimSpace(plugin.Path) != \"\" && strings.TrimSpace(plugin.Version) != \"\" {\n\t\t\treturn errors.New(\"invalid configuration: 'version' and 'path' should not be provided at the same time\")\n\t\t}\n\n\t\tif strings.TrimSpace(plugin.Path) == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tabs, err := filepath.Abs(plugin.Path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tplugin.Path = abs\n\t}\n\n\treturn nil\n}\n\n// Plugin represents information about a plugin.\ntype Plugin struct {\n\t// Module name.\n\tModule string `yaml:\"module\"`\n\n\t// Import to use.\n\tImport string `yaml:\"import,omitempty\"`\n\n\t// Version of the module.\n\t// Only for module available through a Go proxy.\n\tVersion string `yaml:\"version,omitempty\"`\n\n\t// Path to the local module.\n\t// Only for local module.\n\tPath string `yaml:\"path,omitempty\"`\n}\n\nfunc LoadConfiguration() (*Configuration, error) {\n\tconfigFilePath, err := findConfigurationFile()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"file %s not found: %w\", configFilePath, err)\n\t}\n\n\tfile, err := os.Open(configFilePath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"file %s open: %w\", configFilePath, err)\n\t}\n\n\tdefer func() { _ = file.Close() }()\n\n\tvar cfg Configuration\n\n\terr = yaml.NewDecoder(file).Decode(&cfg)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"YAML decoding: %w\", err)\n\t}\n\n\treturn &cfg, nil\n}\n\nfunc findConfigurationFile() (string, error) {\n\tentries, err := os.ReadDir(\".\")\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"read directory: %w\", err)\n\t}\n\n\tfor _, entry := range entries {\n\t\text := filepath.Ext(entry.Name())\n\n\t\tswitch strings.ToLower(strings.TrimPrefix(ext, \".\")) {\n\t\tcase \"yml\", \"yaml\", \"json\":\n\t\t\tif isConf(ext, entry.Name()) {\n\t\t\t\treturn entry.Name(), nil\n\t\t\t}\n\t\t}\n\t}\n\n\treturn \"\", errors.New(\"configuration file not found\")\n}\n\nfunc isConf(ext, name string) bool {\n\treturn base+ext == name\n}\n"
  },
  {
    "path": "pkg/commands/internal/configuration_test.go",
    "content": "package internal\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestConfiguration_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc string\n\t\tcfg  *Configuration\n\t}{\n\t\t{\n\t\t\tdesc: \"version\",\n\t\t\tcfg: &Configuration{\n\t\t\t\tVersion: \"v1.57.0\",\n\t\t\t\tPlugins: []*Plugin{\n\t\t\t\t\t{\n\t\t\t\t\t\tModule:  \"example.org/foo/bar\",\n\t\t\t\t\t\tImport:  \"example.org/foo/bar/test\",\n\t\t\t\t\t\tVersion: \"v1.2.3\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"path\",\n\t\t\tcfg: &Configuration{\n\t\t\t\tVersion: \"v1.57.0\",\n\t\t\t\tPlugins: []*Plugin{\n\t\t\t\t\t{\n\t\t\t\t\t\tModule: \"example.org/foo/bar\",\n\t\t\t\t\t\tImport: \"example.org/foo/bar/test\",\n\t\t\t\t\t\tPath:   \"/my/path\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.cfg.Validate()\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestConfiguration_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tcfg      *Configuration\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"missing version\",\n\t\t\tcfg:      &Configuration{},\n\t\t\texpected: \"root field 'version' is required\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"no plugins\",\n\t\t\tcfg: &Configuration{\n\t\t\t\tVersion: \"v1.57.0\",\n\t\t\t},\n\t\t\texpected: \"no plugins defined\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"missing module\",\n\t\t\tcfg: &Configuration{\n\t\t\t\tVersion: \"v1.57.0\",\n\t\t\t\tPlugins: []*Plugin{\n\t\t\t\t\t{\n\t\t\t\t\t\tModule:  \"\",\n\t\t\t\t\t\tImport:  \"example.org/foo/bar/test\",\n\t\t\t\t\t\tVersion: \"v1.2.3\",\n\t\t\t\t\t\tPath:    \"/my/path\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"field 'module' is required\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"module version and path\",\n\t\t\tcfg: &Configuration{\n\t\t\t\tVersion: \"v1.57.0\",\n\t\t\t\tPlugins: []*Plugin{\n\t\t\t\t\t{\n\t\t\t\t\t\tModule:  \"example.org/foo/bar\",\n\t\t\t\t\t\tImport:  \"example.org/foo/bar/test\",\n\t\t\t\t\t\tVersion: \"v1.2.3\",\n\t\t\t\t\t\tPath:    \"/my/path\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"invalid configuration: 'version' and 'path' should not be provided at the same time\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"no module version and path\",\n\t\t\tcfg: &Configuration{\n\t\t\t\tVersion: \"v1.57.0\",\n\t\t\t\tPlugins: []*Plugin{\n\t\t\t\t\t{\n\t\t\t\t\t\tModule: \"example.org/foo/bar\",\n\t\t\t\t\t\tImport: \"example.org/foo/bar/test\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"missing information: 'version' or 'path' should be provided\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.cfg.Validate()\n\n\t\t\tassert.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/dirhash.go",
    "content": "// Copyright 2018 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage internal\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"golang.org/x/mod/sumdb/dirhash\"\n)\n\n// Slightly modified copy of [dirhash.HashDir].\n// https://github.com/golang/mod/blob/v0.28.0/sumdb/dirhash/hash.go#L67-L79\nfunc hashDir(dir, prefix string, hash dirhash.Hash) (string, error) {\n\tfiles, err := dirFiles(dir, prefix)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tosOpen := func(name string) (io.ReadCloser, error) {\n\t\treturn os.Open(filepath.Join(dir, strings.TrimPrefix(name, prefix)))\n\t}\n\n\treturn hash(files, osOpen)\n}\n\n// Modified copy of [dirhash.DirFiles].\n// https://github.com/golang/mod/blob/v0.28.0/sumdb/dirhash/hash.go#L81-L109\n// And adapted to globally follows the rules from https://github.com/golang/mod/blob/v0.28.0/zip/zip.go\nfunc dirFiles(dir, prefix string) ([]string, error) {\n\tvar files []string\n\n\tdir = filepath.Clean(dir)\n\n\terr := filepath.Walk(dir, func(file string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif info.IsDir() {\n\t\t\tif dir == file {\n\t\t\t\t// Don't skip the top-level directory.\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tswitch info.Name() {\n\t\t\t// Skip vendor and node directories.\n\t\t\tcase \"vendor\", \"node_modules\":\n\t\t\t\treturn filepath.SkipDir\n\n\t\t\t// Skip VCS directories.\n\t\t\tcase \".bzr\", \".git\", \".hg\", \".svn\":\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\n\t\t\t// Skip submodules (directories containing go.mod files).\n\t\t\tif goModInfo, err := os.Lstat(filepath.Join(dir, \"go.mod\")); err == nil && !goModInfo.IsDir() {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\n\t\t\treturn nil\n\t\t}\n\n\t\tif file == dir {\n\t\t\treturn fmt.Errorf(\"%s is not a directory\", dir)\n\t\t}\n\n\t\tif !info.Mode().IsRegular() {\n\t\t\treturn nil\n\t\t}\n\n\t\trel := file\n\n\t\tif dir != \".\" {\n\t\t\trel = file[len(dir)+1:]\n\t\t}\n\n\t\tf := filepath.Join(prefix, rel)\n\n\t\tfiles = append(files, filepath.ToSlash(f))\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn files, nil\n}\n"
  },
  {
    "path": "pkg/commands/internal/imports.go",
    "content": "package internal\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"text/template\"\n)\n\nconst importsTemplate = `\npackage main\n\nimport (\n{{range .Imports -}}\n\t_ \"{{.}}\"\n{{end -}}\n)\n`\n\nfunc (b Builder) updatePluginsFile() error {\n\timportsDest := filepath.Join(b.repo, \"cmd\", \"golangci-lint\", \"plugins.go\")\n\n\tinfo, err := os.Stat(importsDest)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"file %s not found: %w\", importsDest, err)\n\t}\n\n\tsource, err := generateImports(b.cfg)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"generate imports: %w\", err)\n\t}\n\n\tb.log.Infof(\"generated imports info %s:\\n%s\\n\", importsDest, source)\n\n\terr = os.WriteFile(filepath.Clean(importsDest), source, info.Mode())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"write file %s: %w\", importsDest, err)\n\t}\n\n\treturn nil\n}\n\nfunc generateImports(cfg *Configuration) ([]byte, error) {\n\timpTmpl, err := template.New(\"plugins.go\").Parse(importsTemplate)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"parse template: %w\", err)\n\t}\n\n\tvar imps []string\n\tfor _, plugin := range cfg.Plugins {\n\t\timps = append(imps, plugin.Import)\n\t}\n\n\tbuf := &bytes.Buffer{}\n\n\terr = impTmpl.Execute(buf, map[string]any{\"Imports\": imps})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"execute template: %w\", err)\n\t}\n\n\tsource, err := format.Source(buf.Bytes())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"format source: %w\", err)\n\t}\n\n\treturn source, nil\n}\n"
  },
  {
    "path": "pkg/commands/internal/imports_test.go",
    "content": "package internal\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_generateImports(t *testing.T) {\n\tcfg := &Configuration{\n\t\tVersion: \"v1.57.0\",\n\t\tPlugins: []*Plugin{\n\t\t\t{\n\t\t\t\tModule:  \"example.org/foo/bar\",\n\t\t\t\tImport:  \"example.org/foo/bar/test\",\n\t\t\t\tVersion: \"v1.2.3\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tModule: \"example.com/foo/bar\",\n\t\t\t\tImport: \"example.com/foo/bar/test\",\n\t\t\t\tPath:   \"/my/path\",\n\t\t\t},\n\t\t},\n\t}\n\n\tdata, err := generateImports(cfg)\n\trequire.NoError(t, err)\n\n\texpected, err := os.ReadFile(filepath.Join(\"testdata\", \"imports.go\"))\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, expected, data)\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/cloner/cloner.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/printer\"\n\t\"go/token\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/imports\"\n)\n\nconst newPkgName = \"versiontwo\"\n\nconst (\n\tsrcDir = \"./pkg/config\"\n\tdstDir = \"./pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc main() {\n\tstat, err := os.Stat(srcDir)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tif !stat.IsDir() {\n\t\tlog.Fatalf(\"%s is not a directory\", srcDir)\n\t}\n\n\t_ = os.RemoveAll(dstDir)\n\n\terr = processPackage(srcDir, dstDir)\n\tif err != nil {\n\t\tlog.Fatalf(\"Processing package error: %v\", err)\n\t}\n}\n\nfunc processPackage(srcDir, dstDir string) error {\n\treturn filepath.Walk(srcDir, func(srcPath string, _ os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif skipFile(srcPath) {\n\t\t\treturn nil\n\t\t}\n\n\t\tfset := token.NewFileSet()\n\n\t\tfile, err := parser.ParseFile(fset, srcPath, nil, parser.AllErrors)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"parsing %s: %w\", srcPath, err)\n\t\t}\n\n\t\tprocessFile(file)\n\n\t\treturn writeNewFile(fset, file, srcPath, dstDir)\n\t})\n}\n\nfunc skipFile(path string) bool {\n\tif !strings.HasSuffix(path, \".go\") || strings.HasSuffix(path, \"_test.go\") {\n\t\treturn true\n\t}\n\n\tswitch filepath.Base(path) {\n\tcase \"base_loader.go\", \"loader.go\":\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\nfunc processFile(file *ast.File) {\n\tfile.Name.Name = newPkgName\n\n\tvar newDecls []ast.Decl\n\tfor _, decl := range file.Decls {\n\t\td, ok := decl.(*ast.GenDecl)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch d.Tok {\n\t\tcase token.CONST, token.VAR:\n\t\t\tcontinue\n\t\tcase token.TYPE:\n\t\t\tfor _, spec := range d.Specs {\n\t\t\t\ttypeSpec, ok := spec.(*ast.TypeSpec)\n\t\t\t\tif !ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tstructType, ok := typeSpec.Type.(*ast.StructType)\n\t\t\t\tif !ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tprocessStructFields(structType)\n\t\t\t}\n\t\tdefault:\n\t\t\t// noop\n\t\t}\n\n\t\tnewDecls = append(newDecls, decl)\n\t}\n\n\tfile.Decls = newDecls\n}\n\nfunc processStructFields(structType *ast.StructType) {\n\tvar newFields []*ast.Field\n\n\tfor _, field := range structType.Fields.List {\n\t\tif len(field.Names) > 0 && !field.Names[0].IsExported() {\n\t\t\tcontinue\n\t\t}\n\n\t\tif field.Tag == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfield.Type = convertType(field.Type)\n\t\tfield.Tag.Value = convertStructTag(field.Tag.Value)\n\n\t\tnewFields = append(newFields, field)\n\t}\n\n\tstructType.Fields.List = newFields\n}\n\nfunc convertType(expr ast.Expr) ast.Expr {\n\tident, ok := expr.(*ast.Ident)\n\tif !ok {\n\t\treturn expr\n\t}\n\n\tswitch ident.Name {\n\tcase \"bool\", \"string\", \"uint\", \"uint8\", \"uint16\", \"uint32\", \"uint64\", \"int\", \"int8\", \"int16\", \"int32\", \"int64\", \"float32\", \"float64\":\n\t\treturn &ast.StarExpr{X: ident}\n\n\tdefault:\n\t\treturn expr\n\t}\n}\n\nfunc convertStructTag(value string) string {\n\tstructTag := reflect.StructTag(strings.Trim(value, \"`\"))\n\n\tkey := structTag.Get(\"mapstructure\")\n\n\tif key == \",squash\" {\n\t\treturn wrapStructTag(`yaml:\",inline\"`)\n\t}\n\n\treturn wrapStructTag(fmt.Sprintf(`yaml:\"%[1]s,omitempty\" toml:\"%[1]s,multiline,omitempty\"`, key))\n}\n\nfunc wrapStructTag(s string) string {\n\treturn \"`\" + s + \"`\"\n}\n\nfunc writeNewFile(fset *token.FileSet, file *ast.File, srcPath, dstDir string) error {\n\tvar buf bytes.Buffer\n\n\tbuf.WriteString(\"// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\\n\\n\")\n\n\terr := printer.Fprint(&buf, fset, file)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"printing %s: %w\", srcPath, err)\n\t}\n\n\tdstPath := filepath.Join(dstDir, filepath.Base(srcPath))\n\n\t_ = os.MkdirAll(filepath.Dir(dstPath), os.ModePerm)\n\n\tformatted, err := imports.Process(dstPath, buf.Bytes(), nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"formatting %s: %w\", dstPath, err)\n\t}\n\n\t//nolint:gosec,mnd // The permission is right.\n\terr = os.WriteFile(dstPath, formatted, 0o644)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"writing file %s: %w\", dstPath, err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/fakeloader/config.go",
    "content": "package fakeloader\n\n// Config implements [config.BaseConfig].\n// This only the stub for the real file loader.\ntype Config struct {\n\tVersion string `mapstructure:\"version\"`\n\n\tcfgDir string // Path to the directory containing golangci-lint config file.\n}\n\nfunc NewConfig() *Config {\n\treturn &Config{}\n}\n\n// SetConfigDir sets the path to directory that contains golangci-lint config file.\nfunc (c *Config) SetConfigDir(dir string) {\n\tc.cfgDir = dir\n}\n\nfunc (*Config) IsInternalTest() bool {\n\treturn false\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/fakeloader/fakeloader.go",
    "content": "package fakeloader\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/go-viper/mapstructure/v2\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/parser\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\n// Load is used to keep case of configuration.\n// Viper serialize raw map keys in lowercase, this is a problem with the configuration of some linters.\nfunc Load(srcPath string, old any) error {\n\tfile, err := os.Open(srcPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open file: %w\", err)\n\t}\n\n\tdefer func() { _ = file.Close() }()\n\n\traw := map[string]any{}\n\n\terr = parser.Decode(file, raw)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// NOTE: this is inspired by viper internals.\n\tcc := &mapstructure.DecoderConfig{\n\t\tResult:           old,\n\t\tWeaklyTypedInput: true,\n\t\tDecodeHook:       config.DecodeHookFunc(),\n\t}\n\n\tdecoder, err := mapstructure.NewDecoder(cc)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"constructing mapstructure decoder: %w\", err)\n\t}\n\n\terr = decoder.Decode(raw)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"decoding configuration file: %w\", err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate.go",
    "content": "package migrate\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc ToConfig(old *versionone.Config) *versiontwo.Config {\n\treturn &versiontwo.Config{\n\t\tVersion:    ptr.Pointer(\"2\"),\n\t\tLinters:    toLinters(old),\n\t\tFormatters: toFormatters(old),\n\t\tIssues:     toIssues(old),\n\t\tOutput:     toOutput(old),\n\t\tSeverity:   toSeverity(old),\n\t\tRun:        toRun(old),\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_formatters.go",
    "content": "package migrate\n\nimport (\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc toFormatters(old *versionone.Config) versiontwo.Formatters {\n\tenable := ProcessEffectiveFormatters(old.Linters)\n\n\tvar paths []string\n\tif len(enable) > 0 {\n\t\tpaths = slices.Concat(old.Issues.ExcludeFiles, old.Issues.ExcludeDirs)\n\t}\n\n\tif old.Issues.UseDefaultExcludeDirs == nil || ptr.Deref(old.Issues.UseDefaultExcludeDirs) {\n\t\tpaths = append(paths, \"third_party$\", \"builtin$\", \"examples$\")\n\t}\n\n\tpaths = append(paths, toFormattersPathsFromRules(old.Issues)...)\n\n\treturn versiontwo.Formatters{\n\t\tEnable: enable,\n\t\tSettings: versiontwo.FormatterSettings{\n\t\t\tGci:       toGciSettings(old.LintersSettings.Gci),\n\t\t\tGoFmt:     toGoFmtSettings(old.LintersSettings.GoFmt),\n\t\t\tGoFumpt:   toGoFumptSettings(old.LintersSettings.GoFumpt),\n\t\t\tGoImports: toGoImportsSettings(old.LintersSettings.GoImports),\n\t\t},\n\t\tExclusions: versiontwo.FormatterExclusions{\n\t\t\tGenerated: toExclusionGenerated(old.Issues.ExcludeGenerated),\n\t\t\tPaths:     paths,\n\t\t},\n\t}\n}\n\nfunc toFormattersPathsFromRules(old versionone.Issues) []string {\n\tvar results []string\n\n\tfor _, rule := range old.ExcludeRules {\n\t\tallNames := convertStaticcheckLinterNames(convertAlternativeNames(rule.Linters))\n\n\t\tnames := onlyFormatterNames(allNames)\n\t\tif len(names) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif ptr.Deref(rule.Path) == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tresults = append(results, ptr.Deref(rule.Path))\n\t}\n\n\treturn results\n}\n\nfunc toGciSettings(old versionone.GciSettings) versiontwo.GciSettings {\n\treturn versiontwo.GciSettings{\n\t\tSections:         old.Sections,\n\t\tNoInlineComments: old.NoInlineComments,\n\t\tNoPrefixComments: old.NoPrefixComments,\n\t\tCustomOrder:      old.CustomOrder,\n\t\tNoLexOrder:       old.NoLexOrder,\n\t}\n}\n\nfunc toGoFmtSettings(old versionone.GoFmtSettings) versiontwo.GoFmtSettings {\n\tsettings := versiontwo.GoFmtSettings{\n\t\tSimplify: old.Simplify,\n\t}\n\n\tfor _, rule := range old.RewriteRules {\n\t\tsettings.RewriteRules = append(settings.RewriteRules, versiontwo.GoFmtRewriteRule{\n\t\t\tPattern:     rule.Pattern,\n\t\t\tReplacement: rule.Replacement,\n\t\t})\n\t}\n\n\treturn settings\n}\n\nfunc toGoFumptSettings(old versionone.GoFumptSettings) versiontwo.GoFumptSettings {\n\treturn versiontwo.GoFumptSettings{\n\t\tModulePath: old.ModulePath,\n\t\tExtraRules: old.ExtraRules,\n\t}\n}\n\nfunc toGoImportsSettings(old versionone.GoImportsSettings) versiontwo.GoImportsSettings {\n\tvar localPrefixes []string\n\n\tprefixes := ptr.Deref(old.LocalPrefixes)\n\tif prefixes != \"\" {\n\t\tlocalPrefixes = strings.Split(prefixes, \",\")\n\t}\n\n\treturn versiontwo.GoImportsSettings{\n\t\tLocalPrefixes: localPrefixes,\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_issues.go",
    "content": "package migrate\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc toIssues(old *versionone.Config) versiontwo.Issues {\n\treturn versiontwo.Issues{\n\t\tMaxIssuesPerLinter: old.Issues.MaxIssuesPerLinter,\n\t\tMaxSameIssues:      old.Issues.MaxSameIssues,\n\t\tUniqByLine:         old.Issues.UniqByLine,\n\t\tDiffFromRevision:   old.Issues.DiffFromRevision,\n\t\tDiffFromMergeBase:  old.Issues.DiffFromMergeBase,\n\t\tDiffPatchFilePath:  old.Issues.DiffPatchFilePath,\n\t\tWholeFiles:         old.Issues.WholeFiles,\n\t\tDiff:               old.Issues.Diff,\n\t\tNeedFix:            old.Issues.NeedFix,\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_linter_names.go",
    "content": "package migrate\n\nimport (\n\t\"cmp\"\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n)\n\ntype LinterInfo struct {\n\tName             string   `json:\"name\"`\n\tPresets          []string `json:\"inPresets\"`\n\tSlow             bool     `json:\"isSlow,omitempty\"`\n\tDefault          bool     `json:\"enabledByDefault,omitempty\"`\n\tAlternativeNames []string `json:\"alternativeNames,omitempty\"`\n}\n\nfunc (l *LinterInfo) isName(name string) bool {\n\tif name == l.Name {\n\t\treturn true\n\t}\n\n\treturn slices.Contains(l.AlternativeNames, name)\n}\n\nfunc (l *LinterInfo) hasPresets(names []string) bool {\n\tfor _, name := range names {\n\t\tif slices.Contains(l.Presets, name) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc ProcessEffectiveLinters(old versionone.Linters) (enable, disable []string) {\n\tswitch {\n\tcase ptr.Deref(old.DisableAll):\n\t\treturn disableAllFilter(old), nil\n\n\tcase ptr.Deref(old.EnableAll):\n\t\treturn nil, enableAllFilter(old)\n\n\tdefault:\n\t\treturn defaultLintersFilter(old)\n\t}\n}\n\nfunc ProcessEffectiveFormatters(old versionone.Linters) []string {\n\tenabled, disabled := ProcessEffectiveLinters(old)\n\n\tif ptr.Deref(old.EnableAll) {\n\t\tvar formatterNames []string\n\n\t\tfor _, f := range getAllFormatterNames() {\n\t\t\tif !slices.Contains(disabled, f) {\n\t\t\t\tformatterNames = append(formatterNames, f)\n\t\t\t}\n\t\t}\n\n\t\treturn formatterNames\n\t}\n\n\treturn onlyFormatterNames(enabled)\n}\n\n// disableAllFilter generates the value of `enable` when `disable-all` is `true`.\nfunc disableAllFilter(old versionone.Linters) []string {\n\t// Note:\n\t// - disable-all + enable-all\n\t// \t\t=> impossible (https://github.com/golangci/golangci-lint/blob/e1eb4cb2c7fba29b5831b63e454844d83c692874/pkg/config/linters.go#L38)\n\t// - disable-all + disable\n\t// \t\t=> impossible (https://github.com/golangci/golangci-lint/blob/e1eb4cb2c7fba29b5831b63e454844d83c692874/pkg/config/linters.go#L47)\n\n\t// if disable-all -> presets fast enable\n\t// - presets fast enable: (presets - [slow]) + enable => effective enable + none\n\t// - presets fast: presets - slow => effective enable + none\n\t// - presets fast enable: presets + enable => effective enable + none\n\t// - enable => effective enable + none\n\t// - fast => nothing\n\t// - fast enable: enable => effective enable + none\n\n\t// (presets - [slow]) + enable => effective enable + none\n\tnames := toNames(\n\t\tslices.Concat(\n\t\t\tfilter(\n\t\t\t\tallLinters(), onlyPresets(old), keepFast(old), // presets - [slow]\n\t\t\t),\n\t\t\tallEnabled(old, allLinters()), // + enable\n\t\t),\n\t)\n\n\treturn slices.Concat(names, unknownLinterNames(old.Enable, allLinters()))\n}\n\n// enableAllFilter generates the value of `disable` when `enable-all` is `true`.\nfunc enableAllFilter(old versionone.Linters) []string {\n\t// Note:\n\t// - enable-all + disable-all\n\t// \t\t=> impossible (https://github.com/golangci/golangci-lint/blob/e1eb4cb2c7fba29b5831b63e454844d83c692874/pkg/config/linters.go#L38)\n\t// - enable-all + enable + fast=false\n\t// \t\t=> impossible (https://github.com/golangci/golangci-lint/blob/e1eb4cb2c7fba29b5831b63e454844d83c692874/pkg/config/linters.go#L52)\n\t// - enable-all + enable + fast=true\n\t// \t\t=> possible (https://github.com/golangci/golangci-lint/blob/e1eb4cb2c7fba29b5831b63e454844d83c692874/pkg/config/linters.go#L51)\n\n\t// if enable-all -> presets fast enable disable\n\t// - presets fast enable disable: all - fast - enable + disable => effective disable + all\n\t// - presets fast disable: all - fast + disable => effective disable + all\n\t// - presets fast: all - fast => effective disable + all\n\t// - presets disable: disable => effective disable + all\n\t// - disable => effective disable + all\n\t// - fast: all - fast => effective disable + all\n\t// - fast disable: all - fast + disable => effective disable + all\n\n\t// all - [fast] - enable + disable => effective disable + all\n\tnames := toNames(\n\t\tslices.Concat(\n\t\t\tremoveLinters(\n\t\t\t\tfilter(\n\t\t\t\t\tallLinters(), keepSlow(old), // all - fast\n\t\t\t\t),\n\t\t\t\tallEnabled(old, allLinters()), // - enable\n\t\t\t),\n\t\t\tallDisabled(old, allLinters()), // + disable\n\t\t),\n\t)\n\n\treturn slices.Concat(names, unknownLinterNames(old.Disable, allLinters()))\n}\n\n// defaultLintersFilter generates the values of `enable` and `disable` when using default linters.\nfunc defaultLintersFilter(old versionone.Linters) (enable, disable []string) {\n\t// Note:\n\t// - a linter cannot be inside `enable` and `disable` in the same configuration\n\t// \t\t=> https://github.com/golangci/golangci-lint/blob/e1eb4cb2c7fba29b5831b63e454844d83c692874/pkg/config/linters.go#L66\n\n\t// if default -> presets fast disable\n\t// - presets > fast > disable > enable => effective enable + disable + standard\n\t//    - (default - fast) - enable + disable => effective disable\n\t//    - presets - slow + enable - default - [effective disable] => effective enable\n\t// - presets + fast + disable => effective enable + disable + standard\n\t//    - (default - fast) + disable => effective disable\n\t//    - presets - slow - default - [effective disable] => effective enable\n\t// - presets + fast + enable\n\t//    - (default - fast) - enable => effective disable\n\t//    - presets - slow + enable - default - [effective disable] => effective enable\n\t// - presets + fast\n\t//    - (default - fast) => effective disable\n\t//    - presets - slow - default - [effective disable] => effective enable\n\t// - presets + disable\n\t//    - default + disable => effective disable\n\t//    - presets - default - [effective disable] => effective enable\n\t// - presets + enable\n\t//    - default - enable => effective disable\n\t//    - presets + enable - default - [effective disable] => effective enable\n\t// - disable\n\t//    - default + disable => effective disable\n\t//    - default - [effective disable] => effective enable\n\t// - enable\n\t//    - default - enable => effective disable\n\t//    - enable - default - [effective disable] => effective enable\n\t// - fast\n\t//    - default - fast => effective disable\n\t//    - default - [effective disable] => effective enable\n\t// - fast + disable\n\t//    - (default - fast) + disable => effective disable\n\t//    - default - [effective disable] => effective enable\n\t// - fast + enable\n\t//    - (default - fast) - enable => effective disable\n\t//    - enable - default - [effective disable] => effective enable\n\n\tdisabledLinters := defaultLintersDisableFilter(old)\n\n\tenabledLinters := defaultLintersEnableFilter(old, disabledLinters)\n\n\tenabled := toNames(enabledLinters)\n\tdisabled := toNames(disabledLinters)\n\n\treturn slices.Concat(enabled, unknownLinterNames(old.Enable, allLinters())),\n\t\tslices.Concat(disabled, unknownLinterNames(old.Disable, allLinters()))\n}\n\n// defaultLintersEnableFilter generates the value of `enable` when using default linters.\nfunc defaultLintersEnableFilter(old versionone.Linters, effectiveDisabled []LinterInfo) []LinterInfo {\n\t// presets - slow + enable - default - [effective disable] => effective enable\n\treturn removeLinters(\n\t\tfilter(\n\t\t\tslices.Concat(\n\t\t\t\tfilter(\n\t\t\t\t\tallLinters(), onlyPresets(old), keepFast(old), // presets - slow\n\t\t\t\t),\n\t\t\t\tallEnabled(old, allLinters()), // + enable\n\t\t\t),\n\t\t\tnotDefault, // - default\n\t\t),\n\t\teffectiveDisabled, // - [effective disable]\n\t)\n}\n\n// defaultLintersDisableFilter generates the value of `disable` when using default linters.\nfunc defaultLintersDisableFilter(old versionone.Linters) []LinterInfo {\n\t// (default - fast) - enable + disable => effective disable\n\treturn slices.Concat(\n\t\tremoveLinters(\n\t\t\tfilter(allLinters(), onlyDefault, keepSlow(old)), // (default - fast)\n\t\t\tallEnabled(old, allLinters()),                    // - enable\n\t\t),\n\t\tallDisabled(old, allLinters()), // + disable\n\t)\n}\n\nfunc allLinters() []LinterInfo {\n\treturn []LinterInfo{\n\t\t{\n\t\t\tName:    \"asasalint\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"asciicheck\",\n\t\t\tPresets: []string{\"bugs\", \"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"bidichk\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"bodyclose\",\n\t\t\tPresets: []string{\"performance\", \"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"canonicalheader\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"containedctx\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"contextcheck\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"copyloopvar\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"cyclop\",\n\t\t\tPresets: []string{\"complexity\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"decorder\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"depguard\",\n\t\t\tPresets: []string{\"style\", \"import\", \"module\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"dogsled\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"dupl\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"dupword\",\n\t\t\tPresets: []string{\"comment\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"durationcheck\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"errcheck\",\n\t\t\tPresets: []string{\"bugs\", \"error\"},\n\t\t\tSlow:    true,\n\t\t\tDefault: true,\n\t\t},\n\t\t{\n\t\t\tName:    \"errchkjson\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"errname\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"errorlint\",\n\t\t\tPresets: []string{\"bugs\", \"error\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"exhaustive\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"exhaustruct\",\n\t\t\tPresets: []string{\"style\", \"test\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"exptostd\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"forbidigo\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"forcetypeassert\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"fatcontext\",\n\t\t\tPresets: []string{\"performance\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"funlen\",\n\t\t\tPresets: []string{\"complexity\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gci\",\n\t\t\tPresets: []string{\"format\", \"import\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"ginkgolinter\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"gocheckcompilerdirectives\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gochecknoglobals\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"gochecknoinits\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gochecksumtype\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"gocognit\",\n\t\t\tPresets: []string{\"complexity\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"goconst\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gocritic\",\n\t\t\tPresets: []string{\"style\", \"metalinter\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"gocyclo\",\n\t\t\tPresets: []string{\"complexity\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"godot\",\n\t\t\tPresets: []string{\"style\", \"comment\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"godox\",\n\t\t\tPresets: []string{\"style\", \"comment\"},\n\t\t},\n\t\t{\n\t\t\tName:             \"err113\",\n\t\t\tPresets:          []string{\"style\", \"error\"},\n\t\t\tSlow:             true,\n\t\t\tAlternativeNames: []string{\"goerr113\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gofmt\",\n\t\t\tPresets: []string{\"format\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gofumpt\",\n\t\t\tPresets: []string{\"format\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"goheader\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"goimports\",\n\t\t\tPresets: []string{\"format\", \"import\"},\n\t\t},\n\t\t{\n\t\t\tName:             \"mnd\",\n\t\t\tPresets:          []string{\"style\"},\n\t\t\tAlternativeNames: []string{\"gomnd\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gomoddirectives\",\n\t\t\tPresets: []string{\"style\", \"module\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gomodguard\",\n\t\t\tPresets: []string{\"style\", \"import\", \"module\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"goprintffuncname\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:             \"gosec\",\n\t\t\tPresets:          []string{\"bugs\"},\n\t\t\tSlow:             true,\n\t\t\tAlternativeNames: []string{\"gas\"},\n\t\t},\n\t\t{\n\t\t\tName:             \"gosimple\",\n\t\t\tPresets:          []string{\"style\"},\n\t\t\tSlow:             true,\n\t\t\tDefault:          true,\n\t\t\tAlternativeNames: []string{\"megacheck\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"gosmopolitan\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:             \"govet\",\n\t\t\tPresets:          []string{\"bugs\", \"metalinter\"},\n\t\t\tSlow:             true,\n\t\t\tDefault:          true,\n\t\t\tAlternativeNames: []string{\"vet\", \"vetshadow\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"grouper\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"iface\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"importas\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"inamedparam\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"ineffassign\",\n\t\t\tPresets: []string{\"unused\"},\n\t\t\tDefault: true,\n\t\t},\n\t\t{\n\t\t\tName:    \"interfacebloat\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"intrange\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"ireturn\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"lll\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:             \"loggercheck\",\n\t\t\tPresets:          []string{\"style\", \"bugs\"},\n\t\t\tSlow:             true,\n\t\t\tAlternativeNames: []string{\"logrlint\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"maintidx\",\n\t\t\tPresets: []string{\"complexity\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"makezero\",\n\t\t\tPresets: []string{\"style\", \"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"mirror\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"misspell\",\n\t\t\tPresets: []string{\"style\", \"comment\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"musttag\",\n\t\t\tPresets: []string{\"style\", \"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"nakedret\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"nestif\",\n\t\t\tPresets: []string{\"complexity\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"nilerr\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"nilnesserr\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"nilnil\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"nlreturn\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"noctx\",\n\t\t\tPresets: []string{\"performance\", \"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"nonamedreturns\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"nosprintfhostport\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"paralleltest\",\n\t\t\tPresets: []string{\"style\", \"test\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"perfsprint\",\n\t\t\tPresets: []string{\"performance\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"prealloc\",\n\t\t\tPresets: []string{\"performance\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"predeclared\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"promlinter\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"protogetter\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"reassign\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"recvcheck\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"revive\",\n\t\t\tPresets: []string{\"style\", \"metalinter\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"rowserrcheck\",\n\t\t\tPresets: []string{\"bugs\", \"sql\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"sloglint\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"sqlclosecheck\",\n\t\t\tPresets: []string{\"bugs\", \"sql\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"spancheck\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:             \"staticcheck\",\n\t\t\tPresets:          []string{\"bugs\", \"metalinter\"},\n\t\t\tSlow:             true,\n\t\t\tDefault:          true,\n\t\t\tAlternativeNames: []string{\"megacheck\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"stylecheck\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"tagalign\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"tagliatelle\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"testableexamples\",\n\t\t\tPresets: []string{\"test\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"testifylint\",\n\t\t\tPresets: []string{\"test\", \"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"testpackage\",\n\t\t\tPresets: []string{\"style\", \"test\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"thelper\",\n\t\t\tPresets: []string{\"test\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"tparallel\",\n\t\t\tPresets: []string{\"style\", \"test\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"unconvert\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"unparam\",\n\t\t\tPresets: []string{\"unused\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:             \"unused\",\n\t\t\tPresets:          []string{\"unused\"},\n\t\t\tSlow:             true,\n\t\t\tDefault:          true,\n\t\t\tAlternativeNames: []string{\"megacheck\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"usestdlibvars\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"usetesting\",\n\t\t\tPresets: []string{\"test\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"varnamelen\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"wastedassign\",\n\t\t\tPresets: []string{\"style\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"whitespace\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"wrapcheck\",\n\t\t\tPresets: []string{\"style\", \"error\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"wsl\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t\t{\n\t\t\tName:    \"zerologlint\",\n\t\t\tPresets: []string{\"bugs\"},\n\t\t\tSlow:    true,\n\t\t},\n\t\t{\n\t\t\tName:    \"nolintlint\",\n\t\t\tPresets: []string{\"style\"},\n\t\t},\n\t}\n}\n\nfunc toNames(linters []LinterInfo) []string {\n\tvar results []string\n\n\tfor _, linter := range linters {\n\t\tresults = append(results, linter.Name)\n\t}\n\n\treturn Unique(results)\n}\n\nfunc removeLinters(linters, toRemove []LinterInfo) []LinterInfo {\n\treturn slices.DeleteFunc(linters, func(info LinterInfo) bool {\n\t\treturn slices.ContainsFunc(toRemove, func(en LinterInfo) bool {\n\t\t\treturn info.Name == en.Name\n\t\t})\n\t})\n}\n\nfunc allEnabled(old versionone.Linters, linters []LinterInfo) []LinterInfo {\n\tvar results []LinterInfo\n\n\tfor _, linter := range linters {\n\t\tif slices.ContainsFunc(old.Enable, linter.isName) {\n\t\t\tresults = append(results, linter)\n\t\t}\n\t}\n\n\treturn results\n}\n\nfunc allDisabled(old versionone.Linters, linters []LinterInfo) []LinterInfo {\n\tvar results []LinterInfo\n\n\tfor _, linter := range linters {\n\t\tif slices.ContainsFunc(old.Disable, linter.isName) {\n\t\t\tresults = append(results, linter)\n\t\t}\n\t}\n\n\treturn results\n}\n\nfunc filter(linters []LinterInfo, fns ...fnFilter) []LinterInfo {\n\tvar results []LinterInfo\n\n\tfor _, linter := range linters {\n\t\tif mergeFilters(linter, fns) {\n\t\t\tresults = append(results, linter)\n\t\t}\n\t}\n\n\treturn results\n}\n\nfunc mergeFilters(linter LinterInfo, fns []fnFilter) bool {\n\tfor _, fn := range fns {\n\t\tif !fn(linter) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\ntype fnFilter func(linter LinterInfo) bool\n\nfunc onlyPresets(old versionone.Linters) fnFilter {\n\treturn func(linter LinterInfo) bool {\n\t\treturn linter.hasPresets(old.Presets)\n\t}\n}\n\nfunc onlyDefault(linter LinterInfo) bool {\n\treturn linter.Default\n}\n\nfunc notDefault(linter LinterInfo) bool {\n\treturn !linter.Default\n}\n\nfunc keepFast(old versionone.Linters) fnFilter {\n\treturn func(linter LinterInfo) bool {\n\t\tif !ptr.Deref(old.Fast) {\n\t\t\treturn true\n\t\t}\n\n\t\treturn !linter.Slow\n\t}\n}\n\nfunc keepSlow(old versionone.Linters) fnFilter {\n\treturn func(linter LinterInfo) bool {\n\t\tif !ptr.Deref(old.Fast) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn linter.Slow\n\t}\n}\n\nfunc unknownLinterNames(names []string, linters []LinterInfo) []string {\n\tdeprecatedLinters := []string{\n\t\t\"deadcode\",\n\t\t\"execinquery\",\n\t\t\"exhaustivestruct\",\n\t\t\"exportloopref\",\n\t\t\"golint\",\n\t\t\"ifshort\",\n\t\t\"interfacer\",\n\t\t\"maligned\",\n\t\t\"nosnakecase\",\n\t\t\"scopelint\",\n\t\t\"structcheck\",\n\t\t\"tenv\",\n\t\t\"typecheck\",\n\t\t\"varcheck\",\n\t}\n\n\tvar results []string\n\n\tfor _, name := range names {\n\t\tfound := slices.ContainsFunc(linters, func(l LinterInfo) bool {\n\t\t\treturn l.isName(name)\n\t\t})\n\n\t\tif !found {\n\t\t\tif slices.Contains(deprecatedLinters, name) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tresults = append(results, name)\n\t\t}\n\t}\n\n\treturn Unique(results)\n}\n\nfunc convertStaticcheckLinterNames(names []string) []string {\n\tvar results []string\n\n\tfor _, name := range names {\n\t\tif slices.Contains([]string{\"stylecheck\", \"gosimple\"}, name) {\n\t\t\tresults = append(results, \"staticcheck\")\n\t\t\tcontinue\n\t\t}\n\n\t\tresults = append(results, name)\n\t}\n\n\treturn Unique(results)\n}\n\nfunc convertDisabledStaticcheckLinterNames(names []string) []string {\n\tremoveStaticcheck := slices.Contains(names, \"staticcheck\") && slices.Contains(names, \"stylecheck\") && slices.Contains(names, \"gosimple\")\n\n\tvar results []string\n\n\tfor _, name := range names {\n\t\tif removeStaticcheck && slices.Contains([]string{\"stylecheck\", \"gosimple\", \"staticcheck\"}, name) {\n\t\t\tresults = append(results, \"staticcheck\")\n\t\t\tcontinue\n\t\t}\n\n\t\tif slices.Contains([]string{\"stylecheck\", \"gosimple\"}, name) {\n\t\t\tcontinue\n\t\t}\n\n\t\tresults = append(results, name)\n\t}\n\n\treturn Unique(results)\n}\n\nfunc onlyLinterNames(names []string) []string {\n\tformatters := []string{\"gci\", \"gofmt\", \"gofumpt\", \"goimports\"}\n\n\tvar results []string\n\n\tfor _, name := range names {\n\t\tif !slices.Contains(formatters, name) {\n\t\t\tresults = append(results, name)\n\t\t}\n\t}\n\n\treturn results\n}\n\nfunc onlyFormatterNames(names []string) []string {\n\tformatters := getAllFormatterNames()\n\n\tvar results []string\n\n\tfor _, name := range names {\n\t\tif slices.Contains(formatters, name) {\n\t\t\tresults = append(results, name)\n\t\t}\n\t}\n\n\treturn results\n}\n\nfunc convertAlternativeNames(names []string) []string {\n\taltNames := map[string]string{\n\t\t\"gas\":       \"gosec\",\n\t\t\"goerr113\":  \"err113\",\n\t\t\"gomnd\":     \"mnd\",\n\t\t\"logrlint\":  \"loggercheck\",\n\t\t\"megacheck\": \"staticcheck\",\n\t\t\"vet\":       \"govet\",\n\t\t\"vetshadow\": \"govet\",\n\t}\n\n\tvar results []string\n\n\tfor _, name := range names {\n\t\tif name == \"typecheck\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tif n, ok := altNames[name]; ok {\n\t\t\tresults = append(results, n)\n\t\t\tcontinue\n\t\t}\n\n\t\tresults = append(results, name)\n\t}\n\n\treturn Unique(results)\n}\n\nfunc Unique[S ~[]E, E cmp.Ordered](s S) S {\n\treturn slices.Compact(slices.Sorted(slices.Values(s)))\n}\n\nfunc getAllFormatterNames() []string {\n\treturn []string{\"gci\", \"gofmt\", \"gofumpt\", \"goimports\"}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_linter_names_test.go",
    "content": "package migrate\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n)\n\nfunc Test_disableAllFilter(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\told      versionone.Linters\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc: \"no presets, fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tDisableAll: ptr.Pointer(true),\n\t\t\t\tEnable:     nil,\n\t\t\t\tFast:       ptr.Pointer(false),\n\t\t\t\tPresets:    nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"no presets, fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tDisableAll: ptr.Pointer(true),\n\t\t\t\tEnable:     nil,\n\t\t\t\tFast:       ptr.Pointer(true),\n\t\t\t\tPresets:    nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"no presets, enable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tDisableAll: ptr.Pointer(true),\n\t\t\t\tEnable:     []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:       ptr.Pointer(false),\n\t\t\t\tPresets:    nil,\n\t\t\t},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"fast, no presets, enable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tDisableAll: ptr.Pointer(true),\n\t\t\t\tEnable:     []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:       ptr.Pointer(true),\n\t\t\t\tPresets:    nil,\n\t\t\t},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"presets, enable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tDisableAll: ptr.Pointer(true),\n\t\t\t\tEnable:     []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:       ptr.Pointer(false),\n\t\t\t\tPresets:    []string{\"comment\", \"error\", \"format\"},\n\t\t\t},\n\t\t\texpected: []string{\n\t\t\t\t\"dupword\",\n\t\t\t\t\"err113\",\n\t\t\t\t\"errcheck\",\n\t\t\t\t\"errorlint\",\n\t\t\t\t\"gci\",\n\t\t\t\t\"godot\",\n\t\t\t\t\"godox\",\n\t\t\t\t\"gofmt\",\n\t\t\t\t\"gofumpt\",\n\t\t\t\t\"goimports\",\n\t\t\t\t\"govet\",\n\t\t\t\t\"lll\",\n\t\t\t\t\"misspell\",\n\t\t\t\t\"wrapcheck\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"presets, enable, fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tDisableAll: ptr.Pointer(true),\n\t\t\t\tEnable:     []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:       ptr.Pointer(true),\n\t\t\t\tPresets:    []string{\"comment\", \"error\", \"format\"},\n\t\t\t},\n\t\t\texpected: []string{\n\t\t\t\t\"dupword\",\n\t\t\t\t\"gci\",\n\t\t\t\t\"godot\",\n\t\t\t\t\"godox\",\n\t\t\t\t\"gofmt\",\n\t\t\t\t\"gofumpt\",\n\t\t\t\t\"goimports\",\n\t\t\t\t\"govet\",\n\t\t\t\t\"lll\",\n\t\t\t\t\"misspell\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tresults := disableAllFilter(test.old)\n\n\t\t\tassert.Equal(t, test.expected, results)\n\t\t})\n\t}\n}\n\nfunc Test_enableAllFilter(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\told      versionone.Linters\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc: \"no options\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnableAll: ptr.Pointer(true),\n\t\t\t\tDisable:   nil,\n\t\t\t\tFast:      ptr.Pointer(false),\n\t\t\t\tPresets:   nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"presets (ignored)\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnableAll: ptr.Pointer(true),\n\t\t\t\tDisable:   nil,\n\t\t\t\tFast:      ptr.Pointer(false),\n\t\t\t\tPresets:   []string{\"comment\", \"error\", \"format\"},\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnableAll: ptr.Pointer(true),\n\t\t\t\tDisable:   nil,\n\t\t\t\tFast:      ptr.Pointer(true),\n\t\t\t\tPresets:   nil,\n\t\t\t},\n\t\t\texpected: []string{\"asasalint\", \"bodyclose\", \"canonicalheader\", \"containedctx\", \"contextcheck\", \"durationcheck\", \"err113\", \"errcheck\", \"errchkjson\", \"errname\", \"errorlint\", \"exhaustive\", \"exhaustruct\", \"exptostd\", \"fatcontext\", \"forbidigo\", \"forcetypeassert\", \"ginkgolinter\", \"gochecknoglobals\", \"gochecksumtype\", \"gocritic\", \"gosec\", \"gosimple\", \"gosmopolitan\", \"govet\", \"iface\", \"importas\", \"intrange\", \"ireturn\", \"loggercheck\", \"makezero\", \"mirror\", \"musttag\", \"nilerr\", \"nilnesserr\", \"nilnil\", \"noctx\", \"nonamedreturns\", \"paralleltest\", \"perfsprint\", \"protogetter\", \"reassign\", \"recvcheck\", \"revive\", \"rowserrcheck\", \"sloglint\", \"spancheck\", \"sqlclosecheck\", \"staticcheck\", \"stylecheck\", \"tagliatelle\", \"testifylint\", \"thelper\", \"tparallel\", \"unconvert\", \"unparam\", \"unused\", \"usetesting\", \"varnamelen\", \"wastedassign\", \"wrapcheck\", \"zerologlint\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnableAll: ptr.Pointer(true),\n\t\t\t\tDisable:   []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:      ptr.Pointer(false),\n\t\t\t\tPresets:   nil,\n\t\t\t},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable, fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnableAll: ptr.Pointer(true),\n\t\t\t\tDisable:   []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:      ptr.Pointer(true),\n\t\t\t\tPresets:   nil,\n\t\t\t},\n\t\t\texpected: []string{\"asasalint\", \"bodyclose\", \"canonicalheader\", \"containedctx\", \"contextcheck\", \"durationcheck\", \"err113\", \"errcheck\", \"errchkjson\", \"errname\", \"errorlint\", \"exhaustive\", \"exhaustruct\", \"exptostd\", \"fatcontext\", \"forbidigo\", \"forcetypeassert\", \"ginkgolinter\", \"gochecknoglobals\", \"gochecksumtype\", \"gocritic\", \"gosec\", \"gosimple\", \"gosmopolitan\", \"govet\", \"iface\", \"importas\", \"intrange\", \"ireturn\", \"lll\", \"loggercheck\", \"makezero\", \"mirror\", \"misspell\", \"musttag\", \"nilerr\", \"nilnesserr\", \"nilnil\", \"noctx\", \"nonamedreturns\", \"paralleltest\", \"perfsprint\", \"protogetter\", \"reassign\", \"recvcheck\", \"revive\", \"rowserrcheck\", \"sloglint\", \"spancheck\", \"sqlclosecheck\", \"staticcheck\", \"stylecheck\", \"tagliatelle\", \"testifylint\", \"thelper\", \"tparallel\", \"unconvert\", \"unparam\", \"unused\", \"usetesting\", \"varnamelen\", \"wastedassign\", \"wrapcheck\", \"zerologlint\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable, enable, fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnableAll: ptr.Pointer(true),\n\t\t\t\tEnable:    []string{\"canonicalheader\", \"errname\"},\n\t\t\t\tDisable:   []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:      ptr.Pointer(true),\n\t\t\t\tPresets:   nil,\n\t\t\t},\n\t\t\texpected: []string{\"asasalint\", \"bodyclose\", \"containedctx\", \"contextcheck\", \"durationcheck\", \"err113\", \"errcheck\", \"errchkjson\", \"errorlint\", \"exhaustive\", \"exhaustruct\", \"exptostd\", \"fatcontext\", \"forbidigo\", \"forcetypeassert\", \"ginkgolinter\", \"gochecknoglobals\", \"gochecksumtype\", \"gocritic\", \"gosec\", \"gosimple\", \"gosmopolitan\", \"govet\", \"iface\", \"importas\", \"intrange\", \"ireturn\", \"lll\", \"loggercheck\", \"makezero\", \"mirror\", \"misspell\", \"musttag\", \"nilerr\", \"nilnesserr\", \"nilnil\", \"noctx\", \"nonamedreturns\", \"paralleltest\", \"perfsprint\", \"protogetter\", \"reassign\", \"recvcheck\", \"revive\", \"rowserrcheck\", \"sloglint\", \"spancheck\", \"sqlclosecheck\", \"staticcheck\", \"stylecheck\", \"tagliatelle\", \"testifylint\", \"thelper\", \"tparallel\", \"unconvert\", \"unparam\", \"unused\", \"usetesting\", \"varnamelen\", \"wastedassign\", \"wrapcheck\", \"zerologlint\"},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tresults := enableAllFilter(test.old)\n\n\t\t\tassert.Equal(t, test.expected, results)\n\t\t})\n\t}\n}\n\nfunc Test_defaultLintersDisableFilter(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\told      versionone.Linters\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc: \"no options\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"presets (ignored)\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: []string{\"comment\", \"error\", \"format\"},\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(true),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: []string{\"errcheck\", \"gosimple\", \"govet\", \"staticcheck\", \"unused\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"enable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable, fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:    ptr.Pointer(true),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: []string{\"errcheck\", \"gosimple\", \"govet\", \"lll\", \"misspell\", \"staticcheck\", \"unused\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"enable, disable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  []string{\"grouper\", \"importas\", \"errcheck\"},\n\t\t\t\tDisable: []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"enable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  []string{\"grouper\", \"importas\", \"errcheck\"},\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tresults := toNames(defaultLintersDisableFilter(test.old))\n\n\t\t\tassert.Equal(t, test.expected, results)\n\t\t})\n\t}\n}\n\nfunc Test_defaultLintersEnableFilter(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc string\n\n\t\told      versionone.Linters\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc: \"no options\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"enable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  []string{\"grouper\", \"importas\", \"errcheck\"},\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: []string{\"grouper\", \"importas\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"enable, disable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  []string{\"grouper\", \"importas\", \"errcheck\"},\n\t\t\t\tDisable: []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: []string{\"grouper\", \"importas\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: nil,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"presets\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(false),\n\t\t\t\tPresets: []string{\"comment\", \"error\", \"format\"},\n\t\t\t},\n\t\t\texpected: []string{\"dupword\", \"err113\", \"errorlint\", \"gci\", \"godot\", \"godox\", \"gofmt\", \"gofumpt\", \"goimports\", \"misspell\", \"wrapcheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"presets, fast\",\n\t\t\told: versionone.Linters{\n\t\t\t\tEnable:  nil,\n\t\t\t\tDisable: nil,\n\t\t\t\tFast:    ptr.Pointer(true),\n\t\t\t\tPresets: []string{\"comment\", \"error\", \"format\"},\n\t\t\t},\n\t\t\texpected: []string{\"dupword\", \"gci\", \"godot\", \"godox\", \"gofmt\", \"gofumpt\", \"goimports\", \"misspell\"},\n\t\t},\n\t}\n\n\t// presets - slow + enable - default - [effective disable] => effective enable\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tresults := toNames(defaultLintersEnableFilter(test.old, defaultLintersDisableFilter(test.old)))\n\n\t\t\tassert.Equal(t, test.expected, results)\n\t\t})\n\t}\n}\n\nfunc Test_convertStaticcheckLinterNames(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tnames    []string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc:     \"empty\",\n\t\t\tnames:    nil,\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc:     \"no staticcheck linters\",\n\t\t\tnames:    []string{\"lll\", \"misspell\", \"govet\"},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\"},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"stylecheck\",\n\t\t\tnames:    []string{\"lll\", \"misspell\", \"govet\", \"stylecheck\"},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\", \"staticcheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"gosimple\",\n\t\t\tnames:    []string{\"lll\", \"misspell\", \"govet\", \"gosimple\"},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\", \"staticcheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"staticcheck\",\n\t\t\tnames:    []string{\"lll\", \"misspell\", \"govet\", \"staticcheck\"},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\", \"staticcheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"staticcheck, stylecheck, gosimple\",\n\t\t\tnames:    []string{\"lll\", \"misspell\", \"govet\", \"staticcheck\", \"stylecheck\", \"gosimple\"},\n\t\t\texpected: []string{\"govet\", \"lll\", \"misspell\", \"staticcheck\"},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tresults := convertStaticcheckLinterNames(test.names)\n\n\t\t\tassert.Equal(t, test.expected, results)\n\t\t})\n\t}\n}\n\nfunc Test_unknownLinterNames(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tnames    []string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc:     \"empty\",\n\t\t\tnames:    nil,\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc:     \"deprecated\",\n\t\t\tnames:    []string{\"golint\", \"structcheck\", \"varcheck\"},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc:     \"deprecated and unknown\",\n\t\t\tnames:    []string{\"golint\", \"structcheck\", \"varcheck\", \"a\", \"b\"},\n\t\t\texpected: []string{\"a\", \"b\"},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"deprecated and known\",\n\t\t\tnames:    []string{\"golint\", \"structcheck\", \"varcheck\", \"gosec\", \"gofmt\"},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc:     \"only unknown\",\n\t\t\tnames:    []string{\"a\", \"b\", \"c\"},\n\t\t\texpected: []string{\"a\", \"b\", \"c\"},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"unknown and known\",\n\t\t\tnames:    []string{\"a\", \"gosec\", \"gofmt\"},\n\t\t\texpected: []string{\"a\"},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tnames := unknownLinterNames(test.names, allLinters())\n\n\t\t\tassert.Equal(t, test.expected, names)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_linters.go",
    "content": "package migrate\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc toLinters(old *versionone.Config) versiontwo.Linters {\n\tenable, disable := ProcessEffectiveLinters(old.Linters)\n\n\treturn versiontwo.Linters{\n\t\tDefault:    getDefaultName(old.Linters),\n\t\tEnable:     onlyLinterNames(convertStaticcheckLinterNames(enable)),\n\t\tDisable:    onlyLinterNames(convertDisabledStaticcheckLinterNames(disable)),\n\t\tFastOnly:   nil,\n\t\tSettings:   toLinterSettings(old.LintersSettings),\n\t\tExclusions: toExclusions(old),\n\t}\n}\n\nfunc getDefaultName(old versionone.Linters) *string {\n\tswitch {\n\tcase ptr.Deref(old.DisableAll):\n\t\treturn ptr.Pointer(\"none\")\n\tcase ptr.Deref(old.EnableAll):\n\t\treturn ptr.Pointer(\"all\")\n\tdefault:\n\t\treturn nil // standard is the default\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_linters_exclusions.go",
    "content": "package migrate\n\nimport (\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result/processors\"\n)\n\nfunc toExclusions(old *versionone.Config) versiontwo.LinterExclusions {\n\treturn versiontwo.LinterExclusions{\n\t\tGenerated: toExclusionGenerated(old.Issues.ExcludeGenerated),\n\t\tPresets:   toPresets(old.Issues),\n\t\tRules:     toExclusionRules(old),\n\t\tPaths:     toExclusionPaths(old.Issues),\n\t}\n}\n\nfunc toExclusionGenerated(excludeGenerated *string) *string {\n\tif excludeGenerated == nil || ptr.Deref(excludeGenerated) == \"\" {\n\t\treturn ptr.Pointer(\"lax\")\n\t}\n\n\tif ptr.Deref(excludeGenerated) == \"strict\" {\n\t\treturn nil\n\t}\n\n\treturn excludeGenerated\n}\n\nfunc toPresets(old versionone.Issues) []string {\n\tif old.UseDefaultExcludes != nil && !ptr.Deref(old.UseDefaultExcludes) {\n\t\treturn nil\n\t}\n\n\tif len(old.IncludeDefaultExcludes) != 0 {\n\t\tvar pp []string\n\t\tfor p, rules := range processors.LinterExclusionPresets {\n\t\t\tfound := slices.ContainsFunc(rules, func(rule config.ExcludeRule) bool {\n\t\t\t\treturn slices.Contains(old.IncludeDefaultExcludes, rule.InternalReference)\n\t\t\t})\n\t\t\tif !found {\n\t\t\t\tpp = append(pp, p)\n\t\t\t}\n\t\t}\n\n\t\tslices.Sort(pp)\n\n\t\treturn pp\n\t}\n\n\treturn []string{\n\t\tconfig.ExclusionPresetComments,\n\t\tconfig.ExclusionPresetCommonFalsePositives,\n\t\tconfig.ExclusionPresetLegacy,\n\t\tconfig.ExclusionPresetStdErrorHandling,\n\t}\n}\n\nfunc toExclusionRules(old *versionone.Config) []versiontwo.ExcludeRule {\n\tvar results []versiontwo.ExcludeRule\n\n\tfor _, rule := range old.Issues.ExcludeRules {\n\t\tnames := onlyLinterNames(convertStaticcheckLinterNames(convertAlternativeNames(rule.Linters)))\n\t\tif len(rule.Linters) > 0 && len(names) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tresults = append(results, versiontwo.ExcludeRule{\n\t\t\tBaseRule: versiontwo.BaseRule{\n\t\t\t\tLinters:    names,\n\t\t\t\tPath:       rule.Path,\n\t\t\t\tPathExcept: rule.PathExcept,\n\t\t\t\tText:       addPrefix(old.Issues, rule.Text),\n\t\t\t\tSource:     addPrefix(old.Issues, rule.Source),\n\t\t\t},\n\t\t})\n\t}\n\n\tfor _, pattern := range old.Issues.ExcludePatterns {\n\t\tresults = append(results, versiontwo.ExcludeRule{\n\t\t\tBaseRule: versiontwo.BaseRule{\n\t\t\t\tPath: ptr.Pointer(`(.+)\\.go$`),\n\t\t\t\tText: addPrefix(old.Issues, ptr.Pointer(pattern)),\n\t\t\t},\n\t\t})\n\t}\n\n\treturn slices.Concat(results, linterTestExclusions(old.LintersSettings))\n}\n\nfunc addPrefix(old versionone.Issues, s *string) *string {\n\tif s == nil || ptr.Deref(s) == \"\" {\n\t\treturn s\n\t}\n\n\tvar prefix string\n\tif ptr.Deref(old.ExcludeCaseSensitive) {\n\t\tprefix = \"(?i)\"\n\t}\n\n\treturn ptr.Pointer(prefix + ptr.Deref(s))\n}\n\nfunc linterTestExclusions(old versionone.LintersSettings) []versiontwo.ExcludeRule {\n\tvar excludedTestLinters []string\n\n\tif ptr.Deref(old.Asasalint.IgnoreTest) {\n\t\texcludedTestLinters = append(excludedTestLinters, \"asasalint\")\n\t}\n\tif ptr.Deref(old.Cyclop.SkipTests) {\n\t\texcludedTestLinters = append(excludedTestLinters, \"cyclop\")\n\t}\n\tif ptr.Deref(old.Goconst.IgnoreTests) {\n\t\texcludedTestLinters = append(excludedTestLinters, \"goconst\")\n\t}\n\tif ptr.Deref(old.Gosmopolitan.IgnoreTests) {\n\t\texcludedTestLinters = append(excludedTestLinters, \"gosmopolitan\")\n\t}\n\n\tif len(excludedTestLinters) == 0 {\n\t\treturn nil\n\t}\n\n\treturn []versiontwo.ExcludeRule{{\n\t\tBaseRule: versiontwo.BaseRule{\n\t\t\tLinters: excludedTestLinters,\n\t\t\tPath:    ptr.Pointer(`(.+)_test\\.go`),\n\t\t},\n\t}}\n}\n\nfunc toExclusionPaths(old versionone.Issues) []string {\n\tresults := slices.Concat(old.ExcludeFiles, old.ExcludeDirs)\n\n\tif old.UseDefaultExcludeDirs == nil || ptr.Deref(old.UseDefaultExcludeDirs) {\n\t\tresults = append(results, \"third_party$\", \"builtin$\", \"examples$\")\n\t}\n\n\treturn results\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_linters_settings.go",
    "content": "package migrate\n\nimport (\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc toLinterSettings(old versionone.LintersSettings) versiontwo.LintersSettings {\n\treturn versiontwo.LintersSettings{\n\t\tAsasalint:       toAsasalintSettings(old.Asasalint),\n\t\tBiDiChk:         toBiDiChkSettings(old.BiDiChk),\n\t\tCopyLoopVar:     toCopyLoopVarSettings(old.CopyLoopVar),\n\t\tCyclop:          toCyclopSettings(old.Cyclop),\n\t\tDecorder:        toDecorderSettings(old.Decorder),\n\t\tDepguard:        toDepGuardSettings(old.Depguard),\n\t\tDogsled:         toDogsledSettings(old.Dogsled),\n\t\tDupl:            toDuplSettings(old.Dupl),\n\t\tDupWord:         toDupWordSettings(old.DupWord),\n\t\tErrcheck:        toErrcheckSettings(old.Errcheck),\n\t\tErrChkJSON:      toErrChkJSONSettings(old.ErrChkJSON),\n\t\tErrorLint:       toErrorLintSettings(old.ErrorLint),\n\t\tExhaustive:      toExhaustiveSettings(old.Exhaustive),\n\t\tExhaustruct:     toExhaustructSettings(old.Exhaustruct),\n\t\tFatcontext:      toFatcontextSettings(old.Fatcontext),\n\t\tForbidigo:       toForbidigoSettings(old.Forbidigo),\n\t\tFunlen:          toFunlenSettings(old.Funlen),\n\t\tGinkgoLinter:    toGinkgoLinterSettings(old.GinkgoLinter),\n\t\tGocognit:        toGocognitSettings(old.Gocognit),\n\t\tGoChecksumType:  toGoChecksumTypeSettings(old.GoChecksumType),\n\t\tGoconst:         toGoConstSettings(old.Goconst),\n\t\tGocritic:        toGoCriticSettings(old.Gocritic),\n\t\tGocyclo:         toGoCycloSettings(old.Gocyclo),\n\t\tGodot:           toGodotSettings(old.Godot),\n\t\tGodox:           toGodoxSettings(old.Godox),\n\t\tGoheader:        toGoHeaderSettings(old.Goheader),\n\t\tGoModDirectives: toGoModDirectivesSettings(old.GoModDirectives),\n\t\tGomodguard:      toGoModGuardSettings(old.Gomodguard),\n\t\tGosec:           toGoSecSettings(old.Gosec),\n\t\tGosmopolitan:    toGosmopolitanSettings(old.Gosmopolitan),\n\t\tGovet:           toGovetSettings(old.Govet),\n\t\tGrouper:         toGrouperSettings(old.Grouper),\n\t\tIface:           toIfaceSettings(old.Iface),\n\t\tImportAs:        toImportAsSettings(old.ImportAs),\n\t\tInamedparam:     toINamedParamSettings(old.Inamedparam),\n\t\tInterfaceBloat:  toInterfaceBloatSettings(old.InterfaceBloat),\n\t\tIreturn:         toIreturnSettings(old.Ireturn),\n\t\tLll:             toLllSettings(old.Lll),\n\t\tLoggerCheck:     toLoggerCheckSettings(old.LoggerCheck),\n\t\tMaintIdx:        toMaintIdxSettings(old.MaintIdx),\n\t\tMakezero:        toMakezeroSettings(old.Makezero),\n\t\tMisspell:        toMisspellSettings(old.Misspell),\n\t\tMnd:             toMndSettings(old.Mnd),\n\t\tMustTag:         toMustTagSettings(old.MustTag),\n\t\tNakedret:        toNakedretSettings(old.Nakedret),\n\t\tNestif:          toNestifSettings(old.Nestif),\n\t\tNilNil:          toNilNilSettings(old.NilNil),\n\t\tNlreturn:        toNlreturnSettings(old.Nlreturn),\n\t\tNoLintLint:      toNoLintLintSettings(old.NoLintLint),\n\t\tNoNamedReturns:  toNoNamedReturnsSettings(old.NoNamedReturns),\n\t\tParallelTest:    toParallelTestSettings(old.ParallelTest),\n\t\tPerfSprint:      toPerfSprintSettings(old.PerfSprint),\n\t\tPrealloc:        toPreallocSettings(old.Prealloc),\n\t\tPredeclared:     toPredeclaredSettings(old.Predeclared),\n\t\tPromlinter:      toPromlinterSettings(old.Promlinter),\n\t\tProtoGetter:     toProtoGetterSettings(old.ProtoGetter),\n\t\tReassign:        toReassignSettings(old.Reassign),\n\t\tRecvcheck:       toRecvcheckSettings(old.Recvcheck),\n\t\tRevive:          toReviveSettings(old.Revive),\n\t\tRowsErrCheck:    toRowsErrCheckSettings(old.RowsErrCheck),\n\t\tSlogLint:        toSlogLintSettings(old.SlogLint),\n\t\tSpancheck:       toSpancheckSettings(old.Spancheck),\n\t\tStaticcheck:     toStaticCheckSettings(old),\n\t\tTagAlign:        toTagAlignSettings(old.TagAlign),\n\t\tTagliatelle:     toTagliatelleSettings(old.Tagliatelle),\n\t\tTestifylint:     toTestifylintSettings(old.Testifylint),\n\t\tTestpackage:     toTestpackageSettings(old.Testpackage),\n\t\tThelper:         toThelperSettings(old.Thelper),\n\t\tUnconvert:       toUnconvertSettings(old.Unconvert),\n\t\tUnparam:         toUnparamSettings(old.Unparam),\n\t\tUnused:          toUnusedSettings(old.Unused),\n\t\tUseStdlibVars:   toUseStdlibVarsSettings(old.UseStdlibVars),\n\t\tUseTesting:      toUseTestingSettings(old.UseTesting),\n\t\tVarnamelen:      toVarnamelenSettings(old.Varnamelen),\n\t\tWhitespace:      toWhitespaceSettings(old.Whitespace),\n\t\tWrapcheck:       toWrapcheckSettings(old.Wrapcheck),\n\t\tWSL:             toWSLSettings(old.WSL),\n\t\tCustom:          toCustom(old.Custom),\n\t}\n}\n\nfunc toAsasalintSettings(old versionone.AsasalintSettings) versiontwo.AsasalintSettings {\n\treturn versiontwo.AsasalintSettings{\n\t\tExclude:              old.Exclude,\n\t\tUseBuiltinExclusions: old.UseBuiltinExclusions,\n\t}\n}\n\nfunc toBiDiChkSettings(old versionone.BiDiChkSettings) versiontwo.BiDiChkSettings {\n\t// The values are true be default, but the default are defined after the configuration loading.\n\t// So the serialization doesn't have good results, but it's complex to do better.\n\treturn versiontwo.BiDiChkSettings{\n\t\tLeftToRightEmbedding:     old.LeftToRightEmbedding,\n\t\tRightToLeftEmbedding:     old.RightToLeftEmbedding,\n\t\tPopDirectionalFormatting: old.PopDirectionalFormatting,\n\t\tLeftToRightOverride:      old.LeftToRightOverride,\n\t\tRightToLeftOverride:      old.RightToLeftOverride,\n\t\tLeftToRightIsolate:       old.LeftToRightIsolate,\n\t\tRightToLeftIsolate:       old.RightToLeftIsolate,\n\t\tFirstStrongIsolate:       old.FirstStrongIsolate,\n\t\tPopDirectionalIsolate:    old.PopDirectionalIsolate,\n\t}\n}\n\nfunc toCopyLoopVarSettings(old versionone.CopyLoopVarSettings) versiontwo.CopyLoopVarSettings {\n\treturn versiontwo.CopyLoopVarSettings{\n\t\tCheckAlias: old.CheckAlias,\n\t}\n}\n\nfunc toCyclopSettings(old versionone.Cyclop) versiontwo.CyclopSettings {\n\treturn versiontwo.CyclopSettings{\n\t\tMaxComplexity:  old.MaxComplexity,\n\t\tPackageAverage: old.PackageAverage,\n\t}\n}\n\nfunc toDecorderSettings(old versionone.DecorderSettings) versiontwo.DecorderSettings {\n\treturn versiontwo.DecorderSettings{\n\t\tDecOrder:                  old.DecOrder,\n\t\tIgnoreUnderscoreVars:      old.IgnoreUnderscoreVars,\n\t\tDisableDecNumCheck:        old.DisableDecNumCheck,\n\t\tDisableTypeDecNumCheck:    old.DisableTypeDecNumCheck,\n\t\tDisableConstDecNumCheck:   old.DisableConstDecNumCheck,\n\t\tDisableVarDecNumCheck:     old.DisableVarDecNumCheck,\n\t\tDisableDecOrderCheck:      old.DisableDecOrderCheck,\n\t\tDisableInitFuncFirstCheck: old.DisableInitFuncFirstCheck,\n\t}\n}\n\nfunc toDepGuardSettings(old versionone.DepGuardSettings) versiontwo.DepGuardSettings {\n\tsettings := versiontwo.DepGuardSettings{}\n\n\tfor k, r := range old.Rules {\n\t\tif settings.Rules == nil {\n\t\t\tsettings.Rules = make(map[string]*versiontwo.DepGuardList)\n\t\t}\n\n\t\tlist := &versiontwo.DepGuardList{\n\t\t\tListMode: r.ListMode,\n\t\t\tFiles:    r.Files,\n\t\t\tAllow:    r.Allow,\n\t\t}\n\n\t\tfor _, deny := range r.Deny {\n\t\t\tlist.Deny = append(list.Deny, versiontwo.DepGuardDeny{\n\t\t\t\tPkg:  deny.Pkg,\n\t\t\t\tDesc: deny.Desc,\n\t\t\t})\n\t\t}\n\n\t\tsettings.Rules[k] = list\n\t}\n\n\treturn settings\n}\n\nfunc toDogsledSettings(old versionone.DogsledSettings) versiontwo.DogsledSettings {\n\treturn versiontwo.DogsledSettings{\n\t\tMaxBlankIdentifiers: old.MaxBlankIdentifiers,\n\t}\n}\n\nfunc toDuplSettings(old versionone.DuplSettings) versiontwo.DuplSettings {\n\treturn versiontwo.DuplSettings{\n\t\tThreshold: old.Threshold,\n\t}\n}\n\nfunc toDupWordSettings(old versionone.DupWordSettings) versiontwo.DupWordSettings {\n\treturn versiontwo.DupWordSettings{\n\t\tKeywords: old.Keywords,\n\t\tIgnore:   old.Ignore,\n\t}\n}\n\nfunc toErrcheckSettings(old versionone.ErrcheckSettings) versiontwo.ErrcheckSettings {\n\treturn versiontwo.ErrcheckSettings{\n\t\tDisableDefaultExclusions: old.DisableDefaultExclusions,\n\t\tCheckTypeAssertions:      old.CheckTypeAssertions,\n\t\tCheckAssignToBlank:       old.CheckAssignToBlank,\n\t\tExcludeFunctions:         old.ExcludeFunctions,\n\t}\n}\n\nfunc toErrChkJSONSettings(old versionone.ErrChkJSONSettings) versiontwo.ErrChkJSONSettings {\n\treturn versiontwo.ErrChkJSONSettings{\n\t\tCheckErrorFreeEncoding: old.CheckErrorFreeEncoding,\n\t\tReportNoExported:       old.ReportNoExported,\n\t}\n}\n\nfunc toErrorLintSettings(old versionone.ErrorLintSettings) versiontwo.ErrorLintSettings {\n\tsettings := versiontwo.ErrorLintSettings{\n\t\tErrorf:      old.Errorf,\n\t\tErrorfMulti: old.ErrorfMulti,\n\t\tAsserts:     old.Asserts,\n\t\tComparison:  old.Comparison,\n\t}\n\n\tfor _, allowedError := range old.AllowedErrors {\n\t\tsettings.AllowedErrors = append(settings.AllowedErrors, versiontwo.ErrorLintAllowPair{\n\t\t\tErr: allowedError.Err,\n\t\t\tFun: allowedError.Fun,\n\t\t})\n\t}\n\tfor _, allowedError := range old.AllowedErrorsWildcard {\n\t\tsettings.AllowedErrorsWildcard = append(settings.AllowedErrorsWildcard, versiontwo.ErrorLintAllowPair{\n\t\t\tErr: allowedError.Err,\n\t\t\tFun: allowedError.Fun,\n\t\t})\n\t}\n\n\treturn settings\n}\n\nfunc toExhaustiveSettings(old versionone.ExhaustiveSettings) versiontwo.ExhaustiveSettings {\n\treturn versiontwo.ExhaustiveSettings{\n\t\tCheck:                      old.Check,\n\t\tDefaultSignifiesExhaustive: old.DefaultSignifiesExhaustive,\n\t\tIgnoreEnumMembers:          old.IgnoreEnumMembers,\n\t\tIgnoreEnumTypes:            old.IgnoreEnumTypes,\n\t\tPackageScopeOnly:           old.PackageScopeOnly,\n\t\tExplicitExhaustiveMap:      old.ExplicitExhaustiveMap,\n\t\tExplicitExhaustiveSwitch:   old.ExplicitExhaustiveSwitch,\n\t\tDefaultCaseRequired:        old.DefaultCaseRequired,\n\t}\n}\n\nfunc toExhaustructSettings(old versionone.ExhaustructSettings) versiontwo.ExhaustructSettings {\n\treturn versiontwo.ExhaustructSettings{\n\t\tInclude: old.Include,\n\t\tExclude: old.Exclude,\n\t}\n}\n\nfunc toFatcontextSettings(old versionone.FatcontextSettings) versiontwo.FatcontextSettings {\n\treturn versiontwo.FatcontextSettings{\n\t\tCheckStructPointers: old.CheckStructPointers,\n\t}\n}\n\nfunc toForbidigoSettings(old versionone.ForbidigoSettings) versiontwo.ForbidigoSettings {\n\tsettings := versiontwo.ForbidigoSettings{\n\t\tExcludeGodocExamples: old.ExcludeGodocExamples,\n\t\tAnalyzeTypes:         old.AnalyzeTypes,\n\t}\n\n\tfor _, pattern := range old.Forbid {\n\t\tif pattern.Pattern == nil && pattern.Msg == nil && pattern.Package == nil {\n\t\t\tbuffer, err := pattern.MarshalString()\n\t\t\tif err != nil {\n\t\t\t\t// impossible case\n\t\t\t\tpanic(err)\n\t\t\t}\n\n\t\t\tsettings.Forbid = append(settings.Forbid, versiontwo.ForbidigoPattern{\n\t\t\t\tPattern: ptr.Pointer(string(buffer)),\n\t\t\t})\n\n\t\t\tcontinue\n\t\t}\n\n\t\tsettings.Forbid = append(settings.Forbid, versiontwo.ForbidigoPattern{\n\t\t\tPattern: pattern.Pattern,\n\t\t\tPackage: pattern.Package,\n\t\t\tMsg:     pattern.Msg,\n\t\t})\n\t}\n\n\treturn settings\n}\n\nfunc toFunlenSettings(old versionone.FunlenSettings) versiontwo.FunlenSettings {\n\treturn versiontwo.FunlenSettings{\n\t\tLines:          old.Lines,\n\t\tStatements:     old.Statements,\n\t\tIgnoreComments: old.IgnoreComments,\n\t}\n}\n\nfunc toGinkgoLinterSettings(old versionone.GinkgoLinterSettings) versiontwo.GinkgoLinterSettings {\n\treturn versiontwo.GinkgoLinterSettings{\n\t\tSuppressLenAssertion:       old.SuppressLenAssertion,\n\t\tSuppressNilAssertion:       old.SuppressNilAssertion,\n\t\tSuppressErrAssertion:       old.SuppressErrAssertion,\n\t\tSuppressCompareAssertion:   old.SuppressCompareAssertion,\n\t\tSuppressAsyncAssertion:     old.SuppressAsyncAssertion,\n\t\tSuppressTypeCompareWarning: old.SuppressTypeCompareWarning,\n\t\tForbidFocusContainer:       old.ForbidFocusContainer,\n\t\tAllowHaveLenZero:           old.AllowHaveLenZero,\n\t\tForceExpectTo:              old.ForceExpectTo,\n\t\tValidateAsyncIntervals:     old.ValidateAsyncIntervals,\n\t\tForbidSpecPollution:        old.ForbidSpecPollution,\n\t\tForceSucceedForFuncs:       old.ForceSucceedForFuncs,\n\t}\n}\n\nfunc toGocognitSettings(old versionone.GocognitSettings) versiontwo.GocognitSettings {\n\treturn versiontwo.GocognitSettings{\n\t\tMinComplexity: old.MinComplexity,\n\t}\n}\n\nfunc toGoChecksumTypeSettings(old versionone.GoChecksumTypeSettings) versiontwo.GoChecksumTypeSettings {\n\treturn versiontwo.GoChecksumTypeSettings{\n\t\tDefaultSignifiesExhaustive: old.DefaultSignifiesExhaustive,\n\t\tIncludeSharedInterfaces:    old.IncludeSharedInterfaces,\n\t}\n}\n\nfunc toGoConstSettings(old versionone.GoConstSettings) versiontwo.GoConstSettings {\n\treturn versiontwo.GoConstSettings{\n\t\tIgnoreStrings:       old.IgnoreStrings,\n\t\tMatchWithConstants:  old.MatchWithConstants,\n\t\tMinStringLen:        old.MinStringLen,\n\t\tMinOccurrencesCount: old.MinOccurrencesCount,\n\t\tParseNumbers:        old.ParseNumbers,\n\t\tNumberMin:           old.NumberMin,\n\t\tNumberMax:           old.NumberMax,\n\t\tIgnoreCalls:         old.IgnoreCalls,\n\t}\n}\n\nfunc toGoCriticSettings(old versionone.GoCriticSettings) versiontwo.GoCriticSettings {\n\tsettings := versiontwo.GoCriticSettings{\n\t\tGo:             old.Go,\n\t\tDisableAll:     old.DisableAll,\n\t\tEnabledChecks:  old.EnabledChecks,\n\t\tEnableAll:      old.EnableAll,\n\t\tDisabledChecks: old.DisabledChecks,\n\t\tEnabledTags:    old.EnabledTags,\n\t\tDisabledTags:   old.DisabledTags,\n\t}\n\n\tfor k, checkSettings := range old.SettingsPerCheck {\n\t\tif settings.SettingsPerCheck == nil {\n\t\t\tsettings.SettingsPerCheck = make(map[string]versiontwo.GoCriticCheckSettings)\n\t\t}\n\n\t\tif k != \"ruleguard\" {\n\t\t\tsettings.SettingsPerCheck[k] = versiontwo.GoCriticCheckSettings(checkSettings)\n\n\t\t\tcontinue\n\t\t}\n\n\t\tgccs := versiontwo.GoCriticCheckSettings{}\n\n\t\tfor sk, value := range checkSettings {\n\t\t\tif sk != \"rules\" {\n\t\t\t\tgccs[sk] = value\n\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif rules, ok := value.(string); ok {\n\t\t\t\tgccs[sk] = strings.ReplaceAll(rules, \"${configDir}\", \"${base-path}\")\n\t\t\t}\n\t\t}\n\n\t\tsettings.SettingsPerCheck[k] = gccs\n\t}\n\n\treturn settings\n}\n\nfunc toGoCycloSettings(old versionone.GoCycloSettings) versiontwo.GoCycloSettings {\n\treturn versiontwo.GoCycloSettings{\n\t\tMinComplexity: old.MinComplexity,\n\t}\n}\n\nfunc toGodotSettings(old versionone.GodotSettings) versiontwo.GodotSettings {\n\treturn versiontwo.GodotSettings{\n\t\tScope:   old.Scope,\n\t\tExclude: old.Exclude,\n\t\tCapital: old.Capital,\n\t\tPeriod:  old.Period,\n\t}\n}\n\nfunc toGodoxSettings(old versionone.GodoxSettings) versiontwo.GodoxSettings {\n\treturn versiontwo.GodoxSettings{\n\t\tKeywords: old.Keywords,\n\t}\n}\n\nfunc toGoHeaderSettings(old versionone.GoHeaderSettings) versiontwo.GoHeaderSettings {\n\treturn versiontwo.GoHeaderSettings{\n\t\tValues:       old.Values,\n\t\tTemplate:     old.Template,\n\t\tTemplatePath: old.TemplatePath,\n\t}\n}\n\nfunc toGoModDirectivesSettings(old versionone.GoModDirectivesSettings) versiontwo.GoModDirectivesSettings {\n\treturn versiontwo.GoModDirectivesSettings{\n\t\tReplaceAllowList:          old.ReplaceAllowList,\n\t\tReplaceLocal:              old.ReplaceLocal,\n\t\tExcludeForbidden:          old.ExcludeForbidden,\n\t\tRetractAllowNoExplanation: old.RetractAllowNoExplanation,\n\t\tToolchainForbidden:        old.ToolchainForbidden,\n\t\tToolchainPattern:          old.ToolchainPattern,\n\t\tToolForbidden:             old.ToolForbidden,\n\t\tGoDebugForbidden:          old.GoDebugForbidden,\n\t\tGoVersionPattern:          old.GoVersionPattern,\n\t}\n}\n\nfunc toGoModGuardSettings(old versionone.GoModGuardSettings) versiontwo.GoModGuardSettings {\n\tblocked := versiontwo.GoModGuardBlocked{\n\t\tLocalReplaceDirectives: old.Blocked.LocalReplaceDirectives,\n\t}\n\n\tfor _, version := range old.Blocked.Modules {\n\t\tdata := map[string]versiontwo.GoModGuardModule{}\n\n\t\tfor k, v := range version {\n\t\t\tdata[k] = versiontwo.GoModGuardModule{\n\t\t\t\tRecommendations: v.Recommendations,\n\t\t\t\tReason:          v.Reason,\n\t\t\t}\n\t\t}\n\n\t\tblocked.Modules = append(blocked.Modules, data)\n\t}\n\n\tfor _, version := range old.Blocked.Versions {\n\t\tdata := map[string]versiontwo.GoModGuardVersion{}\n\n\t\tfor k, v := range version {\n\t\t\tdata[k] = versiontwo.GoModGuardVersion{\n\t\t\t\tVersion: v.Version,\n\t\t\t\tReason:  v.Reason,\n\t\t\t}\n\t\t}\n\n\t\tblocked.Versions = append(blocked.Versions, data)\n\t}\n\n\treturn versiontwo.GoModGuardSettings{\n\t\tAllowed: versiontwo.GoModGuardAllowed{\n\t\t\tModules: old.Allowed.Modules,\n\t\t\tDomains: old.Allowed.Domains,\n\t\t},\n\t\tBlocked: blocked,\n\t}\n}\n\nfunc toGoSecSettings(old versionone.GoSecSettings) versiontwo.GoSecSettings {\n\treturn versiontwo.GoSecSettings{\n\t\tIncludes:    old.Includes,\n\t\tExcludes:    old.Excludes,\n\t\tSeverity:    old.Severity,\n\t\tConfidence:  old.Confidence,\n\t\tConfig:      old.Config,\n\t\tConcurrency: old.Concurrency,\n\t}\n}\n\nfunc toGosmopolitanSettings(old versionone.GosmopolitanSettings) versiontwo.GosmopolitanSettings {\n\treturn versiontwo.GosmopolitanSettings{\n\t\tAllowTimeLocal:  old.AllowTimeLocal,\n\t\tEscapeHatches:   old.EscapeHatches,\n\t\tWatchForScripts: old.WatchForScripts,\n\t}\n}\n\nfunc toGovetSettings(old versionone.GovetSettings) versiontwo.GovetSettings {\n\treturn versiontwo.GovetSettings{\n\t\tGo:         old.Go,\n\t\tEnable:     old.Enable,\n\t\tDisable:    old.Disable,\n\t\tEnableAll:  old.EnableAll,\n\t\tDisableAll: old.DisableAll,\n\t\tSettings:   old.Settings,\n\t}\n}\n\nfunc toGrouperSettings(old versionone.GrouperSettings) versiontwo.GrouperSettings {\n\treturn versiontwo.GrouperSettings{\n\t\tConstRequireSingleConst:   old.ConstRequireSingleConst,\n\t\tConstRequireGrouping:      old.ConstRequireGrouping,\n\t\tImportRequireSingleImport: old.ImportRequireSingleImport,\n\t\tImportRequireGrouping:     old.ImportRequireGrouping,\n\t\tTypeRequireSingleType:     old.TypeRequireSingleType,\n\t\tTypeRequireGrouping:       old.TypeRequireGrouping,\n\t\tVarRequireSingleVar:       old.VarRequireSingleVar,\n\t\tVarRequireGrouping:        old.VarRequireGrouping,\n\t}\n}\n\nfunc toIfaceSettings(old versionone.IfaceSettings) versiontwo.IfaceSettings {\n\treturn versiontwo.IfaceSettings{\n\t\tEnable:   old.Enable,\n\t\tSettings: old.Settings,\n\t}\n}\n\nfunc toImportAsSettings(old versionone.ImportAsSettings) versiontwo.ImportAsSettings {\n\tsettings := versiontwo.ImportAsSettings{\n\t\tNoUnaliased:    old.NoUnaliased,\n\t\tNoExtraAliases: old.NoExtraAliases,\n\t}\n\n\tfor _, alias := range old.Alias {\n\t\tsettings.Alias = append(settings.Alias, versiontwo.ImportAsAlias{\n\t\t\tPkg:   alias.Pkg,\n\t\t\tAlias: alias.Alias,\n\t\t})\n\t}\n\n\treturn settings\n}\n\nfunc toINamedParamSettings(old versionone.INamedParamSettings) versiontwo.INamedParamSettings {\n\treturn versiontwo.INamedParamSettings{\n\t\tSkipSingleParam: old.SkipSingleParam,\n\t}\n}\n\nfunc toInterfaceBloatSettings(old versionone.InterfaceBloatSettings) versiontwo.InterfaceBloatSettings {\n\treturn versiontwo.InterfaceBloatSettings{\n\t\tMax: old.Max,\n\t}\n}\n\nfunc toIreturnSettings(old versionone.IreturnSettings) versiontwo.IreturnSettings {\n\treturn versiontwo.IreturnSettings{\n\t\tAllow:  old.Allow,\n\t\tReject: old.Reject,\n\t}\n}\n\nfunc toLllSettings(old versionone.LllSettings) versiontwo.LllSettings {\n\treturn versiontwo.LllSettings{\n\t\tLineLength: old.LineLength,\n\t\tTabWidth:   old.TabWidth,\n\t}\n}\n\nfunc toLoggerCheckSettings(old versionone.LoggerCheckSettings) versiontwo.LoggerCheckSettings {\n\treturn versiontwo.LoggerCheckSettings{\n\t\tKitlog:           old.Kitlog,\n\t\tKlog:             old.Klog,\n\t\tLogr:             old.Logr,\n\t\tSlog:             old.Slog,\n\t\tZap:              old.Zap,\n\t\tRequireStringKey: old.RequireStringKey,\n\t\tNoPrintfLike:     old.NoPrintfLike,\n\t\tRules:            old.Rules,\n\t}\n}\n\nfunc toMaintIdxSettings(old versionone.MaintIdxSettings) versiontwo.MaintIdxSettings {\n\treturn versiontwo.MaintIdxSettings{\n\t\tUnder: old.Under,\n\t}\n}\n\nfunc toMakezeroSettings(old versionone.MakezeroSettings) versiontwo.MakezeroSettings {\n\treturn versiontwo.MakezeroSettings{\n\t\tAlways: old.Always,\n\t}\n}\n\nfunc toMisspellSettings(old versionone.MisspellSettings) versiontwo.MisspellSettings {\n\tsettings := versiontwo.MisspellSettings{\n\t\tMode:        old.Mode,\n\t\tLocale:      old.Locale,\n\t\tIgnoreRules: old.IgnoreWords,\n\t}\n\n\tfor _, word := range old.ExtraWords {\n\t\tsettings.ExtraWords = append(settings.ExtraWords, versiontwo.MisspellExtraWords{\n\t\t\tTypo:       word.Typo,\n\t\t\tCorrection: word.Correction,\n\t\t})\n\t}\n\n\treturn settings\n}\n\nfunc toMndSettings(old versionone.MndSettings) versiontwo.MndSettings {\n\treturn versiontwo.MndSettings{\n\t\tChecks:           old.Checks,\n\t\tIgnoredNumbers:   old.IgnoredNumbers,\n\t\tIgnoredFiles:     old.IgnoredFiles,\n\t\tIgnoredFunctions: old.IgnoredFunctions,\n\t}\n}\n\nfunc toMustTagSettings(old versionone.MustTagSettings) versiontwo.MustTagSettings {\n\tsettings := versiontwo.MustTagSettings{}\n\n\tfor _, function := range old.Functions {\n\t\tsettings.Functions = append(settings.Functions, versiontwo.MustTagFunction{\n\t\t\tName:   function.Name,\n\t\t\tTag:    function.Tag,\n\t\t\tArgPos: function.ArgPos,\n\t\t})\n\t}\n\n\treturn settings\n}\n\nfunc toNakedretSettings(old versionone.NakedretSettings) versiontwo.NakedretSettings {\n\treturn versiontwo.NakedretSettings{\n\t\tMaxFuncLines: old.MaxFuncLines,\n\t}\n}\n\nfunc toNestifSettings(old versionone.NestifSettings) versiontwo.NestifSettings {\n\treturn versiontwo.NestifSettings{\n\t\tMinComplexity: old.MinComplexity,\n\t}\n}\n\nfunc toNilNilSettings(old versionone.NilNilSettings) versiontwo.NilNilSettings {\n\treturn versiontwo.NilNilSettings{\n\t\tDetectOpposite: old.DetectOpposite,\n\t\tCheckedTypes:   old.CheckedTypes,\n\t}\n}\n\nfunc toNlreturnSettings(old versionone.NlreturnSettings) versiontwo.NlreturnSettings {\n\treturn versiontwo.NlreturnSettings{\n\t\tBlockSize: old.BlockSize,\n\t}\n}\n\nfunc toNoLintLintSettings(old versionone.NoLintLintSettings) versiontwo.NoLintLintSettings {\n\treturn versiontwo.NoLintLintSettings{\n\t\tRequireExplanation: old.RequireExplanation,\n\t\tRequireSpecific:    old.RequireSpecific,\n\t\tAllowNoExplanation: old.AllowNoExplanation,\n\t\tAllowUnused:        old.AllowUnused,\n\t}\n}\n\nfunc toNoNamedReturnsSettings(old versionone.NoNamedReturnsSettings) versiontwo.NoNamedReturnsSettings {\n\treturn versiontwo.NoNamedReturnsSettings{\n\t\tReportErrorInDefer: old.ReportErrorInDefer,\n\t}\n}\n\nfunc toParallelTestSettings(old versionone.ParallelTestSettings) versiontwo.ParallelTestSettings {\n\treturn versiontwo.ParallelTestSettings{\n\t\tGo:                    nil,\n\t\tIgnoreMissing:         old.IgnoreMissing,\n\t\tIgnoreMissingSubtests: old.IgnoreMissingSubtests,\n\t}\n}\n\nfunc toPerfSprintSettings(old versionone.PerfSprintSettings) versiontwo.PerfSprintSettings {\n\treturn versiontwo.PerfSprintSettings{\n\t\tIntegerFormat: old.IntegerFormat,\n\t\tIntConversion: old.IntConversion,\n\t\tErrorFormat:   old.ErrorFormat,\n\t\tErrError:      old.ErrError,\n\t\tErrorF:        old.ErrorF,\n\t\tStringFormat:  old.StringFormat,\n\t\tSprintF1:      old.SprintF1,\n\t\tStrConcat:     old.StrConcat,\n\t\tBoolFormat:    old.BoolFormat,\n\t\tHexFormat:     old.HexFormat,\n\t}\n}\n\nfunc toPreallocSettings(old versionone.PreallocSettings) versiontwo.PreallocSettings {\n\treturn versiontwo.PreallocSettings{\n\t\tSimple:     old.Simple,\n\t\tRangeLoops: old.RangeLoops,\n\t\tForLoops:   old.ForLoops,\n\t}\n}\n\nfunc toPredeclaredSettings(old versionone.PredeclaredSettings) versiontwo.PredeclaredSettings {\n\tvar ignore []string\n\tif ptr.Deref(old.Ignore) != \"\" {\n\t\tignore = strings.Split(ptr.Deref(old.Ignore), \",\")\n\t}\n\n\treturn versiontwo.PredeclaredSettings{\n\t\tIgnore:    ignore,\n\t\tQualified: old.Qualified,\n\t}\n}\n\nfunc toPromlinterSettings(old versionone.PromlinterSettings) versiontwo.PromlinterSettings {\n\treturn versiontwo.PromlinterSettings{\n\t\tStrict:          old.Strict,\n\t\tDisabledLinters: old.DisabledLinters,\n\t}\n}\n\nfunc toProtoGetterSettings(old versionone.ProtoGetterSettings) versiontwo.ProtoGetterSettings {\n\treturn versiontwo.ProtoGetterSettings{\n\t\tSkipGeneratedBy:         old.SkipGeneratedBy,\n\t\tSkipFiles:               old.SkipFiles,\n\t\tSkipAnyGenerated:        old.SkipAnyGenerated,\n\t\tReplaceFirstArgInAppend: old.ReplaceFirstArgInAppend,\n\t}\n}\n\nfunc toReassignSettings(old versionone.ReassignSettings) versiontwo.ReassignSettings {\n\treturn versiontwo.ReassignSettings{\n\t\tPatterns: old.Patterns,\n\t}\n}\n\nfunc toRecvcheckSettings(old versionone.RecvcheckSettings) versiontwo.RecvcheckSettings {\n\treturn versiontwo.RecvcheckSettings{\n\t\tDisableBuiltin: old.DisableBuiltin,\n\t\tExclusions:     old.Exclusions,\n\t}\n}\n\nfunc toReviveSettings(old versionone.ReviveSettings) versiontwo.ReviveSettings {\n\tsettings := versiontwo.ReviveSettings{\n\t\tMaxOpenFiles:   old.MaxOpenFiles,\n\t\tConfidence:     old.Confidence,\n\t\tSeverity:       old.Severity,\n\t\tEnableAllRules: old.EnableAllRules,\n\t\tErrorCode:      old.ErrorCode,\n\t\tWarningCode:    old.WarningCode,\n\t}\n\n\tfor _, rule := range old.Rules {\n\t\tsettings.Rules = append(settings.Rules, versiontwo.ReviveRule{\n\t\t\tName:      rule.Name,\n\t\t\tArguments: rule.Arguments,\n\t\t\tSeverity:  rule.Severity,\n\t\t\tDisabled:  rule.Disabled,\n\t\t\tExclude:   rule.Exclude,\n\t\t})\n\t}\n\n\tfor _, directive := range old.Directives {\n\t\tsettings.Directives = append(settings.Directives, versiontwo.ReviveDirective{\n\t\t\tName:     directive.Name,\n\t\t\tSeverity: directive.Severity,\n\t\t})\n\t}\n\n\treturn settings\n}\n\nfunc toRowsErrCheckSettings(old versionone.RowsErrCheckSettings) versiontwo.RowsErrCheckSettings {\n\treturn versiontwo.RowsErrCheckSettings{\n\t\tPackages: old.Packages,\n\t}\n}\n\nfunc toSlogLintSettings(old versionone.SlogLintSettings) versiontwo.SlogLintSettings {\n\treturn versiontwo.SlogLintSettings{\n\t\tNoMixedArgs:    old.NoMixedArgs,\n\t\tKVOnly:         old.KVOnly,\n\t\tAttrOnly:       old.AttrOnly,\n\t\tNoGlobal:       old.NoGlobal,\n\t\tContext:        old.Context,\n\t\tStaticMsg:      old.StaticMsg,\n\t\tNoRawKeys:      old.NoRawKeys,\n\t\tKeyNamingCase:  old.KeyNamingCase,\n\t\tForbiddenKeys:  old.ForbiddenKeys,\n\t\tArgsOnSepLines: old.ArgsOnSepLines,\n\t}\n}\n\nfunc toSpancheckSettings(old versionone.SpancheckSettings) versiontwo.SpancheckSettings {\n\treturn versiontwo.SpancheckSettings{\n\t\tChecks:                   old.Checks,\n\t\tIgnoreCheckSignatures:    old.IgnoreCheckSignatures,\n\t\tExtraStartSpanSignatures: old.ExtraStartSpanSignatures,\n\t}\n}\n\nfunc toStaticCheckSettings(old versionone.LintersSettings) versiontwo.StaticCheckSettings {\n\tvar checks []string\n\n\tfor _, check := range slices.Concat(old.Staticcheck.Checks, old.Stylecheck.Checks, old.Gosimple.Checks) {\n\t\tif check == \"*\" {\n\t\t\tchecks = append(checks, \"all\")\n\t\t\tcontinue\n\t\t}\n\t\tchecks = append(checks, check)\n\t}\n\n\tchecks = Unique(checks)\n\n\tslices.SortFunc(checks, func(a, b string) int {\n\t\tif a == \"all\" {\n\t\t\treturn -1\n\t\t}\n\n\t\tif b == \"all\" {\n\t\t\treturn 1\n\t\t}\n\n\t\treturn strings.Compare(a, b)\n\t})\n\n\treturn versiontwo.StaticCheckSettings{\n\t\tChecks:                  checks,\n\t\tInitialisms:             old.Stylecheck.Initialisms,\n\t\tDotImportWhitelist:      old.Stylecheck.DotImportWhitelist,\n\t\tHTTPStatusCodeWhitelist: old.Stylecheck.HTTPStatusCodeWhitelist,\n\t}\n}\n\nfunc toTagAlignSettings(old versionone.TagAlignSettings) versiontwo.TagAlignSettings {\n\treturn versiontwo.TagAlignSettings{\n\t\tAlign:  old.Align,\n\t\tSort:   old.Sort,\n\t\tOrder:  old.Order,\n\t\tStrict: old.Strict,\n\t}\n}\n\nfunc toTagliatelleSettings(old versionone.TagliatelleSettings) versiontwo.TagliatelleSettings {\n\ttcase := versiontwo.TagliatelleCase{\n\t\tTagliatelleBase: versiontwo.TagliatelleBase{\n\t\t\tRules:         old.Case.Rules,\n\t\t\tUseFieldName:  old.Case.UseFieldName,\n\t\t\tIgnoredFields: old.Case.IgnoredFields,\n\t\t},\n\t\tOverrides: []versiontwo.TagliatelleOverrides{},\n\t}\n\n\tfor k, rule := range old.Case.ExtendedRules {\n\t\tif tcase.ExtendedRules == nil {\n\t\t\ttcase.ExtendedRules = make(map[string]versiontwo.TagliatelleExtendedRule)\n\t\t}\n\n\t\ttcase.ExtendedRules[k] = versiontwo.TagliatelleExtendedRule{\n\t\t\tCase:                rule.Case,\n\t\t\tExtraInitialisms:    rule.ExtraInitialisms,\n\t\t\tInitialismOverrides: rule.InitialismOverrides,\n\t\t}\n\t}\n\n\treturn versiontwo.TagliatelleSettings{Case: tcase}\n}\n\nfunc toTestifylintSettings(old versionone.TestifylintSettings) versiontwo.TestifylintSettings {\n\treturn versiontwo.TestifylintSettings{\n\t\tEnableAll:        old.EnableAll,\n\t\tDisableAll:       old.DisableAll,\n\t\tEnabledCheckers:  old.EnabledCheckers,\n\t\tDisabledCheckers: old.DisabledCheckers,\n\t\tBoolCompare: versiontwo.TestifylintBoolCompare{\n\t\t\tIgnoreCustomTypes: old.BoolCompare.IgnoreCustomTypes,\n\t\t},\n\t\tExpectedActual: versiontwo.TestifylintExpectedActual{\n\t\t\tExpVarPattern: old.ExpectedActual.ExpVarPattern,\n\t\t},\n\t\tFormatter: versiontwo.TestifylintFormatter{\n\t\t\tCheckFormatString: old.Formatter.CheckFormatString,\n\t\t\tRequireFFuncs:     old.Formatter.RequireFFuncs,\n\t\t},\n\t\tGoRequire: versiontwo.TestifylintGoRequire{\n\t\t\tIgnoreHTTPHandlers: old.GoRequire.IgnoreHTTPHandlers,\n\t\t},\n\t\tRequireError: versiontwo.TestifylintRequireError{\n\t\t\tFnPattern: old.RequireError.FnPattern,\n\t\t},\n\t\tSuiteExtraAssertCall: versiontwo.TestifylintSuiteExtraAssertCall{\n\t\t\tMode: old.SuiteExtraAssertCall.Mode,\n\t\t},\n\t}\n}\n\nfunc toTestpackageSettings(old versionone.TestpackageSettings) versiontwo.TestpackageSettings {\n\treturn versiontwo.TestpackageSettings{\n\t\tSkipRegexp:    old.SkipRegexp,\n\t\tAllowPackages: old.AllowPackages,\n\t}\n}\n\nfunc toThelperSettings(old versionone.ThelperSettings) versiontwo.ThelperSettings {\n\treturn versiontwo.ThelperSettings{\n\t\tTest: versiontwo.ThelperOptions{\n\t\t\tFirst: old.Test.First,\n\t\t\tName:  old.Test.Name,\n\t\t\tBegin: old.Test.Begin,\n\t\t},\n\t\tFuzz: versiontwo.ThelperOptions{\n\t\t\tFirst: old.Fuzz.First,\n\t\t\tName:  old.Fuzz.Name,\n\t\t\tBegin: old.Fuzz.Begin,\n\t\t},\n\t\tBenchmark: versiontwo.ThelperOptions{\n\t\t\tFirst: old.Benchmark.First,\n\t\t\tName:  old.Benchmark.Name,\n\t\t\tBegin: old.Benchmark.Begin,\n\t\t},\n\t\tTB: versiontwo.ThelperOptions{\n\t\t\tFirst: old.TB.First,\n\t\t\tName:  old.TB.Name,\n\t\t\tBegin: old.TB.Begin,\n\t\t},\n\t}\n}\n\nfunc toUnconvertSettings(old versionone.UnconvertSettings) versiontwo.UnconvertSettings {\n\treturn versiontwo.UnconvertSettings{\n\t\tFastMath: old.FastMath,\n\t\tSafe:     old.Safe,\n\t}\n}\n\nfunc toUnparamSettings(old versionone.UnparamSettings) versiontwo.UnparamSettings {\n\treturn versiontwo.UnparamSettings{\n\t\tCheckExported: old.CheckExported,\n\t}\n}\n\nfunc toUnusedSettings(old versionone.UnusedSettings) versiontwo.UnusedSettings {\n\treturn versiontwo.UnusedSettings{\n\t\tFieldWritesAreUses:     old.FieldWritesAreUses,\n\t\tPostStatementsAreReads: old.PostStatementsAreReads,\n\t\tExportedFieldsAreUsed:  old.ExportedFieldsAreUsed,\n\t\tParametersAreUsed:      old.ParametersAreUsed,\n\t\tLocalVariablesAreUsed:  old.LocalVariablesAreUsed,\n\t\tGeneratedIsUsed:        old.GeneratedIsUsed,\n\t}\n}\n\nfunc toUseStdlibVarsSettings(old versionone.UseStdlibVarsSettings) versiontwo.UseStdlibVarsSettings {\n\treturn versiontwo.UseStdlibVarsSettings{\n\t\tHTTPMethod:         old.HTTPMethod,\n\t\tHTTPStatusCode:     old.HTTPStatusCode,\n\t\tTimeWeekday:        old.TimeWeekday,\n\t\tTimeMonth:          old.TimeMonth,\n\t\tTimeLayout:         old.TimeLayout,\n\t\tCryptoHash:         old.CryptoHash,\n\t\tDefaultRPCPath:     old.DefaultRPCPath,\n\t\tSQLIsolationLevel:  old.SQLIsolationLevel,\n\t\tTLSSignatureScheme: old.TLSSignatureScheme,\n\t\tConstantKind:       old.ConstantKind,\n\t}\n}\n\nfunc toUseTestingSettings(old versionone.UseTestingSettings) versiontwo.UseTestingSettings {\n\treturn versiontwo.UseTestingSettings{\n\t\tContextBackground: old.ContextBackground,\n\t\tContextTodo:       old.ContextTodo,\n\t\tOSChdir:           old.OSChdir,\n\t\tOSMkdirTemp:       old.OSMkdirTemp,\n\t\tOSSetenv:          old.OSSetenv,\n\t\tOSTempDir:         old.OSTempDir,\n\t\tOSCreateTemp:      old.OSCreateTemp,\n\t}\n}\n\nfunc toVarnamelenSettings(old versionone.VarnamelenSettings) versiontwo.VarnamelenSettings {\n\treturn versiontwo.VarnamelenSettings{\n\t\tMaxDistance:        old.MaxDistance,\n\t\tMinNameLength:      old.MinNameLength,\n\t\tCheckReceiver:      old.CheckReceiver,\n\t\tCheckReturn:        old.CheckReturn,\n\t\tCheckTypeParam:     old.CheckTypeParam,\n\t\tIgnoreNames:        old.IgnoreNames,\n\t\tIgnoreTypeAssertOk: old.IgnoreTypeAssertOk,\n\t\tIgnoreMapIndexOk:   old.IgnoreMapIndexOk,\n\t\tIgnoreChanRecvOk:   old.IgnoreChanRecvOk,\n\t\tIgnoreDecls:        old.IgnoreDecls,\n\t}\n}\n\nfunc toWhitespaceSettings(old versionone.WhitespaceSettings) versiontwo.WhitespaceSettings {\n\treturn versiontwo.WhitespaceSettings{\n\t\tMultiIf:   old.MultiIf,\n\t\tMultiFunc: old.MultiFunc,\n\t}\n}\n\nfunc toWrapcheckSettings(old versionone.WrapcheckSettings) versiontwo.WrapcheckSettings {\n\treturn versiontwo.WrapcheckSettings{\n\t\tExtraIgnoreSigs:        old.ExtraIgnoreSigs,\n\t\tIgnoreSigs:             old.IgnoreSigs,\n\t\tIgnoreSigRegexps:       old.IgnoreSigRegexps,\n\t\tIgnorePackageGlobs:     old.IgnorePackageGlobs,\n\t\tIgnoreInterfaceRegexps: old.IgnoreInterfaceRegexps,\n\t}\n}\n\nfunc toWSLSettings(old versionone.WSLSettings) versiontwo.WSLv4Settings {\n\treturn versiontwo.WSLv4Settings{\n\t\tStrictAppend:                     old.StrictAppend,\n\t\tAllowAssignAndCallCuddle:         old.AllowAssignAndCallCuddle,\n\t\tAllowAssignAndAnythingCuddle:     old.AllowAssignAndAnythingCuddle,\n\t\tAllowMultiLineAssignCuddle:       old.AllowMultiLineAssignCuddle,\n\t\tForceCaseTrailingWhitespaceLimit: old.ForceCaseTrailingWhitespaceLimit,\n\t\tAllowTrailingComment:             old.AllowTrailingComment,\n\t\tAllowSeparatedLeadingComment:     old.AllowSeparatedLeadingComment,\n\t\tAllowCuddleDeclaration:           old.AllowCuddleDeclaration,\n\t\tAllowCuddleWithCalls:             old.AllowCuddleWithCalls,\n\t\tAllowCuddleWithRHS:               old.AllowCuddleWithRHS,\n\t\tForceCuddleErrCheckAndAssign:     old.ForceCuddleErrCheckAndAssign,\n\t\tErrorVariableNames:               old.ErrorVariableNames,\n\t\tForceExclusiveShortDeclarations:  old.ForceExclusiveShortDeclarations,\n\t}\n}\n\nfunc toCustom(old map[string]versionone.CustomLinterSettings) map[string]versiontwo.CustomLinterSettings {\n\tif old == nil {\n\t\treturn nil\n\t}\n\n\tsettings := map[string]versiontwo.CustomLinterSettings{}\n\n\tfor k, s := range old {\n\t\tsettings[k] = versiontwo.CustomLinterSettings{\n\t\t\tType:        s.Type,\n\t\t\tPath:        s.Path,\n\t\t\tDescription: s.Description,\n\t\t\tOriginalURL: s.OriginalURL,\n\t\t\tSettings:    s.Settings,\n\t\t}\n\t}\n\n\treturn settings\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_output.go",
    "content": "package migrate\n\nimport (\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc toOutput(old *versionone.Config) versiontwo.Output {\n\tformats := versiontwo.Formats{}\n\n\toldFormats := cleanIncompatibleFormats(old.Output.Formats, \"colored-line-number\", \"line-number\")\n\toldFormats = cleanIncompatibleFormats(oldFormats, \"colored-tab\", \"tab\")\n\toldFormats = cleanIncompatibleFormats(oldFormats, \"junit-xml-extended\", \"junit-xml\")\n\n\tfor _, format := range oldFormats {\n\t\tswitch ptr.Deref(format.Format) {\n\t\tcase \"colored-line-number\":\n\t\t\tformats.Text.PrintLinterName = old.Output.PrintLinterName\n\t\t\tformats.Text.PrintIssuedLine = old.Output.PrintIssuedLine\n\t\t\tformats.Text.Colors = nil // color is true by default (flags).\n\t\t\tformats.Text.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"line-number\":\n\t\t\tformats.Text.PrintLinterName = old.Output.PrintLinterName\n\t\t\tformats.Text.PrintIssuedLine = old.Output.PrintIssuedLine\n\t\t\tformats.Text.Colors = ptr.Pointer(false)\n\t\t\tformats.Text.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"json\":\n\t\t\tformats.JSON.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"colored-tab\":\n\t\t\tformats.Tab.PrintLinterName = old.Output.PrintLinterName\n\t\t\tformats.Tab.Colors = nil // Colors is true by default (flags).\n\t\t\tformats.Tab.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"tab\":\n\t\t\tformats.Tab.PrintLinterName = old.Output.PrintLinterName\n\t\t\tformats.Tab.Colors = ptr.Pointer(false)\n\t\t\tformats.Tab.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"html\":\n\t\t\tformats.HTML.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"checkstyle\":\n\t\t\tformats.Checkstyle.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"code-climate\":\n\t\t\tformats.CodeClimate.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"junit-xml\":\n\t\t\tformats.JUnitXML.Extended = nil // Extended is false by default.\n\t\t\tformats.JUnitXML.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"junit-xml-extended\":\n\t\t\tformats.JUnitXML.Extended = ptr.Pointer(true)\n\t\t\tformats.JUnitXML.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"github-actions\":\n\t\t\t// Ignored\n\n\t\tcase \"teamcity\":\n\t\t\tformats.TeamCity.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\n\t\tcase \"sarif\":\n\t\t\tformats.Sarif.Path = ptr.Pointer(defaultFormatPath(ptr.Deref(format.Path)))\n\t\t}\n\t}\n\n\treturn versiontwo.Output{\n\t\tFormats:    formats,\n\t\tSortOrder:  old.Output.SortOrder,\n\t\tPathPrefix: old.Output.PathPrefix,\n\t\tShowStats:  nil, // Enforce the new default. (nil -> omitempty -> true)\n\t}\n}\n\nfunc defaultFormatPath(p string) string {\n\tif p == \"\" {\n\t\treturn \"stdout\"\n\t}\n\n\treturn p\n}\n\nfunc cleanIncompatibleFormats(old versionone.OutputFormats, f1, f2 string) versionone.OutputFormats {\n\tindex1 := slices.IndexFunc(old, func(format versionone.OutputFormat) bool {\n\t\treturn ptr.Deref(format.Format) == f1\n\t})\n\n\tindex2 := slices.IndexFunc(old, func(format versionone.OutputFormat) bool {\n\t\treturn ptr.Deref(format.Format) == f2\n\t})\n\n\tif index1 >= 0 && index2 >= 0 {\n\t\treturn slices.Delete(old, index2, index2+1)\n\t}\n\n\treturn old\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_run.go",
    "content": "package migrate\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc toRun(old *versionone.Config) versiontwo.Run {\n\tvar relativePathMode *string\n\tif ptr.Deref(old.Run.RelativePathMode) != \"cfg\" {\n\t\t// cfg is the new default.\n\t\trelativePathMode = old.Run.RelativePathMode\n\t}\n\n\tvar concurrency *int\n\tif ptr.Deref(old.Run.Concurrency) != 0 {\n\t\t// 0 is the new default\n\t\tconcurrency = old.Run.Concurrency\n\t}\n\n\treturn versiontwo.Run{\n\t\tTimeout:               0, // Enforce new default.\n\t\tConcurrency:           concurrency,\n\t\tGo:                    old.Run.Go,\n\t\tRelativePathMode:      relativePathMode,\n\t\tBuildTags:             old.Run.BuildTags,\n\t\tModulesDownloadMode:   old.Run.ModulesDownloadMode,\n\t\tExitCodeIfIssuesFound: old.Run.ExitCodeIfIssuesFound,\n\t\tAnalyzeTests:          old.Run.AnalyzeTests,\n\t\tAllowParallelRunners:  old.Run.AllowParallelRunners,\n\t\tAllowSerialRunners:    old.Run.AllowSerialRunners,\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_severity.go",
    "content": "package migrate\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versiontwo\"\n)\n\nfunc toSeverity(old *versionone.Config) versiontwo.Severity {\n\tvar rules []versiontwo.SeverityRule\n\n\tfor _, rule := range old.Severity.Rules {\n\t\tnames := convertStaticcheckLinterNames(convertAlternativeNames(rule.Linters))\n\t\tif len(rule.Linters) > 0 && len(names) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\trules = append(rules, versiontwo.SeverityRule{\n\t\t\tBaseRule: versiontwo.BaseRule{\n\t\t\t\tLinters:    names,\n\t\t\t\tPath:       rule.Path,\n\t\t\t\tPathExcept: rule.PathExcept,\n\t\t\t\tText:       rule.Text,\n\t\t\t\tSource:     rule.Source,\n\t\t\t},\n\t\t\tSeverity: rule.Severity,\n\t\t})\n\t}\n\n\treturn versiontwo.Severity{\n\t\tDefault: old.Severity.Default,\n\t\tRules:   rules,\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/migrate_test.go",
    "content": "package migrate\n\nimport (\n\t\"bytes\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/fakeloader\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/parser\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n)\n\ntype fakeFile struct {\n\tbytes.Buffer\n\tname string\n}\n\nfunc newFakeFile(name string) *fakeFile {\n\treturn &fakeFile{name: name}\n}\n\nfunc (f *fakeFile) Name() string {\n\treturn f.name\n}\n\nfunc TestToConfig(t *testing.T) {\n\tvar testFiles []string\n\n\terr := filepath.WalkDir(\"testdata\", func(path string, d fs.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif d.IsDir() {\n\t\t\treturn nil\n\t\t}\n\n\t\tif strings.Contains(path, \".golden.\") {\n\t\t\treturn nil\n\t\t}\n\n\t\ttestFiles = append(testFiles, path)\n\n\t\treturn nil\n\t})\n\n\trequire.NoError(t, err)\n\n\tfor _, fileIn := range testFiles {\n\t\tt.Run(fileIn, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\text := filepath.Ext(fileIn)\n\t\t\tfileGolden := strings.TrimSuffix(fileIn, ext) + \".golden\" + ext\n\n\t\t\ttestFile(t, fileIn, fileGolden, false)\n\t\t})\n\t}\n}\n\nfunc testFile(t *testing.T, in, golden string, update bool) {\n\tt.Helper()\n\n\told := versionone.NewConfig()\n\n\t// Fake load of the configuration.\n\t// IMPORTANT: The default values from flags are not set.\n\terr := fakeloader.Load(in, old)\n\trequire.NoError(t, err)\n\n\tif update {\n\t\tupdateGolden(t, golden, old)\n\t}\n\n\tbuf := newFakeFile(\"test\" + filepath.Ext(golden))\n\n\terr = parser.Encode(ToConfig(old), buf)\n\trequire.NoError(t, err)\n\n\texpected, err := os.ReadFile(golden)\n\trequire.NoError(t, err)\n\n\tswitch filepath.Ext(golden) {\n\tcase \".yml\":\n\t\tassert.YAMLEq(t, string(expected), buf.String())\n\tcase \".json\":\n\t\tassert.JSONEq(t, string(expected), buf.String())\n\tcase \".toml\":\n\t\tassert.Equal(t, string(expected), buf.String())\n\tdefault:\n\t\trequire.Failf(t, \"unsupported extension: %s\", golden)\n\t}\n}\n\nfunc updateGolden(t *testing.T, golden string, old *versionone.Config) {\n\tt.Helper()\n\n\tfileOut, err := os.Create(golden)\n\trequire.NoError(t, err)\n\n\tdefer func() {\n\t\t_ = fileOut.Close()\n\t}()\n\n\terr = parser.Encode(ToConfig(old), fileOut)\n\trequire.NoError(t, err)\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/parser/parser.go",
    "content": "package parser\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/pelletier/go-toml/v2\"\n\t\"go.yaml.in/yaml/v3\"\n)\n\ntype File interface {\n\tio.ReadWriter\n\tName() string\n}\n\n// Decode decodes a file into data.\n// The choice of the decoder is based on the file extension.\nfunc Decode(file File, data any) error {\n\text := filepath.Ext(file.Name())\n\n\tswitch strings.ToLower(ext) {\n\tcase \".yaml\", \".yml\", \".json\":\n\t\terr := yaml.NewDecoder(file).Decode(data)\n\t\tif err != nil && !errors.Is(err, io.EOF) {\n\t\t\treturn fmt.Errorf(\"YAML decode file %s: %w\", file.Name(), err)\n\t\t}\n\n\tcase \".toml\":\n\t\terr := toml.NewDecoder(file).Decode(&data)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"TOML decode file %s: %w\", file.Name(), err)\n\t\t}\n\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported file type: %s\", ext)\n\t}\n\n\treturn nil\n}\n\n// Encode encodes data into a file.\n// The choice of the encoder is based on the file extension.\nfunc Encode(data any, dstFile File) error {\n\text := filepath.Ext(dstFile.Name())\n\n\tswitch strings.ToLower(ext) {\n\tcase \".yml\", \".yaml\":\n\t\tencoder := yaml.NewEncoder(dstFile)\n\t\tencoder.SetIndent(2)\n\n\t\treturn encoder.Encode(data)\n\n\tcase \".toml\":\n\t\tencoder := toml.NewEncoder(dstFile)\n\n\t\treturn encoder.Encode(data)\n\n\tcase \".json\":\n\t\t// The JSON encoder converts empty struct to `{}` instead of nothing (even with omitempty JSON struct tags).\n\t\t// So we need to use the YAML encoder as bridge to create JSON file.\n\n\t\tvar buf bytes.Buffer\n\t\terr := yaml.NewEncoder(&buf).Encode(data)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\traw := map[string]any{}\n\t\terr = yaml.NewDecoder(&buf).Decode(raw)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tencoder := json.NewEncoder(dstFile)\n\t\tencoder.SetIndent(\"\", \"  \")\n\n\t\treturn encoder.Encode(raw)\n\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported file type: %s\", ext)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/ptr/ptr.go",
    "content": "package ptr\n\nfunc Deref[T any](v *T) T {\n\tif v == nil {\n\t\tvar zero T\n\t\treturn zero\n\t}\n\n\treturn *v\n}\n\nfunc Pointer[T any](v T) *T { return &v }\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/json/empty.golden.json",
    "content": "{\n  \"formatters\": {\n    \"exclusions\": {\n      \"generated\": \"lax\",\n      \"paths\": [\n        \"third_party$\",\n        \"builtin$\",\n        \"examples$\"\n      ]\n    }\n  },\n  \"linters\": {\n    \"exclusions\": {\n      \"generated\": \"lax\",\n      \"paths\": [\n        \"third_party$\",\n        \"builtin$\",\n        \"examples$\"\n      ],\n      \"presets\": [\n        \"comments\",\n        \"common-false-positives\",\n        \"legacy\",\n        \"std-error-handling\"\n      ]\n    }\n  },\n  \"version\": \"2\"\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/json/empty.json",
    "content": ""
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/toml/empty.golden.toml",
    "content": "version = '2'\n\n[linters]\n[linters.exclusions]\ngenerated = 'lax'\npresets = [\n  'comments',\n  'common-false-positives',\n  'legacy',\n  'std-error-handling'\n]\npaths = [\n  'third_party$',\n  'builtin$',\n  'examples$'\n]\n\n[formatters]\n[formatters.exclusions]\ngenerated = 'lax'\npaths = [\n  'third_party$',\n  'builtin$',\n  'examples$'\n]\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/toml/empty.toml",
    "content": ""
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/toml/linters-settings_goheader.golden.toml",
    "content": "version = '2'\n\n[linters]\n[linters.settings]\n[linters.settings.goheader]\ntemplate = \"\"\"\nPut here copyright header template for source code files\nFor example:\nNote: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.\n\n{{ AUTHOR }} {{ COMPANY }} {{ YEAR }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \\\"License\\\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \\\"AS IS\\\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\n\"\"\"\ntemplate-path = '/path/to/my/template.tmpl'\n\n[linters.settings.goheader.values]\n[linters.settings.goheader.values.const]\nCOMPANY = 'MY COMPANY'\n\n[linters.settings.goheader.values.regexp]\nAUTHOR = '.*@mycompany\\.com'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/toml/linters-settings_goheader.toml",
    "content": "[issues]\n# Only to not generate unrelated elements inside golden.\nexclude-use-default = false\n# Only to not generate unrelated elements inside golden.\nexclude-generated = \"strict\"\n# Only to not generate unrelated elements inside golden.\nexclude-dirs-use-default = false\n\n[linters-settings]\n\n[linters-settings.goheader]\ntemplate = \"\"\"\nPut here copyright header template for source code files\nFor example:\nNote: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.\n\n{{ AUTHOR }} {{ COMPANY }} {{ YEAR }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\n\"\"\"\ntemplate-path = \"/path/to/my/template.tmpl\"\n\n[linters-settings.goheader.values]\n\n[linters-settings.goheader.values.const]\nCOMPANY = \"MY COMPANY\"\n\n[linters-settings.goheader.values.regexp]\nAUTHOR = \".*@mycompany\\\\.com\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/empty.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    generated: lax\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\nformatters:\n  exclusions:\n    generated: lax\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/empty.yml",
    "content": ""
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_01_a.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    paths:\n      - .*\\.my\\.go$\n      - lib/bad.go\n      - src/external_libs\n      - autogenerated_by_my_lib\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_01_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-dirs:\n    - src/external_libs\n    - autogenerated_by_my_lib\n  exclude-files:\n    - \".*\\\\.my\\\\.go$\"\n    - lib/bad.go\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_01_b.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    paths:\n      - .*\\.my\\.go$\n      - lib/bad.go\n      - src/external_libs\n      - autogenerated_by_my_lib\nformatters:\n  enable:\n    - gofmt\n  exclusions:\n    paths:\n      - .*\\.my\\.go$\n      - lib/bad.go\n      - src/external_libs\n      - autogenerated_by_my_lib\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_01_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-dirs:\n    - src/external_libs\n    - autogenerated_by_my_lib\n  exclude-files:\n    - \".*\\\\.my\\\\.go$\"\n    - lib/bad.go\n\nlinters:\n  enable:\n    - gofmt\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_02_a.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    rules:\n      - path: (.+)\\.go$\n        text: abcdef\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_02_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-case-sensitive: false\n  exclude:\n    - abcdef\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_02_b.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    rules:\n      - path: (.+)\\.go$\n        text: (?i)abcdef\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_02_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-case-sensitive: true\n  exclude:\n    - abcdef\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_04_a.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    rules:\n      - linters:\n          - dupl\n          - errcheck\n          - gocyclo\n          - gosec\n        path: _test\\.go\n      - linters:\n          - staticcheck\n        path-except: _test\\.go\n      - linters:\n          - gosec\n        path: internal/hmac/\n        text: weak cryptographic primitive\n      - linters:\n          - staticcheck\n        text: 'SA9003:'\n      - linters:\n          - staticcheck\n        text: 'ST1006:'\n      - linters:\n          - staticcheck\n        text: 'S1033:'\n      - linters:\n          - lll\n        source: '^//go:generate '\n      - linters:\n          - err113\n        source: foo\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_04_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-case-sensitive: false\n  exclude-rules:\n    - path: _test\\.go\n      linters:\n        - gocyclo\n        - errcheck\n        - dupl\n        - gosec\n\n    - path-except: _test\\.go\n      linters:\n        - staticcheck\n        - stylecheck\n        - gosimple\n\n    - path: internal/hmac/\n      text: \"weak cryptographic primitive\"\n      linters:\n        - gosec\n\n    - linters:\n        - staticcheck\n      text: \"SA9003:\"\n\n    - linters:\n        - stylecheck\n      text: \"ST1006:\"\n\n    - linters:\n        - gosimple\n      text: \"S1033:\"\n\n    - linters:\n        - lll\n      source: \"^//go:generate \"\n\n    - linters:\n        - goerr113\n      source: \"foo\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_04_b.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    rules:\n      - linters:\n          - dupl\n          - errcheck\n          - gocyclo\n          - gosec\n        path: _test\\.go\n      - linters:\n          - staticcheck\n        path-except: _test\\.go\n      - linters:\n          - gosec\n        path: internal/hmac/\n        text: (?i)weak cryptographic primitive\n      - linters:\n          - staticcheck\n        text: '(?i)SA9003:'\n      - linters:\n          - staticcheck\n        text: '(?i)ST1006:'\n      - linters:\n          - staticcheck\n        text: '(?i)S1033:'\n      - linters:\n          - lll\n        source: '(?i)^//go:generate '\n      - linters:\n          - err113\n        source: (?i)foo\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_04_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-case-sensitive: true\n  exclude-rules:\n    - path: _test\\.go\n      linters:\n        - gocyclo\n        - errcheck\n        - dupl\n        - gosec\n\n    - path-except: _test\\.go\n      linters:\n        - staticcheck\n        - stylecheck\n        - gosimple\n\n    - path: internal/hmac/\n      text: \"weak cryptographic primitive\"\n      linters:\n        - gosec\n\n    - linters:\n        - staticcheck\n      text: \"SA9003:\"\n\n    - linters:\n        - stylecheck\n      text: \"ST1006:\"\n\n    - linters:\n        - gosimple\n      text: \"S1033:\"\n\n    - linters:\n        - lll\n      source: \"^//go:generate \"\n\n    - linters:\n        - goerr113\n      source: \"foo\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_04_c.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_04_c.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-case-sensitive: true\n\n  exclude-rules:\n    - path: _test\\.go\n      linters:\n        - typecheck\n\n    - path-except: _test\\.go\n      linters:\n        - typecheck\n\n    - path: internal/hmac/\n      text: \"weak cryptographic primitive\"\n      linters:\n        - typecheck\n\n    - linters:\n        - typecheck\n      text: \"SA9003:\"\n\n    - linters:\n        - typecheck\n      source: \"foo\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_05_a.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_05_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-generated: strict\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_05_b.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    generated: disable\nformatters:\n  exclusions:\n    generated: disable\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_05_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-generated: disable\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_05_c.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    generated: lax\nformatters:\n  exclusions:\n    generated: lax\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_05_c.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-generated: lax\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_a.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-use-default: false\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_b.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-use-default: true\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_c.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_c.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-use-default: true\n  # all\n  include:\n    - EXC0001\n    - EXC0002\n    - EXC0003\n    - EXC0004\n    - EXC0005\n    - EXC0006\n    - EXC0007\n    - EXC0008\n    - EXC0009\n    - EXC0010\n    - EXC0011\n    - EXC0012\n    - EXC0013\n    - EXC0014\n    - EXC0015\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_d.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    presets:\n      - common-false-positives\n      - legacy\n      - std-error-handling\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_d.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-use-default: true\n  # Related to comments\n  include:\n    - EXC0014\n    - EXC0015\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_e.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    presets:\n      - comments\n      - common-false-positives\n      - std-error-handling\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_e.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-use-default: true\n  # Related to legacy\n  include:\n    - EXC0005\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_f.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_f.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-use-default: true\n  # Related to std-error-handling\n  include:\n    - EXC0001\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_g.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    presets:\n      - comments\n      - legacy\n      - std-error-handling\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_g.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-use-default: true\n  # Related to common-false-positives\n  include:\n    - EXC0006\n    - EXC0007\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_h.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_06_h.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_07_a.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\nformatters:\n  exclusions:\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_07_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n\n  exclude-dirs-use-default: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_07_b.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: none\n  exclusions:\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\nformatters:\n  enable:\n    - goimports\n  exclusions:\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_07_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n\n  exclude-dirs-use-default: true\n\nlinters:\n  disable-all: true\n  enable:\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_08_a.golden.yml",
    "content": "version: \"2\"\nissues:\n  max-issues-per-linter: 0\n  max-same-issues: 0\n  uniq-by-line: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_08_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  max-issues-per-linter: 0\n  max-same-issues: 0\n  uniq-by-line: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_08_b.golden.yml",
    "content": "version: \"2\"\nissues:\n  max-issues-per-linter: 66\n  uniq-by-line: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_08_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  max-issues-per-linter: 66\n  uniq-by-line: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_09_a.golden.yml",
    "content": "version: \"2\"\nissues:\n  new-from-rev: HEAD\n  new-from-merge-base: main\n  new-from-patch: path/to/patch/file\n  whole-files: true\n  new: true\n  fix: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_09_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  new: true\n  new-from-merge-base: main\n  new-from-rev: HEAD\n  new-from-patch: path/to/patch/file\n  whole-files: true\n  fix: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_09_b.golden.yml",
    "content": "version: \"2\"\nissues:\n  new-from-rev: \"\"\n  new-from-merge-base: \"\"\n  new-from-patch: \"\"\n  whole-files: false\n  new: false\n  fix: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_09_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  new: false\n  new-from-merge-base: ''\n  new-from-rev: ''\n  new-from-patch: ''\n  whole-files: false\n  fix: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_10.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: none\nformatters:\n  enable:\n    - goimports\n  exclusions:\n    paths:\n      - \\.(generated\\.deepcopy|pb)\\.go$\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/issues_10.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n  exclude-rules:\n    - path: \"\\\\.(generated\\\\.deepcopy|pb)\\\\.go$\"\n      linters:\n        - goimports\n\nlinters:\n  disable-all: true\n  enable:\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_asasalint.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    asasalint:\n      exclude:\n        - Append\n        - \\.Wrapf\n      use-builtin-exclusions: false\n  exclusions:\n    rules:\n      - linters:\n          - asasalint\n        path: (.+)_test\\.go\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_asasalint.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  asasalint:\n    exclude:\n      - Append\n      - \\.Wrapf\n    use-builtin-exclusions: false\n    ignore-test: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_bidichk.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    bidichk:\n      left-to-right-embedding: true\n      right-to-left-embedding: false\n      pop-directional-formatting: false\n      left-to-right-override: false\n      right-to-left-override: false\n      left-to-right-isolate: false\n      right-to-left-isolate: false\n      first-strong-isolate: false\n      pop-directional-isolate: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_bidichk.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  bidichk:\n    left-to-right-embedding: true\n    right-to-left-embedding: false\n    pop-directional-formatting: false\n    left-to-right-override: false\n    right-to-left-override: false\n    left-to-right-isolate: false\n    right-to-left-isolate: false\n    first-strong-isolate: false\n    pop-directional-isolate: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_copyloopvar.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    copyloopvar:\n      check-alias: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_copyloopvar.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  copyloopvar:\n    check-alias: true\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_custom.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    custom:\n      example:\n        type: module\n        path: /path/to/example.so\n        description: This is an example usage of a plugin linter.\n        original-url: github.com/golangci/example-linter\n        settings:\n          foo: bar\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_custom.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  custom:\n    example:\n      type: module\n      path: /path/to/example.so\n      description: This is an example usage of a plugin linter.\n      original-url: github.com/golangci/example-linter\n      settings:\n        foo: bar\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_cyclop.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    cyclop:\n      max-complexity: 10\n      package-average: 0.5\n  exclusions:\n    rules:\n      - linters:\n          - cyclop\n        path: (.+)_test\\.go\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_cyclop.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  cyclop:\n    max-complexity: 10\n    package-average: 0.5\n    skip-tests: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_decorder.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    decorder:\n      dec-order:\n        - type\n        - const\n        - var\n        - func\n      ignore-underscore-vars: false\n      disable-dec-num-check: false\n      disable-type-dec-num-check: false\n      disable-const-dec-num-check: false\n      disable-var-dec-num-check: false\n      disable-dec-order-check: false\n      disable-init-func-first-check: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_decorder.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  decorder:\n    dec-order:\n      - type\n      - const\n      - var\n      - func\n    ignore-underscore-vars: false\n    disable-dec-order-check: false\n    disable-init-func-first-check: false\n    disable-dec-num-check: false\n    disable-type-dec-num-check: false\n    disable-const-dec-num-check: false\n    disable-var-dec-num-check: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_depguard.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    depguard:\n      rules:\n        main:\n          list-mode: lax\n          files:\n            - '!**/*_a _file.go'\n          allow:\n            - $gostd\n            - github.com/OpenPeeDeeP\n          deny:\n            - pkg: math/rand$\n              desc: use math/rand/v2\n            - pkg: github.com/sirupsen/logrus\n              desc: not allowed\n            - pkg: github.com/pkg/errors\n              desc: Should be replaced by standard lib errors package\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_depguard.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  depguard:\n    rules:\n      main:\n        list-mode: lax\n        files:\n          - \"!**/*_a _file.go\"\n        allow:\n          - $gostd\n          - github.com/OpenPeeDeeP\n        deny:\n          - pkg: \"math/rand$\"\n            desc: use math/rand/v2\n          - pkg: \"github.com/sirupsen/logrus\"\n            desc: not allowed\n          - pkg: \"github.com/pkg/errors\"\n            desc: Should be replaced by standard lib errors package\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_dogsled.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    dogsled:\n      max-blank-identifiers: 3\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_dogsled.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  dogsled:\n    max-blank-identifiers: 3\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_dupl.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    dupl:\n      threshold: 100\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_dupl.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  dupl:\n    threshold: 100\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_dupword.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    dupword:\n      keywords:\n        - the\n        - and\n        - a\n      ignore:\n        - 0C0C\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_dupword.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  dupword:\n    keywords:\n      - \"the\"\n      - \"and\"\n      - \"a\"\n    ignore:\n      - \"0C0C\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_errcheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    errcheck:\n      disable-default-exclusions: true\n      check-type-assertions: true\n      check-blank: true\n      exclude-functions:\n        - io/ioutil.ReadFile\n        - io.Copy(*bytes.Buffer)\n        - io.Copy(os.Stdout)\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_errcheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  errcheck:\n    check-type-assertions: true\n    check-blank: true\n    disable-default-exclusions: true\n    exclude-functions:\n      - io/ioutil.ReadFile\n      - io.Copy(*bytes.Buffer)\n      - io.Copy(os.Stdout)\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_errchkjson.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    errchkjson:\n      check-error-free-encoding: true\n      report-no-exported: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_errchkjson.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  errchkjson:\n    check-error-free-encoding: true\n    report-no-exported: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_errorlint.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    errorlint:\n      errorf: false\n      errorf-multi: false\n      asserts: false\n      comparison: false\n      allowed-errors:\n        - err: io.EOF\n          fun: example.com/pkg.Read\n      allowed-errors-wildcard:\n        - err: example.com/pkg.ErrMagic\n          fun: example.com/pkg.Magic\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_errorlint.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  errorlint:\n    errorf: false\n    errorf-multi: false\n    asserts: false\n    comparison: false\n    allowed-errors:\n      - err: \"io.EOF\"\n        fun: \"example.com/pkg.Read\"\n    allowed-errors-wildcard:\n      - err: \"example.com/pkg.ErrMagic\"\n        fun: \"example.com/pkg.Magic\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_exhaustive.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    exhaustive:\n      check:\n        - switch\n        - map\n      default-signifies-exhaustive: true\n      ignore-enum-members: Example.+\n      ignore-enum-types: Example.+\n      package-scope-only: true\n      explicit-exhaustive-map: true\n      explicit-exhaustive-switch: true\n      default-case-required: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_exhaustive.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  exhaustive:\n    check:\n      - switch\n      - map\n    check-generated: true\n    default-signifies-exhaustive: true\n    ignore-enum-members: \"Example.+\"\n    ignore-enum-types: \"Example.+\"\n    package-scope-only: true\n    explicit-exhaustive-switch: true\n    explicit-exhaustive-map: true\n    default-case-required: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_exhaustruct.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    exhaustruct:\n      include:\n        - .+\\.Test\n        - example\\.com/package\\.ExampleStruct[\\d]{1,2}\n      exclude:\n        - .+/cobra\\.Command$\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_exhaustruct.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  exhaustruct:\n    include:\n      - '.+\\.Test'\n      - 'example\\.com/package\\.ExampleStruct[\\d]{1,2}'\n    exclude:\n      - '.+/cobra\\.Command$'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_fatcontext.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    fatcontext:\n      check-struct-pointers: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_fatcontext.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  fatcontext:\n    check-struct-pointers: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_forbidigo.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    forbidigo:\n      forbid:\n        - pattern: ^print(ln)?$\n        - pattern: ^fmt\\.Print.*$\n          msg: Do not commit print statements.\n        - pattern: fmt\\.Print.*(# Do not commit print statements\\.)?\n        - pattern: ^spew\\.(ConfigState\\.)?Dump$\n        - pattern: ^v1.Dump$\n          pkg: ^example.com/pkg/api/v1$\n        - pkg: ^github.com/howeyc/gopass$\n          msg: github.com/howeyc/gopass is archived, use golang.org/x/term instead\n      exclude-godoc-examples: false\n      analyze-types: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_forbidigo.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  forbidigo:\n    forbid:\n      - ^print(ln)?$\n      - p: ^fmt\\.Print.*$\n        msg: Do not commit print statements.\n      - 'fmt\\.Print.*(# Do not commit print statements\\.)?'\n      - ^spew\\.(ConfigState\\.)?Dump$\n      - p: ^v1.Dump$\n        pkg: ^example.com/pkg/api/v1$\n      - pkg: ^github.com/howeyc/gopass$\n        msg: \"github.com/howeyc/gopass is archived, use golang.org/x/term instead\"\n    exclude-godoc-examples: false\n    analyze-types: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_funlen.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    funlen:\n      lines: -1\n      statements: -1\n      ignore-comments: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_funlen.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  funlen:\n    lines: -1\n    statements: -1\n    ignore-comments: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gci.golden.yml",
    "content": "version: \"2\"\nformatters:\n  settings:\n    gci:\n      sections:\n        - standard\n        - default\n        - prefix(github.com/org/project)\n        - blank\n        - dot\n        - alias\n        - localmodule\n      no-inline-comments: true\n      no-prefix-comments: true\n      custom-order: true\n      no-lex-order: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gci.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gci:\n    sections:\n      - standard\n      - default\n      - prefix(github.com/org/project)\n      - blank\n      - dot\n      - alias\n      - localmodule\n    no-inline-comments: true\n    no-prefix-comments: true\n    skip-generated: false\n    custom-order: true\n    no-lex-order: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_ginkgolinter.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    ginkgolinter:\n      suppress-len-assertion: true\n      suppress-nil-assertion: true\n      suppress-err-assertion: true\n      suppress-compare-assertion: true\n      suppress-async-assertion: true\n      suppress-type-compare-assertion: true\n      forbid-focus-container: true\n      allow-havelen-zero: true\n      force-expect-to: true\n      validate-async-intervals: true\n      forbid-spec-pollution: true\n      force-succeed: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_ginkgolinter.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  ginkgolinter:\n    suppress-len-assertion: true\n    suppress-nil-assertion: true\n    suppress-err-assertion: true\n    suppress-compare-assertion: true\n    suppress-async-assertion: true\n    suppress-type-compare-assertion: true\n    forbid-focus-container: true\n    allow-havelen-zero: true\n    force-expect-to: true\n    validate-async-intervals: true\n    forbid-spec-pollution: true\n    force-succeed: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gochecksumtype.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gochecksumtype:\n      default-signifies-exhaustive: false\n      include-shared-interfaces: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gochecksumtype.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gochecksumtype:\n    default-signifies-exhaustive: false\n    include-shared-interfaces: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gocognit.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gocognit:\n      min-complexity: 10\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gocognit.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gocognit:\n    min-complexity: 10\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_goconst.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    goconst:\n      ignore-strings: foo.+\n      match-constant: false\n      min-len: 2\n      min-occurrences: 2\n      numbers: true\n      min: 2\n      max: 2\n      ignore-calls: false\n  exclusions:\n    rules:\n      - linters:\n          - goconst\n        path: (.+)_test\\.go\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_goconst.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  goconst:\n    min-len: 2\n    min-occurrences: 2\n    ignore-tests: true\n    match-constant: false\n    numbers: true\n    min: 2\n    max: 2\n    ignore-calls: false\n    ignore-strings: 'foo.+'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gocritic.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gocritic:\n      disable-all: true\n      enabled-checks:\n        - appendAssign\n        - appendCombine\n        - argOrder\n        - assignOp\n        - badCall\n        - badCond\n        - badLock\n        - badRegexp\n        - badSorting\n        - badSyncOnceFunc\n        - boolExprSimplify\n        - builtinShadow\n        - builtinShadowDecl\n        - captLocal\n        - caseOrder\n        - codegenComment\n        - commentFormatting\n        - commentedOutCode\n        - commentedOutImport\n        - defaultCaseOrder\n        - deferInLoop\n        - deferUnlambda\n        - deprecatedComment\n        - docStub\n        - dupArg\n        - dupBranchBody\n        - dupCase\n        - dupImport\n        - dupSubExpr\n        - dynamicFmtString\n        - elseif\n        - emptyDecl\n        - emptyFallthrough\n        - emptyStringTest\n        - equalFold\n        - evalOrder\n        - exitAfterDefer\n        - exposedSyncMutex\n        - externalErrorReassign\n        - filepathJoin\n        - flagDeref\n        - flagName\n        - hexLiteral\n        - httpNoBody\n        - hugeParam\n        - ifElseChain\n        - importShadow\n        - indexAlloc\n        - initClause\n        - mapKey\n        - methodExprCall\n        - nestingReduce\n        - newDeref\n        - nilValReturn\n        - octalLiteral\n        - offBy1\n        - paramTypeCombine\n        - preferDecodeRune\n        - preferFilepathJoin\n        - preferFprint\n        - preferStringWriter\n        - preferWriteByte\n        - ptrToRefParam\n        - rangeAppendAll\n        - rangeExprCopy\n        - rangeValCopy\n        - redundantSprint\n        - regexpMust\n        - regexpPattern\n        - regexpSimplify\n        - returnAfterHttpError\n        - ruleguard\n        - singleCaseSwitch\n        - sliceClear\n        - sloppyLen\n        - sloppyReassign\n        - sloppyTypeAssert\n        - sortSlice\n        - sprintfQuotedString\n        - sqlQuery\n        - stringConcatSimplify\n        - stringXbytes\n        - stringsCompare\n        - switchTrue\n        - syncMapLoadAndDelete\n        - timeExprSimplify\n        - todoCommentWithoutDetail\n        - tooManyResultsChecker\n        - truncateCmp\n        - typeAssertChain\n        - typeDefFirst\n        - typeSwitchVar\n        - typeUnparen\n        - uncheckedInlineErr\n        - underef\n        - unlabelStmt\n        - unlambda\n        - unnamedResult\n        - unnecessaryBlock\n        - unnecessaryDefer\n        - unslice\n        - valSwap\n        - weakCond\n        - whyNoLint\n        - wrapperFunc\n        - yodaStyleExpr\n      enable-all: true\n      disabled-checks:\n        - appendAssign\n        - appendCombine\n        - argOrder\n        - assignOp\n        - badCall\n        - badCond\n        - badLock\n        - badRegexp\n        - badSorting\n        - badSyncOnceFunc\n        - boolExprSimplify\n        - builtinShadow\n        - builtinShadowDecl\n        - captLocal\n        - caseOrder\n        - codegenComment\n        - commentFormatting\n        - commentedOutCode\n        - commentedOutImport\n        - defaultCaseOrder\n        - deferInLoop\n        - deferUnlambda\n        - deprecatedComment\n        - docStub\n        - dupArg\n        - dupBranchBody\n        - dupCase\n        - dupImport\n        - dupSubExpr\n        - dynamicFmtString\n        - elseif\n        - emptyDecl\n        - emptyFallthrough\n        - emptyStringTest\n        - equalFold\n        - evalOrder\n        - exitAfterDefer\n        - exposedSyncMutex\n        - externalErrorReassign\n        - filepathJoin\n        - flagDeref\n        - flagName\n        - hexLiteral\n        - httpNoBody\n        - hugeParam\n        - ifElseChain\n        - importShadow\n        - indexAlloc\n        - initClause\n        - mapKey\n        - methodExprCall\n        - nestingReduce\n        - newDeref\n        - nilValReturn\n        - octalLiteral\n        - offBy1\n        - paramTypeCombine\n        - preferDecodeRune\n        - preferFilepathJoin\n        - preferFprint\n        - preferStringWriter\n        - preferWriteByte\n        - ptrToRefParam\n        - rangeAppendAll\n        - rangeExprCopy\n        - rangeValCopy\n        - redundantSprint\n        - regexpMust\n        - regexpPattern\n        - regexpSimplify\n        - returnAfterHttpError\n        - ruleguard\n        - singleCaseSwitch\n        - sliceClear\n        - sloppyLen\n        - sloppyReassign\n        - sloppyTypeAssert\n        - sortSlice\n        - sprintfQuotedString\n        - sqlQuery\n        - stringConcatSimplify\n        - stringXbytes\n        - stringsCompare\n        - switchTrue\n        - syncMapLoadAndDelete\n        - timeExprSimplify\n        - todoCommentWithoutDetail\n        - tooManyResultsChecker\n        - truncateCmp\n        - typeAssertChain\n        - typeDefFirst\n        - typeSwitchVar\n        - typeUnparen\n        - uncheckedInlineErr\n        - underef\n        - unlabelStmt\n        - unlambda\n        - unnamedResult\n        - unnecessaryBlock\n        - unnecessaryDefer\n        - unslice\n        - valSwap\n        - weakCond\n        - whyNoLint\n        - wrapperFunc\n        - yodaStyleExpr\n      enabled-tags:\n        - diagnostic\n        - style\n        - performance\n        - experimental\n        - opinionated\n      disabled-tags:\n        - diagnostic\n        - style\n        - performance\n        - experimental\n        - opinionated\n      settings:\n        captLocal:\n          paramsOnly: false\n        commentedOutCode:\n          minLength: 50\n        elseif:\n          skipBalanced: false\n        hugeParam:\n          sizeThreshold: 70\n        ifElseChain:\n          minThreshold: 4\n        nestingReduce:\n          bodyWidth: 4\n        rangeExprCopy:\n          sizeThreshold: 516\n          skipTestFuncs: false\n        rangeValCopy:\n          sizeThreshold: 32\n          skipTestFuncs: false\n        ruleguard:\n          debug: emptyDecl\n          disable: myGroupName,#myTagName\n          enable: myGroupName,#myTagName\n          failOn: dsl,import\n          rules: ${base-path}/ruleguard/rules-*.go,${base-path}/myrule1.go\n        tooManyResultsChecker:\n          maxResults: 10\n        truncateCmp:\n          skipArchDependent: false\n        underef:\n          skipRecvDeref: false\n        unnamedResult:\n          checkExported: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gocritic.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gocritic:\n    disable-all: true\n    enabled-checks:\n      - appendAssign\n      - appendCombine\n      - argOrder\n      - assignOp\n      - badCall\n      - badCond\n      - badLock\n      - badRegexp\n      - badSorting\n      - badSyncOnceFunc\n      - boolExprSimplify\n      - builtinShadow\n      - builtinShadowDecl\n      - captLocal\n      - caseOrder\n      - codegenComment\n      - commentFormatting\n      - commentedOutCode\n      - commentedOutImport\n      - defaultCaseOrder\n      - deferInLoop\n      - deferUnlambda\n      - deprecatedComment\n      - docStub\n      - dupArg\n      - dupBranchBody\n      - dupCase\n      - dupImport\n      - dupSubExpr\n      - dynamicFmtString\n      - elseif\n      - emptyDecl\n      - emptyFallthrough\n      - emptyStringTest\n      - equalFold\n      - evalOrder\n      - exitAfterDefer\n      - exposedSyncMutex\n      - externalErrorReassign\n      - filepathJoin\n      - flagDeref\n      - flagName\n      - hexLiteral\n      - httpNoBody\n      - hugeParam\n      - ifElseChain\n      - importShadow\n      - indexAlloc\n      - initClause\n      - mapKey\n      - methodExprCall\n      - nestingReduce\n      - newDeref\n      - nilValReturn\n      - octalLiteral\n      - offBy1\n      - paramTypeCombine\n      - preferDecodeRune\n      - preferFilepathJoin\n      - preferFprint\n      - preferStringWriter\n      - preferWriteByte\n      - ptrToRefParam\n      - rangeAppendAll\n      - rangeExprCopy\n      - rangeValCopy\n      - redundantSprint\n      - regexpMust\n      - regexpPattern\n      - regexpSimplify\n      - returnAfterHttpError\n      - ruleguard\n      - singleCaseSwitch\n      - sliceClear\n      - sloppyLen\n      - sloppyReassign\n      - sloppyTypeAssert\n      - sortSlice\n      - sprintfQuotedString\n      - sqlQuery\n      - stringConcatSimplify\n      - stringXbytes\n      - stringsCompare\n      - switchTrue\n      - syncMapLoadAndDelete\n      - timeExprSimplify\n      - todoCommentWithoutDetail\n      - tooManyResultsChecker\n      - truncateCmp\n      - typeAssertChain\n      - typeDefFirst\n      - typeSwitchVar\n      - typeUnparen\n      - uncheckedInlineErr\n      - underef\n      - unlabelStmt\n      - unlambda\n      - unnamedResult\n      - unnecessaryBlock\n      - unnecessaryDefer\n      - unslice\n      - valSwap\n      - weakCond\n      - whyNoLint\n      - wrapperFunc\n      - yodaStyleExpr\n    enable-all: true\n    disabled-checks:\n      - appendAssign\n      - appendCombine\n      - argOrder\n      - assignOp\n      - badCall\n      - badCond\n      - badLock\n      - badRegexp\n      - badSorting\n      - badSyncOnceFunc\n      - boolExprSimplify\n      - builtinShadow\n      - builtinShadowDecl\n      - captLocal\n      - caseOrder\n      - codegenComment\n      - commentFormatting\n      - commentedOutCode\n      - commentedOutImport\n      - defaultCaseOrder\n      - deferInLoop\n      - deferUnlambda\n      - deprecatedComment\n      - docStub\n      - dupArg\n      - dupBranchBody\n      - dupCase\n      - dupImport\n      - dupSubExpr\n      - dynamicFmtString\n      - elseif\n      - emptyDecl\n      - emptyFallthrough\n      - emptyStringTest\n      - equalFold\n      - evalOrder\n      - exitAfterDefer\n      - exposedSyncMutex\n      - externalErrorReassign\n      - filepathJoin\n      - flagDeref\n      - flagName\n      - hexLiteral\n      - httpNoBody\n      - hugeParam\n      - ifElseChain\n      - importShadow\n      - indexAlloc\n      - initClause\n      - mapKey\n      - methodExprCall\n      - nestingReduce\n      - newDeref\n      - nilValReturn\n      - octalLiteral\n      - offBy1\n      - paramTypeCombine\n      - preferDecodeRune\n      - preferFilepathJoin\n      - preferFprint\n      - preferStringWriter\n      - preferWriteByte\n      - ptrToRefParam\n      - rangeAppendAll\n      - rangeExprCopy\n      - rangeValCopy\n      - redundantSprint\n      - regexpMust\n      - regexpPattern\n      - regexpSimplify\n      - returnAfterHttpError\n      - ruleguard\n      - singleCaseSwitch\n      - sliceClear\n      - sloppyLen\n      - sloppyReassign\n      - sloppyTypeAssert\n      - sortSlice\n      - sprintfQuotedString\n      - sqlQuery\n      - stringConcatSimplify\n      - stringXbytes\n      - stringsCompare\n      - switchTrue\n      - syncMapLoadAndDelete\n      - timeExprSimplify\n      - todoCommentWithoutDetail\n      - tooManyResultsChecker\n      - truncateCmp\n      - typeAssertChain\n      - typeDefFirst\n      - typeSwitchVar\n      - typeUnparen\n      - uncheckedInlineErr\n      - underef\n      - unlabelStmt\n      - unlambda\n      - unnamedResult\n      - unnecessaryBlock\n      - unnecessaryDefer\n      - unslice\n      - valSwap\n      - weakCond\n      - whyNoLint\n      - wrapperFunc\n      - yodaStyleExpr\n    enabled-tags:\n      - diagnostic\n      - style\n      - performance\n      - experimental\n      - opinionated\n    disabled-tags:\n      - diagnostic\n      - style\n      - performance\n      - experimental\n      - opinionated\n    settings:\n      captLocal:\n        paramsOnly: false\n      commentedOutCode:\n        minLength: 50\n      elseif:\n        skipBalanced: false\n      hugeParam:\n        sizeThreshold: 70\n      ifElseChain:\n        minThreshold: 4\n      nestingReduce:\n        bodyWidth: 4\n      rangeExprCopy:\n        sizeThreshold: 516\n        skipTestFuncs: false\n      rangeValCopy:\n        sizeThreshold: 32\n        skipTestFuncs: false\n      ruleguard:\n        debug: 'emptyDecl'\n        failOn: dsl,import\n        rules: '${configDir}/ruleguard/rules-*.go,${configDir}/myrule1.go'\n        enable: \"myGroupName,#myTagName\"\n        disable: \"myGroupName,#myTagName\"\n      tooManyResultsChecker:\n        maxResults: 10\n      truncateCmp:\n        skipArchDependent: false\n      underef:\n        skipRecvDeref: false\n      unnamedResult:\n        checkExported: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gocyclo.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gocyclo:\n      min-complexity: 10\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gocyclo.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gocyclo:\n    min-complexity: 10\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_godot.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    godot:\n      scope: toplevel\n      exclude:\n        - '^fixme:'\n        - '^todo:'\n      capital: true\n      period: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_godot.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  godot:\n    scope: toplevel\n    exclude:\n      - \"^fixme:\"\n      - \"^todo:\"\n    period: false\n    capital: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_godox.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    godox:\n      keywords:\n        - NOTE\n        - OPTIMIZE\n        - HACK\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_godox.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  godox:\n    keywords:\n      - NOTE\n      - OPTIMIZE\n      - HACK\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gofmt.golden.yml",
    "content": "version: \"2\"\nformatters:\n  settings:\n    gofmt:\n      simplify: false\n      rewrite-rules:\n        - pattern: interface{}\n          replacement: any\n        - pattern: a[b:len(a)]\n          replacement: a[b:]\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gofmt.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gofmt:\n    simplify: false\n    rewrite-rules:\n      - pattern: 'interface{}'\n        replacement: 'any'\n      - pattern: 'a[b:len(a)]'\n        replacement: 'a[b:]'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gofumpt.golden.yml",
    "content": "version: \"2\"\nformatters:\n  settings:\n    gofumpt:\n      module-path: github.com/org/project\n      extra-rules: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gofumpt.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gofumpt:\n    module-path: github.com/org/project\n    extra-rules: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_goheader.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    goheader:\n      values:\n        const:\n          COMPANY: MY COMPANY\n        regexp:\n          AUTHOR: .*@mycompany\\.com\n      template: |-\n        Put here copyright header template for source code files\n        For example:\n        Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.\n\n        {{ AUTHOR }} {{ COMPANY }} {{ YEAR }}\n        SPDX-License-Identifier: Apache-2.0\n\n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at:\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n        Unless required by applicable law or agreed to in writing, software\n        distributed under the License is distributed on an \"AS IS\" BASIS,\n        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n        See the License for the specific language governing permissions and\n        limitations under the License.\n      template-path: /path/to/my/template.tmpl\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_goheader.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  goheader:\n    values:\n      const:\n        COMPANY: MY COMPANY\n      regexp:\n        AUTHOR: .*@mycompany\\.com\n    template: |-\n      Put here copyright header template for source code files\n      For example:\n      Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.\n      \n      {{ AUTHOR }} {{ COMPANY }} {{ YEAR }}\n      SPDX-License-Identifier: Apache-2.0\n\n      Licensed under the Apache License, Version 2.0 (the \"License\");\n      you may not use this file except in compliance with the License.\n      You may obtain a copy of the License at:\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n      Unless required by applicable law or agreed to in writing, software\n      distributed under the License is distributed on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n      See the License for the specific language governing permissions and\n      limitations under the License.\n    template-path: /path/to/my/template.tmpl\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_goimports.golden.yml",
    "content": "version: \"2\"\nformatters:\n  settings:\n    goimports:\n      local-prefixes:\n        - github.com/org/project\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_goimports.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  goimports:\n    local-prefixes: github.com/org/project\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gomoddirectives.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gomoddirectives:\n      replace-allow-list:\n        - launchpad.net/gocheck\n      replace-local: true\n      exclude-forbidden: true\n      retract-allow-no-explanation: true\n      toolchain-forbidden: true\n      toolchain-pattern: go1\\.23\\.\\d+$\n      tool-forbidden: true\n      go-debug-forbidden: true\n      go-version-pattern: \\d\\.\\d+(\\.0)?\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gomoddirectives.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gomoddirectives:\n    replace-local: true\n    replace-allow-list:\n      - launchpad.net/gocheck\n    retract-allow-no-explanation: true\n    exclude-forbidden: true\n    toolchain-forbidden: true\n    toolchain-pattern: 'go1\\.23\\.\\d+$'\n    tool-forbidden: true\n    go-debug-forbidden: true\n    go-version-pattern: '\\d\\.\\d+(\\.0)?'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gomodguard.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gomodguard:\n      allowed:\n        modules:\n          - gopkg.in/yaml.v2\n        domains:\n          - golang.org\n      blocked:\n        modules:\n          - github.com/uudashr/go-module:\n              recommendations:\n                - golang.org/x/mod\n              reason: '`mod` is the official go.mod parser library.'\n        versions:\n          - github.com/mitchellh/go-homedir:\n              version: < 1.1.0\n              reason: testing if blocked version constraint works.\n        local-replace-directives: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gomodguard.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gomodguard:\n    allowed:\n      modules:\n        - gopkg.in/yaml.v2\n      domains:\n        - golang.org\n    blocked:\n      modules:\n        - github.com/uudashr/go-module:\n            recommendations:\n              - golang.org/x/mod\n            reason: \"`mod` is the official go.mod parser library.\"\n      versions:\n        - github.com/mitchellh/go-homedir:\n            version: \"< 1.1.0\"\n            reason: \"testing if blocked version constraint works.\"\n      local_replace_directives: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gosec.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gosec:\n      includes:\n        - G101\n        - G102\n        - G103\n        - G104\n        - G106\n        - G107\n        - G108\n        - G109\n        - G110\n        - G111\n        - G112\n        - G113\n        - G114\n        - G115\n        - G201\n        - G202\n        - G203\n        - G204\n        - G301\n        - G302\n        - G303\n        - G304\n        - G305\n        - G306\n        - G307\n        - G401\n        - G402\n        - G403\n        - G404\n        - G405\n        - G406\n        - G501\n        - G502\n        - G503\n        - G504\n        - G505\n        - G506\n        - G507\n        - G601\n        - G602\n      excludes:\n        - G101\n        - G102\n        - G103\n        - G104\n        - G106\n        - G107\n        - G108\n        - G109\n        - G110\n        - G111\n        - G112\n        - G113\n        - G114\n        - G115\n        - G201\n        - G202\n        - G203\n        - G204\n        - G301\n        - G302\n        - G303\n        - G304\n        - G305\n        - G306\n        - G307\n        - G401\n        - G402\n        - G403\n        - G404\n        - G405\n        - G406\n        - G501\n        - G502\n        - G503\n        - G504\n        - G505\n        - G506\n        - G507\n        - G601\n        - G602\n      severity: medium\n      confidence: medium\n      config:\n        G101:\n          entropy_threshold: \"80.0\"\n          ignore_entropy: false\n          pattern: (?i)example\n          per_char_threshold: \"3.0\"\n          truncate: \"32\"\n        G104:\n          fmt:\n            - Fscanf\n        G111:\n          pattern: custom\\.Dir\\(\\)\n        G301: \"0750\"\n        G302: \"0600\"\n        G306: \"0600\"\n        global:\n          '#nosec': '#my-custom-nosec'\n          audit: true\n          nosec: true\n          show-ignored: true\n      concurrency: 12\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gosec.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gosec:\n    includes:\n      - G101\n      - G102\n      - G103\n      - G104\n      - G106\n      - G107\n      - G108\n      - G109\n      - G110\n      - G111\n      - G112\n      - G113\n      - G114\n      - G115\n      - G201\n      - G202\n      - G203\n      - G204\n      - G301\n      - G302\n      - G303\n      - G304\n      - G305\n      - G306\n      - G307\n      - G401\n      - G402\n      - G403\n      - G404\n      - G405\n      - G406\n      - G501\n      - G502\n      - G503\n      - G504\n      - G505\n      - G506\n      - G507\n      - G601\n      - G602\n    excludes:\n      - G101\n      - G102\n      - G103\n      - G104\n      - G106\n      - G107\n      - G108\n      - G109\n      - G110\n      - G111\n      - G112\n      - G113\n      - G114\n      - G115\n      - G201\n      - G202\n      - G203\n      - G204\n      - G301\n      - G302\n      - G303\n      - G304\n      - G305\n      - G306\n      - G307\n      - G401\n      - G402\n      - G403\n      - G404\n      - G405\n      - G406\n      - G501\n      - G502\n      - G503\n      - G504\n      - G505\n      - G506\n      - G507\n      - G601\n      - G602\n    exclude-generated: true\n    severity: medium\n    confidence: medium\n    concurrency: 12\n    config:\n      global:\n        nosec: true\n        \"#nosec\": \"#my-custom-nosec\"\n        show-ignored: true\n        audit: true\n      G101:\n        pattern: \"(?i)example\"\n        ignore_entropy: false\n        entropy_threshold: \"80.0\"\n        per_char_threshold: \"3.0\"\n        truncate: \"32\"\n      G104:\n        fmt:\n          - Fscanf\n      G111:\n        pattern: \"custom\\\\.Dir\\\\(\\\\)\"\n      G301: \"0750\"\n      G302: \"0600\"\n      G306: \"0600\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gosimple.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - S1000\n        - S1001\n        - S1002\n        - S1003\n        - S1004\n        - S1005\n        - S1006\n        - S1007\n        - S1008\n        - S1009\n        - S1010\n        - S1011\n        - S1012\n        - S1016\n        - S1017\n        - S1018\n        - S1019\n        - S1020\n        - S1021\n        - S1023\n        - S1024\n        - S1025\n        - S1028\n        - S1029\n        - S1030\n        - S1031\n        - S1032\n        - S1033\n        - S1034\n        - S1035\n        - S1036\n        - S1037\n        - S1038\n        - S1039\n        - S1040\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gosimple.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gosimple:\n    checks:\n      - S1000\n      - S1001\n      - S1002\n      - S1003\n      - S1004\n      - S1005\n      - S1006\n      - S1007\n      - S1008\n      - S1009\n      - S1010\n      - S1011\n      - S1012\n      - S1016\n      - S1017\n      - S1018\n      - S1019\n      - S1020\n      - S1021\n      - S1023\n      - S1024\n      - S1025\n      - S1028\n      - S1029\n      - S1030\n      - S1031\n      - S1032\n      - S1033\n      - S1034\n      - S1035\n      - S1036\n      - S1037\n      - S1038\n      - S1039\n      - S1040\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gosmopolitan.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    gosmopolitan:\n      allow-time-local: true\n      escape-hatches:\n        - github.com/nicksnyder/go-i18n/v2/i18n.Message\n        - example.com/your/project/i18n/markers.Raw\n        - example.com/your/project/i18n/markers.OK\n        - example.com/your/project/i18n/markers.TODO\n        - command-line-arguments.Simple\n      watch-for-scripts:\n        - Devanagari\n        - Han\n        - Hangul\n        - Hiragana\n        - Katakana\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_gosmopolitan.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  gosmopolitan:\n    allow-time-local: true\n    escape-hatches:\n      - 'github.com/nicksnyder/go-i18n/v2/i18n.Message'\n      - 'example.com/your/project/i18n/markers.Raw'\n      - 'example.com/your/project/i18n/markers.OK'\n      - 'example.com/your/project/i18n/markers.TODO'\n      - 'command-line-arguments.Simple'\n    ignore-tests: false\n    watch-for-scripts:\n      - Devanagari\n      - Han\n      - Hangul\n      - Hiragana\n      - Katakana\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_govet.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    govet:\n      enable:\n        - appends\n        - asmdecl\n        - assign\n        - atomic\n        - atomicalign\n        - bools\n        - buildtag\n        - cgocall\n        - composites\n        - copylocks\n        - deepequalerrors\n        - defers\n        - directive\n        - errorsas\n        - fieldalignment\n        - findcall\n        - framepointer\n        - httpresponse\n        - ifaceassert\n        - loopclosure\n        - lostcancel\n        - nilfunc\n        - nilness\n        - printf\n        - reflectvaluecompare\n        - shadow\n        - shift\n        - sigchanyzer\n        - slog\n        - sortslice\n        - stdmethods\n        - stdversion\n        - stringintconv\n        - structtag\n        - testinggoroutine\n        - tests\n        - timeformat\n        - unmarshal\n        - unreachable\n        - unsafeptr\n        - unusedresult\n        - unusedwrite\n        - waitgroup\n      disable:\n        - appends\n        - asmdecl\n        - assign\n        - atomic\n        - atomicalign\n        - bools\n        - buildtag\n        - cgocall\n        - composites\n        - copylocks\n        - deepequalerrors\n        - defers\n        - directive\n        - errorsas\n        - fieldalignment\n        - findcall\n        - framepointer\n        - httpresponse\n        - ifaceassert\n        - loopclosure\n        - lostcancel\n        - nilfunc\n        - nilness\n        - printf\n        - reflectvaluecompare\n        - shadow\n        - shift\n        - sigchanyzer\n        - slog\n        - sortslice\n        - stdmethods\n        - stdversion\n        - stringintconv\n        - structtag\n        - testinggoroutine\n        - tests\n        - timeformat\n        - unmarshal\n        - unreachable\n        - unsafeptr\n        - unusedresult\n        - unusedwrite\n        - waitgroup\n      enable-all: true\n      disable-all: true\n      settings:\n        printf:\n          funcs:\n            - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof\n            - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf\n            - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf\n            - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf\n        shadow:\n          strict: true\n        unusedresult:\n          funcs:\n            - pkg.MyFunc\n          stringmethods:\n            - MyMethod\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_govet.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  govet:\n    disable-all: true\n    enable:\n      - appends\n      - asmdecl\n      - assign\n      - atomic\n      - atomicalign\n      - bools\n      - buildtag\n      - cgocall\n      - composites\n      - copylocks\n      - deepequalerrors\n      - defers\n      - directive\n      - errorsas\n      - fieldalignment\n      - findcall\n      - framepointer\n      - httpresponse\n      - ifaceassert\n      - loopclosure\n      - lostcancel\n      - nilfunc\n      - nilness\n      - printf\n      - reflectvaluecompare\n      - shadow\n      - shift\n      - sigchanyzer\n      - slog\n      - sortslice\n      - stdmethods\n      - stdversion\n      - stringintconv\n      - structtag\n      - testinggoroutine\n      - tests\n      - timeformat\n      - unmarshal\n      - unreachable\n      - unsafeptr\n      - unusedresult\n      - unusedwrite\n      - waitgroup\n    enable-all: true\n    disable:\n      - appends\n      - asmdecl\n      - assign\n      - atomic\n      - atomicalign\n      - bools\n      - buildtag\n      - cgocall\n      - composites\n      - copylocks\n      - deepequalerrors\n      - defers\n      - directive\n      - errorsas\n      - fieldalignment\n      - findcall\n      - framepointer\n      - httpresponse\n      - ifaceassert\n      - loopclosure\n      - lostcancel\n      - nilfunc\n      - nilness\n      - printf\n      - reflectvaluecompare\n      - shadow\n      - shift\n      - sigchanyzer\n      - slog\n      - sortslice\n      - stdmethods\n      - stdversion\n      - stringintconv\n      - structtag\n      - testinggoroutine\n      - tests\n      - timeformat\n      - unmarshal\n      - unreachable\n      - unsafeptr\n      - unusedresult\n      - unusedwrite\n      - waitgroup\n    settings:\n      printf:\n        funcs:\n          - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof\n          - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf\n          - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf\n          - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf\n      shadow:\n        strict: true\n      unusedresult:\n        funcs:\n          - pkg.MyFunc\n        stringmethods:\n          - MyMethod\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_grouper.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    grouper:\n      const-require-single-const: true\n      const-require-grouping: true\n      import-require-single-import: true\n      import-require-grouping: true\n      type-require-single-type: true\n      type-require-grouping: true\n      var-require-single-var: true\n      var-require-grouping: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_grouper.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  grouper:\n    const-require-single-const: true\n    const-require-grouping: true\n    import-require-single-import: true\n    import-require-grouping: true\n    type-require-single-type: true\n    type-require-grouping: true\n    var-require-single-var: true\n    var-require-grouping: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_iface.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    iface:\n      enable:\n        - identical\n        - unused\n        - opaque\n      settings:\n        unused:\n          exclude:\n            - github.com/example/log\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_iface.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  iface:\n    enable:\n      - identical\n      - unused\n      - opaque\n    settings:\n      unused:\n        exclude:\n          - github.com/example/log\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_importas.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    importas:\n      alias:\n        - pkg: knative.dev/serving/pkg/apis/serving/v1\n          alias: servingv1\n        - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1\n          alias: autoscalingv1alpha1\n        - pkg: knative.dev/serving/pkg/apis/(\\w+)/(v[\\w\\d]+)\n          alias: $1$2\n        - pkg: errors\n          alias: \"\"\n      no-unaliased: true\n      no-extra-aliases: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_importas.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  importas:\n    no-unaliased: true\n    no-extra-aliases: true\n    alias:\n      - pkg: knative.dev/serving/pkg/apis/serving/v1\n        alias: servingv1\n      - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1\n        alias: autoscalingv1alpha1\n      - pkg: knative.dev/serving/pkg/apis/(\\w+)/(v[\\w\\d]+)\n        alias: $1$2\n      - pkg: errors\n        alias: \"\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_inamedparam.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    inamedparam:\n      skip-single-param: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_inamedparam.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  inamedparam:\n    skip-single-param: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_interfacebloat.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    interfacebloat:\n      max: 5\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_interfacebloat.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  interfacebloat:\n    max: 5\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_ireturn.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    ireturn:\n      allow:\n        - anon\n        - (or|er)$\n      reject:\n        - github.com\\/user\\/package\\/v4\\.Type\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_ireturn.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  ireturn:\n    allow:\n      - anon\n      - (or|er)$\n    reject:\n      - github.com\\/user\\/package\\/v4\\.Type\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_lll.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    lll:\n      line-length: 120\n      tab-width: 1\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_lll.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  lll:\n    line-length: 120\n    tab-width: 1\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_loggercheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    loggercheck:\n      kitlog: false\n      klog: false\n      logr: false\n      slog: false\n      zap: false\n      require-string-key: true\n      no-printf-like: true\n      rules:\n        - k8s.io/klog/v2.InfoS\n        - (github.com/go-logr/logr.Logger).Error\n        - (*go.uber.org/zap.SugaredLogger).With\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_loggercheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  loggercheck:\n    kitlog: false\n    klog: false\n    logr: false\n    slog: false\n    zap: false\n    require-string-key: true\n    no-printf-like: true\n    rules:\n      - k8s.io/klog/v2.InfoS\n      - (github.com/go-logr/logr.Logger).Error\n      - (*go.uber.org/zap.SugaredLogger).With\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_maintidx.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    maintidx:\n      under: 100\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_maintidx.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  maintidx:\n    under: 100\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_makezero.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    makezero:\n      always: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_makezero.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  makezero:\n    always: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_misspell.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    misspell:\n      mode: restricted\n      locale: US\n      extra-words:\n        - typo: iff\n          correction: if\n        - typo: cancelation\n          correction: cancellation\n      ignore-rules:\n        - someword\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_misspell.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  misspell:\n    locale: US\n    ignore-words:\n      - someword\n    extra-words:\n      - typo: \"iff\"\n        correction: \"if\"\n      - typo: \"cancelation\"\n        correction: \"cancellation\"\n    mode: restricted\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_mnd.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    mnd:\n      checks:\n        - argument\n        - case\n        - condition\n        - operation\n        - return\n        - assign\n      ignored-numbers:\n        - \"0666\"\n        - \"0755\"\n        - \"42\"\n      ignored-files:\n        - magic1_.+\\.go$\n      ignored-functions:\n        - ^math\\.\n        - ^http\\.StatusText$\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_mnd.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  mnd:\n    checks:\n      - argument\n      - case\n      - condition\n      - operation\n      - return\n      - assign\n    ignored-numbers:\n      - '0666'\n      - '0755'\n      - '42'\n    ignored-files:\n      - 'magic1_.+\\.go$'\n    ignored-functions:\n      - '^math\\.'\n      - '^http\\.StatusText$'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_musttag.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    musttag:\n      functions:\n        - name: github.com/hashicorp/hcl/v2/hclsimple.DecodeFile\n          tag: hcl\n          arg-pos: 2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_musttag.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  musttag:\n    functions:\n      - name: github.com/hashicorp/hcl/v2/hclsimple.DecodeFile\n        tag: hcl\n        arg-pos: 2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nakedret.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    nakedret:\n      max-func-lines: 31\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nakedret.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  nakedret:\n    max-func-lines: 31\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nakedret_zero.golden.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nakedret:\n      max-func-lines: 0\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nakedret_zero.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  nakedret:\n    max-func-lines: 0\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nestif.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    nestif:\n      min-complexity: 4\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nestif.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  nestif:\n    min-complexity: 4\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nilnil.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    nilnil:\n      detect-opposite: true\n      checked-types:\n        - chan\n        - func\n        - iface\n        - map\n        - ptr\n        - uintptr\n        - unsafeptr\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nilnil.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  nilnil:\n    detect-opposite: true\n    checked-types:\n      - chan\n      - func\n      - iface\n      - map\n      - ptr\n      - uintptr\n      - unsafeptr\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nlreturn.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    nlreturn:\n      block-size: 2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nlreturn.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  nlreturn:\n    block-size: 2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nolintlint.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    nolintlint:\n      require-explanation: true\n      require-specific: true\n      allow-unused: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nolintlint.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  nolintlint:\n    allow-unused: true\n    allow-no-explanation: [ ]\n    require-explanation: true\n    require-specific: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nonamedreturns.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    nonamedreturns:\n      report-error-in-defer: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_nonamedreturns.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  nonamedreturns:\n    report-error-in-defer: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_paralleltest.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    paralleltest:\n      ignore-missing: true\n      ignore-missing-subtests: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_paralleltest.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  paralleltest:\n    ignore-missing: true\n    ignore-missing-subtests: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_perfsprint.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    perfsprint:\n      integer-format: false\n      int-conversion: false\n      error-format: false\n      err-error: true\n      errorf: false\n      string-format: false\n      sprintf1: false\n      strconcat: false\n      bool-format: false\n      hex-format: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_perfsprint.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  perfsprint:\n    integer-format: false\n    int-conversion: false\n    error-format: false\n    err-error: true\n    errorf: false\n    string-format: false\n    sprintf1: false\n    strconcat: false\n    bool-format: false\n    hex-format: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_prealloc.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    prealloc:\n      simple: false\n      range-loops: false\n      for-loops: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_prealloc.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  prealloc:\n    simple: false\n    range-loops: false\n    for-loops: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_predeclared.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    predeclared:\n      ignore:\n        - new\n        - int\n      qualified-name: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_predeclared.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  predeclared:\n    ignore: \"new,int\"\n    q: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_promlinter.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    promlinter:\n      strict: true\n      disabled-linters:\n        - Help\n        - MetricUnits\n        - Counter\n        - HistogramSummaryReserved\n        - MetricTypeInName\n        - ReservedChars\n        - CamelCase\n        - UnitAbbreviations\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_promlinter.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  promlinter:\n    strict: true\n    disabled-linters:\n      - Help\n      - MetricUnits\n      - Counter\n      - HistogramSummaryReserved\n      - MetricTypeInName\n      - ReservedChars\n      - CamelCase\n      - UnitAbbreviations\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_protogetter.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    protogetter:\n      skip-generated-by:\n        - protoc-gen-go-my-own-generator\n      skip-files:\n        - '*.pb.go'\n        - '*/vendor/*'\n        - /full/path/to/file.go\n      skip-any-generated: true\n      replace-first-arg-in-append: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_protogetter.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  protogetter:\n    skip-generated-by: [\"protoc-gen-go-my-own-generator\"]\n    skip-files:\n      - \"*.pb.go\"\n      - \"*/vendor/*\"\n      - \"/full/path/to/file.go\"\n    skip-any-generated: true\n    replace-first-arg-in-append: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_reassign.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    reassign:\n      patterns:\n        - .*\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_reassign.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  reassign:\n    patterns:\n      - \".*\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_recvcheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    recvcheck:\n      disable-builtin: true\n      exclusions:\n        - '*.Value'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_recvcheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  recvcheck:\n    disable-builtin: true\n    exclusions:\n      - \"*.Value\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_revive.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    revive:\n      max-open-files: 2048\n      confidence: 0.1\n      severity: error\n      enable-all-rules: true\n      rules:\n        - name: add-constant\n          arguments:\n            - allowFloats: 0.0,0.,1.0,1.,2.0,2.\n              allowInts: 0,1,2\n              allowStrs: '\"\"'\n              maxLitCount: \"3\"\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: argument-limit\n          arguments:\n            - 4\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: atomic\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: banned-characters\n          arguments:\n            - Ω\n            - Σ\n            - σ\n            - \"7\"\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: bare-return\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: blank-imports\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: bool-literal-in-expr\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: call-to-gc\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: cognitive-complexity\n          arguments:\n            - 7\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: comment-spacings\n          arguments:\n            - mypragma\n            - otherpragma\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: comments-density\n          arguments:\n            - 15\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: confusing-naming\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: confusing-results\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: constant-logical-expr\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: context-as-argument\n          arguments:\n            - allowTypesBefore: '*testing.T,*github.com/user/repo/testing.Harness'\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: context-keys-type\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: cyclomatic\n          arguments:\n            - 3\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: datarace\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: deep-exit\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: defer\n          arguments:\n            - - call-chain\n              - loop\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: dot-imports\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: duplicated-imports\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: early-return\n          arguments:\n            - preserveScope\n            - allowJump\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: empty-block\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: empty-lines\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: enforce-map-style\n          arguments:\n            - make\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: enforce-repeated-arg-type-style\n          arguments:\n            - short\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: enforce-slice-style\n          arguments:\n            - make\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: error-naming\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: error-return\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: error-strings\n          arguments:\n            - xerrors.New\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: errorf\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: exported\n          arguments:\n            - checkPrivateReceivers\n            - disableStutteringCheck\n            - checkPublicInterface\n            - disableChecksOnFunctions\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: file-header\n          arguments:\n            - This is the text that must appear at the top of source files.\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: file-length-limit\n          arguments:\n            - max: 100\n              skipBlankLines: true\n              skipComments: true\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: filename-format\n          arguments:\n            - ^[_a-z][_a-z0-9]*\\.go$\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: flag-parameter\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: function-length\n          arguments:\n            - 10\n            - 0\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: function-result-limit\n          arguments:\n            - 3\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: get-return\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: identical-branches\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: if-return\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: import-alias-naming\n          arguments:\n            - ^[a-z][a-z0-9]{0,}$\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: import-shadowing\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: imports-blocklist\n          arguments:\n            - crypto/md5\n            - crypto/sha1\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: increment-decrement\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: indent-error-flow\n          arguments:\n            - preserveScope\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: line-length-limit\n          arguments:\n            - 80\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: max-control-nesting\n          arguments:\n            - 3\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: max-public-structs\n          arguments:\n            - 3\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: modifies-parameter\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: modifies-value-receiver\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: nested-structs\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: optimize-operands-order\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: package-comments\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: range\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: range-val-address\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: range-val-in-closure\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: receiver-naming\n          arguments:\n            - maxLength: 2\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: redefines-builtin-id\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: redundant-build-tag\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: redundant-import-alias\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: string-format\n          arguments:\n            - - core.WriteError[1].Message\n              - /^([^A-Z]|$)/\n              - must not start with a capital letter\n            - - fmt.Errorf[0]\n              - /(^|[^\\.!?])$/\n              - must not end in punctuation\n            - - panic\n              - /^[^\\n]*$/\n              - must not contain line breaks\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: string-of-int\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: struct-tag\n          arguments:\n            - json,inline\n            - bson,outline,gnu\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: superfluous-else\n          arguments:\n            - preserveScope\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: time-equal\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: time-naming\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unchecked-type-assertion\n          arguments:\n            - acceptIgnoredAssertionResult: true\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unconditional-recursion\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unexported-naming\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unexported-return\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unhandled-error\n          arguments:\n            - fmt.Printf\n            - myFunction\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unnecessary-stmt\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unreachable-code\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unused-parameter\n          arguments:\n            - allowRegex: ^_\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: unused-receiver\n          arguments:\n            - allowRegex: ^_\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: use-any\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: use-errors-new\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: useless-break\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: var-declaration\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: var-naming\n          arguments:\n            - - ID\n            - - VM\n            - - upperCaseConst: true\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n        - name: waitgroup-by-value\n          severity: warning\n          disabled: false\n          exclude:\n            - \"\"\n      directives:\n        - name: specify-disable-reason\n          severity: error\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_revive.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  revive:\n    max-open-files: 2048\n    ignore-generated-header: true\n    severity: error\n    enable-all-rules: true\n    directives:\n      - name: specify-disable-reason\n        severity: error\n    confidence: 0.1\n    rules:\n      - name: add-constant\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - maxLitCount: \"3\"\n            allowStrs: '\"\"'\n            allowInts: \"0,1,2\"\n            allowFloats: \"0.0,0.,1.0,1.,2.0,2.\"\n      - name: argument-limit\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 4 ]\n      - name: atomic\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: banned-characters\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ \"Ω\",\"Σ\",\"σ\", \"7\" ]\n      - name: bare-return\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: blank-imports\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: bool-literal-in-expr\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: call-to-gc\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: cognitive-complexity\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 7 ]\n      - name: comment-spacings\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - mypragma\n          - otherpragma\n      - name: comments-density\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 15 ]\n      - name: confusing-naming\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: confusing-results\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: constant-logical-expr\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: context-as-argument\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - allowTypesBefore: \"*testing.T,*github.com/user/repo/testing.Harness\"\n      - name: context-keys-type\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: cyclomatic\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 3 ]\n      - name: datarace\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: deep-exit\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: defer\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - [ \"call-chain\", \"loop\" ]\n      - name: dot-imports\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ ]\n      - name: duplicated-imports\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: early-return\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"preserveScope\"\n          - \"allowJump\"\n      - name: empty-block\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: empty-lines\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: enforce-map-style\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"make\"\n      - name: enforce-repeated-arg-type-style\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"short\"\n      - name: enforce-slice-style\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"make\"\n      - name: error-naming\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: error-return\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: error-strings\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"xerrors.New\"\n      - name: errorf\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: exported\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"checkPrivateReceivers\"\n          - \"disableStutteringCheck\"\n          - \"checkPublicInterface\"\n          - \"disableChecksOnFunctions\"\n      - name: file-header\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - This is the text that must appear at the top of source files.\n      - name: file-length-limit\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - max: 100\n            skipComments: true\n            skipBlankLines: true\n      - name: filename-format\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"^[_a-z][_a-z0-9]*\\\\.go$\"\n      - name: flag-parameter\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: function-length\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 10, 0 ]\n      - name: function-result-limit\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 3 ]\n      - name: get-return\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: identical-branches\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: if-return\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: import-alias-naming\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"^[a-z][a-z0-9]{0,}$\"\n      - name: import-shadowing\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: imports-blocklist\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"crypto/md5\"\n          - \"crypto/sha1\"\n      - name: increment-decrement\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: indent-error-flow\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"preserveScope\"\n      - name: line-length-limit\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 80 ]\n      - name: max-control-nesting\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 3 ]\n      - name: max-public-structs\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments: [ 3 ]\n      - name: modifies-parameter\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: modifies-value-receiver\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: nested-structs\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: optimize-operands-order\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: package-comments\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: range\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: range-val-address\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: range-val-in-closure\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: receiver-naming\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - maxLength: 2\n      - name: redefines-builtin-id\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: redundant-build-tag\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: redundant-import-alias\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: string-format\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - - 'core.WriteError[1].Message'\n            - '/^([^A-Z]|$)/'\n            - must not start with a capital letter\n          - - 'fmt.Errorf[0]'\n            - '/(^|[^\\.!?])$/'\n            - must not end in punctuation\n          - - panic\n            - '/^[^\\n]*$/'\n            - must not contain line breaks\n      - name: string-of-int\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: struct-tag\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"json,inline\"\n          - \"bson,outline,gnu\"\n      - name: superfluous-else\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"preserveScope\"\n      - name: time-equal\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: time-naming\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: unchecked-type-assertion\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - acceptIgnoredAssertionResult: true\n      - name: unconditional-recursion\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: unexported-naming\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: unexported-return\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: unhandled-error\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - \"fmt.Printf\"\n          - \"myFunction\"\n      - name: unnecessary-stmt\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: unreachable-code\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: unused-parameter\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - allowRegex: \"^_\"\n      - name: unused-receiver\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - allowRegex: \"^_\"\n      - name: use-any\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: use-errors-new\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: useless-break\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: var-declaration\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n      - name: var-naming\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n        arguments:\n          - [ \"ID\" ]\n          - [ \"VM\" ]\n          - - upperCaseConst: true\n      - name: waitgroup-by-value\n        severity: warning\n        disabled: false\n        exclude: [\"\"]\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_rowserrcheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    rowserrcheck:\n      packages:\n        - github.com/jmoiron/sqlx\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_rowserrcheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  rowserrcheck:\n    packages:\n      - github.com/jmoiron/sqlx\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_sloglint.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    sloglint:\n      no-mixed-args: false\n      kv-only: true\n      attr-only: true\n      no-global: all\n      context: all\n      static-msg: true\n      no-raw-keys: true\n      key-naming-case: snake\n      forbidden-keys:\n        - time\n        - level\n        - msg\n        - source\n        - foo\n      args-on-sep-lines: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_sloglint.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  sloglint:\n    no-mixed-args: false\n    kv-only: true\n    attr-only: true\n    no-global: \"all\"\n    context: \"all\"\n    static-msg: true\n    no-raw-keys: true\n    key-naming-case: snake\n    forbidden-keys:\n      - time\n      - level\n      - msg\n      - source\n      - foo\n    args-on-sep-lines: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_spancheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    spancheck:\n      checks:\n        - end\n        - record-error\n        - set-status\n      ignore-check-signatures:\n        - telemetry.RecordError\n      extra-start-span-signatures:\n        - github.com/user/repo/telemetry/trace.Start:opentelemetry\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_spancheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  spancheck:\n    checks:\n      - end\n      - record-error\n      - set-status\n    ignore-check-signatures:\n      - \"telemetry.RecordError\"\n    extra-start-span-signatures:\n      - \"github.com/user/repo/telemetry/trace.Start:opentelemetry\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_staticcheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - SA1000\n        - SA1001\n        - SA1002\n        - SA1003\n        - SA1004\n        - SA1005\n        - SA1006\n        - SA1007\n        - SA1008\n        - SA1010\n        - SA1011\n        - SA1012\n        - SA1013\n        - SA1014\n        - SA1015\n        - SA1016\n        - SA1017\n        - SA1018\n        - SA1019\n        - SA1020\n        - SA1021\n        - SA1023\n        - SA1024\n        - SA1025\n        - SA1026\n        - SA1027\n        - SA1028\n        - SA1029\n        - SA1030\n        - SA1031\n        - SA1032\n        - SA2000\n        - SA2001\n        - SA2002\n        - SA2003\n        - SA3000\n        - SA3001\n        - SA4000\n        - SA4001\n        - SA4003\n        - SA4004\n        - SA4005\n        - SA4006\n        - SA4008\n        - SA4009\n        - SA4010\n        - SA4011\n        - SA4012\n        - SA4013\n        - SA4014\n        - SA4015\n        - SA4016\n        - SA4017\n        - SA4018\n        - SA4019\n        - SA4020\n        - SA4021\n        - SA4022\n        - SA4023\n        - SA4024\n        - SA4025\n        - SA4026\n        - SA4027\n        - SA4028\n        - SA4029\n        - SA4030\n        - SA4031\n        - SA4032\n        - SA5000\n        - SA5001\n        - SA5002\n        - SA5003\n        - SA5004\n        - SA5005\n        - SA5007\n        - SA5008\n        - SA5009\n        - SA5010\n        - SA5011\n        - SA5012\n        - SA6000\n        - SA6001\n        - SA6002\n        - SA6003\n        - SA6005\n        - SA6006\n        - SA9001\n        - SA9002\n        - SA9003\n        - SA9004\n        - SA9005\n        - SA9006\n        - SA9007\n        - SA9008\n        - SA9009\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_staticcheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  staticcheck:\n    checks:\n      - SA1000\n      - SA1001\n      - SA1002\n      - SA1003\n      - SA1004\n      - SA1005\n      - SA1006\n      - SA1007\n      - SA1008\n      - SA1010\n      - SA1011\n      - SA1012\n      - SA1013\n      - SA1014\n      - SA1015\n      - SA1016\n      - SA1017\n      - SA1018\n      - SA1019\n      - SA1020\n      - SA1021\n      - SA1023\n      - SA1024\n      - SA1025\n      - SA1026\n      - SA1027\n      - SA1028\n      - SA1029\n      - SA1030\n      - SA1031\n      - SA1032\n      - SA2000\n      - SA2001\n      - SA2002\n      - SA2003\n      - SA3000\n      - SA3001\n      - SA4000\n      - SA4001\n      - SA4003\n      - SA4004\n      - SA4005\n      - SA4006\n      - SA4008\n      - SA4009\n      - SA4010\n      - SA4011\n      - SA4012\n      - SA4013\n      - SA4014\n      - SA4015\n      - SA4016\n      - SA4017\n      - SA4018\n      - SA4019\n      - SA4020\n      - SA4021\n      - SA4022\n      - SA4023\n      - SA4024\n      - SA4025\n      - SA4026\n      - SA4027\n      - SA4028\n      - SA4029\n      - SA4030\n      - SA4031\n      - SA4032\n      - SA5000\n      - SA5001\n      - SA5002\n      - SA5003\n      - SA5004\n      - SA5005\n      - SA5007\n      - SA5008\n      - SA5009\n      - SA5010\n      - SA5011\n      - SA5012\n      - SA6000\n      - SA6001\n      - SA6002\n      - SA6003\n      - SA6005\n      - SA6006\n      - SA9001\n      - SA9002\n      - SA9003\n      - SA9004\n      - SA9005\n      - SA9006\n      - SA9007\n      - SA9008\n      - SA9009\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_staticcheck_merge.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - all\n        - -S1000\n        - -S1001\n        - -S1002\n        - -SA1000\n        - -SA1001\n        - -SA1002\n        - -ST1000\n        - -ST1001\n        - -ST1003\n        - S1003\n        - S1004\n        - S1005\n        - S1006\n        - S1007\n        - S1008\n        - S1009\n        - S1010\n        - S1011\n        - S1012\n        - S1016\n        - S1017\n        - S1018\n        - S1019\n        - S1020\n        - S1021\n        - S1023\n        - S1024\n        - S1025\n        - S1028\n        - S1029\n        - S1030\n        - S1031\n        - S1032\n        - S1033\n        - S1034\n        - S1035\n        - S1036\n        - S1037\n        - S1038\n        - S1039\n        - S1040\n        - SA1003\n        - SA1004\n        - SA1005\n        - SA1006\n        - SA1007\n        - SA1008\n        - SA1010\n        - SA1011\n        - SA1012\n        - SA1013\n        - SA1014\n        - SA1015\n        - SA1016\n        - SA1017\n        - SA1018\n        - SA1019\n        - SA1020\n        - SA1021\n        - SA1023\n        - SA1024\n        - SA1025\n        - SA1026\n        - SA1027\n        - SA1028\n        - SA1029\n        - SA1030\n        - SA1031\n        - SA1032\n        - SA2000\n        - SA2001\n        - SA2002\n        - SA2003\n        - SA3000\n        - SA3001\n        - SA4000\n        - SA4001\n        - SA4003\n        - SA4004\n        - SA4005\n        - SA4006\n        - SA4008\n        - SA4009\n        - SA4010\n        - SA4011\n        - SA4012\n        - SA4013\n        - SA4014\n        - SA4015\n        - SA4016\n        - SA4017\n        - SA4018\n        - SA4019\n        - SA4020\n        - SA4021\n        - SA4022\n        - SA4023\n        - SA4024\n        - SA4025\n        - SA4026\n        - SA4027\n        - SA4028\n        - SA4029\n        - SA4030\n        - SA4031\n        - SA4032\n        - SA5000\n        - SA5001\n        - SA5002\n        - SA5003\n        - SA5004\n        - SA5005\n        - SA5007\n        - SA5008\n        - SA5009\n        - SA5010\n        - SA5011\n        - SA5012\n        - SA6000\n        - SA6001\n        - SA6002\n        - SA6003\n        - SA6005\n        - SA6006\n        - SA9001\n        - SA9002\n        - SA9003\n        - SA9004\n        - SA9005\n        - SA9006\n        - SA9007\n        - SA9008\n        - SA9009\n        - ST1005\n        - ST1006\n        - ST1008\n        - ST1011\n        - ST1012\n        - ST1013\n        - ST1015\n        - ST1016\n        - ST1017\n        - ST1018\n        - ST1019\n        - ST1020\n        - ST1021\n        - ST1022\n        - ST1023\n      initialisms:\n        - ACL\n        - API\n        - ASCII\n        - CPU\n        - CSS\n        - DNS\n        - EOF\n        - GUID\n        - HTML\n        - HTTP\n        - HTTPS\n        - ID\n        - IP\n        - JSON\n        - QPS\n        - RAM\n        - RPC\n        - SLA\n        - SMTP\n        - SQL\n        - SSH\n        - TCP\n        - TLS\n        - TTL\n        - UDP\n        - UI\n        - GID\n        - UID\n        - UUID\n        - URI\n        - URL\n        - UTF8\n        - VM\n        - XML\n        - XMPP\n        - XSRF\n        - XSS\n        - SIP\n        - RTP\n        - AMQP\n        - DB\n        - TS\n      dot-import-whitelist:\n        - fmt\n      http-status-code-whitelist:\n        - \"200\"\n        - \"400\"\n        - \"404\"\n        - \"500\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_staticcheck_merge.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  staticcheck:\n    checks:\n      - all\n      - '-SA1000'\n      - '-SA1001'\n      - '-SA1002'\n      - SA1003\n      - SA1004\n      - SA1005\n      - SA1006\n      - SA1007\n      - SA1008\n      - SA1010\n      - SA1011\n      - SA1012\n      - SA1013\n      - SA1014\n      - SA1015\n      - SA1016\n      - SA1017\n      - SA1018\n      - SA1019\n      - SA1020\n      - SA1021\n      - SA1023\n      - SA1024\n      - SA1025\n      - SA1026\n      - SA1027\n      - SA1028\n      - SA1029\n      - SA1030\n      - SA1031\n      - SA1032\n      - SA2000\n      - SA2001\n      - SA2002\n      - SA2003\n      - SA3000\n      - SA3001\n      - SA4000\n      - SA4001\n      - SA4003\n      - SA4004\n      - SA4005\n      - SA4006\n      - SA4008\n      - SA4009\n      - SA4010\n      - SA4011\n      - SA4012\n      - SA4013\n      - SA4014\n      - SA4015\n      - SA4016\n      - SA4017\n      - SA4018\n      - SA4019\n      - SA4020\n      - SA4021\n      - SA4022\n      - SA4023\n      - SA4024\n      - SA4025\n      - SA4026\n      - SA4027\n      - SA4028\n      - SA4029\n      - SA4030\n      - SA4031\n      - SA4032\n      - SA5000\n      - SA5001\n      - SA5002\n      - SA5003\n      - SA5004\n      - SA5005\n      - SA5007\n      - SA5008\n      - SA5009\n      - SA5010\n      - SA5011\n      - SA5012\n      - SA6000\n      - SA6001\n      - SA6002\n      - SA6003\n      - SA6005\n      - SA6006\n      - SA9001\n      - SA9002\n      - SA9003\n      - SA9004\n      - SA9005\n      - SA9006\n      - SA9007\n      - SA9008\n      - SA9009\n\n  gosimple:\n    checks:\n      - '*'\n      - '-S1000'\n      - '-S1001'\n      - '-S1002'\n      - S1003\n      - S1004\n      - S1005\n      - S1006\n      - S1007\n      - S1008\n      - S1009\n      - S1010\n      - S1011\n      - S1012\n      - S1016\n      - S1017\n      - S1018\n      - S1019\n      - S1020\n      - S1021\n      - S1023\n      - S1024\n      - S1025\n      - S1028\n      - S1029\n      - S1030\n      - S1031\n      - S1032\n      - S1033\n      - S1034\n      - S1035\n      - S1036\n      - S1037\n      - S1038\n      - S1039\n      - S1040\n\n  stylecheck:\n    dot-import-whitelist:\n      - fmt\n    initialisms: [ \"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\" ]\n    http-status-code-whitelist: [ \"200\", \"400\", \"404\", \"500\" ]\n    checks:\n      - all\n      - '-ST1000'\n      - '-ST1001'\n      - '-ST1003'\n      - ST1005\n      - ST1006\n      - ST1008\n      - ST1011\n      - ST1012\n      - ST1013\n      - ST1015\n      - ST1016\n      - ST1017\n      - ST1018\n      - ST1019\n      - ST1020\n      - ST1021\n      - ST1022\n      - ST1023\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_stylecheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - ST1000\n        - ST1001\n        - ST1003\n        - ST1005\n        - ST1006\n        - ST1008\n        - ST1011\n        - ST1012\n        - ST1013\n        - ST1015\n        - ST1016\n        - ST1017\n        - ST1018\n        - ST1019\n        - ST1020\n        - ST1021\n        - ST1022\n        - ST1023\n      initialisms:\n        - ACL\n        - API\n        - ASCII\n        - CPU\n        - CSS\n        - DNS\n        - EOF\n        - GUID\n        - HTML\n        - HTTP\n        - HTTPS\n        - ID\n        - IP\n        - JSON\n        - QPS\n        - RAM\n        - RPC\n        - SLA\n        - SMTP\n        - SQL\n        - SSH\n        - TCP\n        - TLS\n        - TTL\n        - UDP\n        - UI\n        - GID\n        - UID\n        - UUID\n        - URI\n        - URL\n        - UTF8\n        - VM\n        - XML\n        - XMPP\n        - XSRF\n        - XSS\n        - SIP\n        - RTP\n        - AMQP\n        - DB\n        - TS\n      dot-import-whitelist:\n        - fmt\n      http-status-code-whitelist:\n        - \"200\"\n        - \"400\"\n        - \"404\"\n        - \"500\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_stylecheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  stylecheck:\n    dot-import-whitelist:\n      - fmt\n    initialisms: [ \"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\" ]\n    http-status-code-whitelist: [ \"200\", \"400\", \"404\", \"500\" ]\n    checks:\n      - ST1000\n      - ST1001\n      - ST1003\n      - ST1005\n      - ST1006\n      - ST1008\n      - ST1011\n      - ST1012\n      - ST1013\n      - ST1015\n      - ST1016\n      - ST1017\n      - ST1018\n      - ST1019\n      - ST1020\n      - ST1021\n      - ST1022\n      - ST1023\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_tagalign.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    tagalign:\n      align: false\n      sort: false\n      order:\n        - json\n        - yaml\n        - yml\n        - toml\n        - mapstructure\n        - binding\n        - validate\n      strict: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_tagalign.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  tagalign:\n    align: false\n    sort: false\n    order:\n      - json\n      - yaml\n      - yml\n      - toml\n      - mapstructure\n      - binding\n      - validate\n    strict: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_tagliatelle.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    tagliatelle:\n      case:\n        rules:\n          avro: snake\n          bson: camel\n          env: upperSnake\n          envconfig: upperSnake\n          json: camel\n          mapstructure: kebab\n          toml: camel\n          whatever: snake\n          xml: camel\n          yaml: camel\n        extended-rules:\n          json:\n            case: camel\n            extra-initialisms: true\n            initialism-overrides:\n              DB: true\n              LHS: false\n        use-field-name: true\n        ignored-fields:\n          - Bar\n          - Foo\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_tagliatelle.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  tagliatelle:\n    case:\n      rules:\n        json: camel\n        yaml: camel\n        xml: camel\n        toml: camel\n        bson: camel\n        avro: snake\n        mapstructure: kebab\n        env: upperSnake\n        envconfig: upperSnake\n        whatever: snake\n      extended-rules:\n        json:\n          case: camel\n          extra-initialisms: true\n          initialism-overrides:\n            DB: true\n            LHS: false\n      use-field-name: true\n      ignored-fields:\n        - Bar\n        - Foo\n      overrides:\n        -\n          pkg: foo/bar\n          rules:\n            json: snake\n            xml: pascal\n          extended-rules:\n          use-field-name: true\n          ignored-fields:\n            - Bar\n            - Foo\n          ignore: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_testifylint.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    testifylint:\n      enable-all: true\n      disable-all: true\n      enable:\n        - blank-import\n        - bool-compare\n        - compares\n        - contains\n        - empty\n        - encoded-compare\n        - error-is-as\n        - error-nil\n        - expected-actual\n        - float-compare\n        - formatter\n        - go-require\n        - len\n        - negative-positive\n        - nil-compare\n        - regexp\n        - require-error\n        - suite-broken-parallel\n        - suite-dont-use-pkg\n        - suite-extra-assert-call\n        - suite-subtest-run\n        - suite-thelper\n        - useless-assert\n      disable:\n        - blank-import\n        - bool-compare\n        - compares\n        - contains\n        - empty\n        - encoded-compare\n        - error-is-as\n        - error-nil\n        - expected-actual\n        - float-compare\n        - formatter\n        - go-require\n        - len\n        - negative-positive\n        - nil-compare\n        - regexp\n        - require-error\n        - suite-broken-parallel\n        - suite-dont-use-pkg\n        - suite-extra-assert-call\n        - suite-subtest-run\n        - suite-thelper\n        - useless-assert\n      bool-compare:\n        ignore-custom-types: true\n      expected-actual:\n        pattern: ^expected\n      formatter:\n        check-format-string: false\n        require-f-funcs: true\n      go-require:\n        ignore-http-handlers: true\n      require-error:\n        fn-pattern: ^(Errorf?|NoErrorf?)$\n      suite-extra-assert-call:\n        mode: require\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_testifylint.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  testifylint:\n    enable-all: true\n    disable:\n      - blank-import\n      - bool-compare\n      - compares\n      - contains\n      - empty\n      - encoded-compare\n      - error-is-as\n      - error-nil\n      - expected-actual\n      - float-compare\n      - formatter\n      - go-require\n      - len\n      - negative-positive\n      - nil-compare\n      - regexp\n      - require-error\n      - suite-broken-parallel\n      - suite-dont-use-pkg\n      - suite-extra-assert-call\n      - suite-subtest-run\n      - suite-thelper\n      - useless-assert\n    disable-all: true\n    enable:\n      - blank-import\n      - bool-compare\n      - compares\n      - contains\n      - empty\n      - encoded-compare\n      - error-is-as\n      - error-nil\n      - expected-actual\n      - float-compare\n      - formatter\n      - go-require\n      - len\n      - negative-positive\n      - nil-compare\n      - regexp\n      - require-error\n      - suite-broken-parallel\n      - suite-dont-use-pkg\n      - suite-extra-assert-call\n      - suite-subtest-run\n      - suite-thelper\n      - useless-assert\n    bool-compare:\n      ignore-custom-types: true\n    expected-actual:\n      pattern: ^expected\n    formatter:\n      check-format-string: false\n      require-f-funcs: true\n    go-require:\n      ignore-http-handlers: true\n    require-error:\n      fn-pattern: ^(Errorf?|NoErrorf?)$\n    suite-extra-assert-call:\n      mode: require\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_testpackage.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    testpackage:\n      skip-regexp: (export|internal)_test\\.go\n      allow-packages:\n        - example\n        - main\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_testpackage.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  testpackage:\n    skip-regexp: (export|internal)_test\\.go\n    allow-packages:\n      - example\n      - main\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_thelper.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    thelper:\n      test:\n        first: false\n        name: false\n        begin: false\n      fuzz:\n        first: false\n        name: false\n        begin: false\n      benchmark:\n        first: false\n        name: false\n        begin: false\n      tb:\n        first: false\n        name: false\n        begin: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_thelper.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  thelper:\n    test:\n      first: false\n      name: false\n      begin: false\n    benchmark:\n      first: false\n      name: false\n      begin: false\n    tb:\n      first: false\n      name: false\n      begin: false\n    fuzz:\n      first: false\n      name: false\n      begin: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_unconvert.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    unconvert:\n      fast-math: true\n      safe: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_unconvert.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  unconvert:\n    fast-math: true\n    safe: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_unparam.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    unparam:\n      check-exported: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_unparam.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  unparam:\n    check-exported: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_unused.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    unused:\n      field-writes-are-uses: false\n      post-statements-are-reads: true\n      exported-fields-are-used: false\n      parameters-are-used: false\n      local-variables-are-used: false\n      generated-is-used: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_unused.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  unused:\n    field-writes-are-uses: false\n    post-statements-are-reads: true\n    exported-fields-are-used: false\n    parameters-are-used: false\n    local-variables-are-used: false\n    generated-is-used: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_usestdlibvars.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    usestdlibvars:\n      http-method: false\n      http-status-code: false\n      time-weekday: true\n      time-month: true\n      time-layout: true\n      crypto-hash: true\n      default-rpc-path: true\n      sql-isolation-level: true\n      tls-signature-scheme: true\n      constant-kind: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_usestdlibvars.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  usestdlibvars:\n    http-method: false\n    http-status-code: false\n    time-weekday: true\n    time-month: true\n    time-layout: true\n    crypto-hash: true\n    default-rpc-path: true\n    sql-isolation-level: true\n    tls-signature-scheme: true\n    constant-kind: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_usetesting.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    usetesting:\n      context-background: false\n      context-todo: false\n      os-chdir: false\n      os-mkdir-temp: false\n      os-setenv: false\n      os-temp-dir: true\n      os-create-temp: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_usetesting.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  usetesting:\n    os-create-temp: false\n    os-mkdir-temp: false\n    os-setenv: false\n    os-temp-dir: true\n    os-chdir: false\n    context-background: false\n    context-todo: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_varnamelen.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    varnamelen:\n      max-distance: 6\n      min-name-length: 2\n      check-receiver: true\n      check-return: true\n      check-type-param: true\n      ignore-names:\n        - err\n      ignore-type-assert-ok: true\n      ignore-map-index-ok: true\n      ignore-chan-recv-ok: true\n      ignore-decls:\n        - c echo.Context\n        - t testing.T\n        - f *foo.Bar\n        - e error\n        - i int\n        - const C\n        - T any\n        - m map[string]int\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_varnamelen.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  varnamelen:\n    max-distance: 6\n    min-name-length: 2\n    check-receiver: true\n    check-return: true\n    check-type-param: true\n    ignore-type-assert-ok: true\n    ignore-map-index-ok: true\n    ignore-chan-recv-ok: true\n    ignore-names:\n      - err\n    ignore-decls:\n      - c echo.Context\n      - t testing.T\n      - f *foo.Bar\n      - e error\n      - i int\n      - const C\n      - T any\n      - m map[string]int\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_whitespace.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    whitespace:\n      multi-if: true\n      multi-func: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_whitespace.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  whitespace:\n    multi-if: true\n    multi-func: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_wrapcheck.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    wrapcheck:\n      extra-ignore-sigs:\n        - .CustomError(\n        - .SpecificWrap(\n      ignore-sigs:\n        - .Errorf(\n        - errors.New(\n        - errors.Unwrap(\n        - errors.Join(\n        - .Wrap(\n        - .Wrapf(\n        - .WithMessage(\n        - .WithMessagef(\n        - .WithStack(\n      ignore-sig-regexps:\n        - \\.New.*Error\\(\n      ignore-package-globs:\n        - encoding/*\n        - github.com/pkg/*\n      ignore-interface-regexps:\n        - ^(?i)c(?-i)ach(ing|e)\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_wrapcheck.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  wrapcheck:\n    extra-ignore-sigs:\n      - .CustomError(\n      - .SpecificWrap(\n    ignoreSigs:\n      - .Errorf(\n      - errors.New(\n      - errors.Unwrap(\n      - errors.Join(\n      - .Wrap(\n      - .Wrapf(\n      - .WithMessage(\n      - .WithMessagef(\n      - .WithStack(\n    ignoreSigRegexps:\n      - \\.New.*Error\\(\n    ignorePackageGlobs:\n      - encoding/*\n      - github.com/pkg/*\n    ignoreInterfaceRegexps:\n      - ^(?i)c(?-i)ach(ing|e)\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_wsl.golden.yml",
    "content": "version: \"2\"\nlinters:\n  settings:\n    wsl:\n      strict-append: false\n      allow-assign-and-call: false\n      allow-assign-and-anything: true\n      allow-multiline-assign: false\n      force-case-trailing-whitespace: 1\n      allow-trailing-comment: true\n      allow-separated-leading-comment: true\n      allow-cuddle-declarations: true\n      allow-cuddle-with-calls:\n        - Foo\n        - Bar\n      allow-cuddle-with-rhs:\n        - Foo\n        - Bar\n      force-err-cuddling: true\n      error-variable-names:\n        - foo\n      force-short-decl-cuddling: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters-settings_wsl.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters-settings:\n  wsl:\n    strict-append: false\n    allow-assign-and-call: false\n    allow-assign-and-anything: true\n    allow-multiline-assign: false\n    force-case-trailing-whitespace: 1\n    allow-trailing-comment: true\n    allow-separated-leading-comment: true\n    allow-cuddle-declarations: true\n    allow-cuddle-with-calls: [ \"Foo\", \"Bar\" ]\n    allow-cuddle-with-rhs: [ \"Foo\", \"Bar\" ]\n    force-err-cuddling: true\n    error-variable-names: [ \"foo\" ]\n    force-short-decl-cuddling: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_01.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: none\n  enable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godot\n    - godox\n    - goheader\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - musttag\n    - mycustomlinter1\n    - mycustomlinter2\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_01.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: disable-all + enable\nlinters:\n  disable-all: true\n  enable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - gci\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godot\n    - godox\n    - gofmt\n    - gofumpt\n    - goheader\n    - goimports\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosimple\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - stylecheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n    - mycustomlinter1\n    - mycustomlinter2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_02.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: all\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godot\n    - godox\n    - goheader\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - musttag\n    - mycustomlinter1\n    - mycustomlinter2\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_02.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: enable-all + disable\nlinters:\n  enable-all: true\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - gci\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godot\n    - godox\n    - gofmt\n    - gofumpt\n    - goheader\n    - goimports\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosimple\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - stylecheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n    - deadcode # Deprecated\n    - execinquery # Deprecated\n    - exhaustivestruct # Deprecated\n    - exportloopref # Deprecated\n    - golint # Deprecated\n    - gomnd # Deprecated\n    - ifshort # Deprecated\n    - interfacer # Deprecated\n    - maligned # Deprecated\n    - nosnakecase # Deprecated\n    - scopelint # Deprecated\n    - structcheck # Deprecated\n    - tenv # Deprecated\n    - varcheck # Deprecated\n    - mycustomlinter1\n    - mycustomlinter2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_03.golden.yml",
    "content": "version: \"2\"\nlinters:\n  enable:\n    - mycustomlinter1\n    - mycustomlinter2\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - mnd\n    - mycustomlinter3\n    - mycustomlinter4\nformatters:\n  enable:\n    - gofmt\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_03.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: enable + disable\nlinters:\n  enable:\n    - gofmt\n    - sqlclosecheck\n    - staticcheck\n    - stylecheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n    - mycustomlinter1\n    - mycustomlinter2\n\n  disable:\n    - goimports\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - deadcode # Deprecated\n    - execinquery # Deprecated\n    - exhaustivestruct # Deprecated\n    - exportloopref # Deprecated\n    - golint # Deprecated\n    - gomnd # Deprecated\n    - ifshort # Deprecated\n    - interfacer # Deprecated\n    - maligned # Deprecated\n    - nosnakecase # Deprecated\n    - scopelint # Deprecated\n    - structcheck # Deprecated\n    - tenv # Deprecated\n    - varcheck # Deprecated\n    - mycustomlinter3\n    - mycustomlinter4\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_04.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: none\n  enable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - gomoddirectives\n    - gomodguard\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_04.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: disable-all + enable + presets\nlinters:\n  disable-all: true\n  enable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n\n  presets:\n    - format\n    - module\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_05.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: all\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_05.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: enable-all + disable + presets\nlinters:\n  enable-all: true\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n\n  presets:\n    - format\n    - module\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_06.golden.yml",
    "content": "version: \"2\"\nlinters:\n  enable:\n    - gomoddirectives\n    - gomodguard\n    - mycustomlinter1\n    - mycustomlinter2\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - mnd\n    - mycustomlinter3\n    - mycustomlinter4\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_06.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: enable + disable + presets\nlinters:\n  enable:\n    - gofmt\n    - sqlclosecheck\n    - staticcheck\n    - stylecheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n    - mycustomlinter1\n    - mycustomlinter2\n\n  disable:\n    - goimports\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - deadcode # Deprecated\n    - execinquery # Deprecated\n    - exhaustivestruct # Deprecated\n    - exportloopref # Deprecated\n    - golint # Deprecated\n    - gomnd # Deprecated\n    - ifshort # Deprecated\n    - interfacer # Deprecated\n    - maligned # Deprecated\n    - nosnakecase # Deprecated\n    - scopelint # Deprecated\n    - structcheck # Deprecated\n    - tenv # Deprecated\n    - varcheck # Deprecated\n    - mycustomlinter3\n    - mycustomlinter4\n\n  presets:\n    - format\n    - module\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_07.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: none\n  enable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godot\n    - godox\n    - goheader\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_07.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: disable-all + enable + fast\nlinters:\n  fast: true\n  disable-all: true\n  enable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - gci\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godot\n    - godox\n    - gofmt\n    - gofumpt\n    - goheader\n    - goimports\n    - gomoddirectives\n    - gomodguard\n    - goprintffuncname\n    - gosec\n    - gosimple\n    - gosmopolitan\n    - govet\n    - grouper\n    - iface\n    - importas\n    - inamedparam\n    - ineffassign\n    - interfacebloat\n    - intrange\n    - ireturn\n    - lll\n    - loggercheck\n    - maintidx\n    - makezero\n    - mirror\n    - misspell\n    - mnd\n    - musttag\n    - nakedret\n    - nestif\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - nlreturn\n    - noctx\n    - nolintlint\n    - nonamedreturns\n    - nosprintfhostport\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - predeclared\n    - promlinter\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - stylecheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_08.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: all\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n    - gocritic\n    - gosec\n    - gosmopolitan\n    - govet\n    - iface\n    - importas\n    - intrange\n    - ireturn\n    - loggercheck\n    - makezero\n    - mirror\n    - musttag\n    - nilerr\n    - nilnesserr\n    - nilnil\n    - noctx\n    - nonamedreturns\n    - paralleltest\n    - perfsprint\n    - protogetter\n    - reassign\n    - recvcheck\n    - revive\n    - rowserrcheck\n    - sloglint\n    - spancheck\n    - sqlclosecheck\n    - staticcheck\n    - tagliatelle\n    - testifylint\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - wrapcheck\n    - zerologlint\nformatters:\n  enable:\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_08.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: enable-all + disable + fast\nlinters:\n  fast: true\n  enable-all: true\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - err113\n    - errcheck\n    - errchkjson\n    - errname\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - exptostd\n    - fatcontext\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - gci\n    - ginkgolinter\n    - gocheckcompilerdirectives\n    - gochecknoglobals\n    - gochecknoinits\n    - gochecksumtype\n    - gocognit\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_09.golden.yml",
    "content": "version: \"2\"\nlinters:\n  enable:\n    - mycustomlinter1\n    - mycustomlinter2\n    - sqlclosecheck\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n  disable:\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - errcheck\n    - govet\n    - mnd\n    - mycustomlinter3\n    - mycustomlinter4\nformatters:\n  enable:\n    - gofmt\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_09.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: enable + disable + fast\nlinters:\n  fast: true\n  enable:\n    - gofmt\n    - sqlclosecheck\n    - staticcheck\n    - stylecheck\n    - tagalign\n    - tagliatelle\n    - testableexamples\n    - testifylint\n    - testpackage\n    - thelper\n    - tparallel\n    - unconvert\n    - unparam\n    - unused\n    - usestdlibvars\n    - usetesting\n    - varnamelen\n    - wastedassign\n    - whitespace\n    - wrapcheck\n    - wsl\n    - zerologlint\n    - mycustomlinter1\n    - mycustomlinter2\n\n  disable:\n    - goimports\n    - asasalint\n    - asciicheck\n    - bidichk\n    - bodyclose\n    - canonicalheader\n    - containedctx\n    - contextcheck\n    - copyloopvar\n    - cyclop\n    - decorder\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - durationcheck\n    - deadcode # Deprecated\n    - execinquery # Deprecated\n    - exhaustivestruct # Deprecated\n    - exportloopref # Deprecated\n    - golint # Deprecated\n    - gomnd # Deprecated\n    - ifshort # Deprecated\n    - interfacer # Deprecated\n    - maligned # Deprecated\n    - nosnakecase # Deprecated\n    - scopelint # Deprecated\n    - structcheck # Deprecated\n    - tenv # Deprecated\n    - varcheck # Deprecated\n    - mycustomlinter3\n    - mycustomlinter4\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_10.golden.yml",
    "content": "version: \"2\"\nlinters:\n  enable:\n    - depguard\n    - gomoddirectives\n    - gomodguard\n  disable:\n    - errcheck\n    - govet\n    - staticcheck\n    - unused\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_10.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\n# case: presets + fast\nlinters:\n  fast: true\n\n  presets:\n    - format\n    - metalinter\n    - module\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_11.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: all\nformatters:\n  enable:\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_11.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters:\n  enable-all: true\n  disable:\n    - typecheck\n    - gci\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_12.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: none\n  enable:\n    - govet\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_12.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters:\n  disable-all: true\n  enable:\n    - typecheck\n    - govet\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_a.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters:\n  enable:\n    - staticcheck\n  disable:\n    - stylecheck\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_b.golden.yml",
    "content": "version: \"2\"\nlinters:\n  default: all\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters:\n  enable-all: true\n  disable:\n    - gosimple\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_c.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_c.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters:\n  disable:\n    - stylecheck\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_d.golden.yml",
    "content": "version: \"2\"\nlinters:\n  disable:\n    - staticcheck\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/linters_13_d.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nlinters:\n  disable:\n    - staticcheck\n    - stylecheck\n    - gosimple\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_a.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n    json:\n      path: stderr\n    tab:\n      path: stdout\n    html:\n      path: stdout\n    checkstyle:\n      path: report.xml\n    code-climate:\n      path: stdout\n    junit-xml:\n      path: stdout\n      extended: true\n    teamcity:\n      path: stdout\n    sarif:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-line-number\n    - format: line-number\n    - format: json\n      path: stderr\n    - format: colored-tab\n    - format: tab\n    - format: html\n    - format: checkstyle\n      path: report.xml\n    - format: code-climate\n    - format: junit-xml\n    - format: junit-xml-extended\n    - format: github-actions\n    - format: teamcity\n    - format: sarif\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_b.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n      print-linter-name: true\n      print-issued-lines: true\n    json:\n      path: stderr\n    tab:\n      path: stdout\n      print-linter-name: true\n    html:\n      path: stdout\n    checkstyle:\n      path: report.xml\n    code-climate:\n      path: stdout\n    junit-xml:\n      path: stdout\n      extended: true\n    teamcity:\n      path: stdout\n    sarif:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-line-number\n    - format: line-number\n    - format: json\n      path: stderr\n    - format: colored-tab\n    - format: tab\n    - format: html\n    - format: checkstyle\n      path: report.xml\n    - format: code-climate\n    - format: junit-xml\n    - format: junit-xml-extended\n    - format: github-actions\n    - format: teamcity\n    - format: sarif\n\n  print-issued-lines: true\n  print-linter-name: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_c.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n      print-linter-name: false\n      print-issued-lines: false\n    json:\n      path: stderr\n    tab:\n      path: stdout\n      print-linter-name: false\n    html:\n      path: stdout\n    checkstyle:\n      path: report.xml\n    code-climate:\n      path: stdout\n    junit-xml:\n      path: stdout\n      extended: true\n    teamcity:\n      path: stdout\n    sarif:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_c.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-line-number\n    - format: line-number\n    - format: json\n      path: stderr\n    - format: colored-tab\n    - format: tab\n    - format: html\n    - format: checkstyle\n      path: report.xml\n    - format: code-climate\n    - format: junit-xml\n    - format: junit-xml-extended\n    - format: github-actions\n    - format: teamcity\n    - format: sarif\n\n  print-issued-lines: false\n  print-linter-name: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_d.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n      print-linter-name: false\n      print-issued-lines: true\n    json:\n      path: stderr\n    tab:\n      path: stdout\n      print-linter-name: false\n    html:\n      path: stdout\n    checkstyle:\n      path: report.xml\n    code-climate:\n      path: stdout\n    junit-xml:\n      path: stdout\n      extended: true\n    teamcity:\n      path: stdout\n    sarif:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_d.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-line-number\n    - format: line-number\n    - format: json\n      path: stderr\n    - format: colored-tab\n    - format: tab\n    - format: html\n    - format: checkstyle\n      path: report.xml\n    - format: code-climate\n    - format: junit-xml\n    - format: junit-xml-extended\n    - format: github-actions\n    - format: teamcity\n    - format: sarif\n\n  print-issued-lines: true\n  print-linter-name: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_f.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n      print-linter-name: true\n      print-issued-lines: false\n    json:\n      path: stderr\n    tab:\n      path: stdout\n      print-linter-name: true\n    html:\n      path: stdout\n    checkstyle:\n      path: report.xml\n    code-climate:\n      path: stdout\n    junit-xml:\n      path: stdout\n      extended: true\n    teamcity:\n      path: stdout\n    sarif:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_f.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-line-number\n    - format: line-number\n    - format: json\n      path: stderr\n    - format: colored-tab\n    - format: tab\n    - format: html\n    - format: checkstyle\n      path: report.xml\n    - format: code-climate\n    - format: junit-xml\n    - format: junit-xml-extended\n    - format: github-actions\n    - format: teamcity\n    - format: sarif\n\n  print-issued-lines: false\n  print-linter-name: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_g.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_g.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-line-number\n    - format: line-number\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_h.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n      colors: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_h.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: line-number\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_i.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    text:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_i.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-line-number\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_j.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    tab:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_j.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-tab\n    - format: tab\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_k.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    tab:\n      path: stdout\n      colors: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_k.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: tab\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_l.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    tab:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_l.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: colored-tab\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_m.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    junit-xml:\n      path: stdout\n      extended: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_m.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: junit-xml\n    - format: junit-xml-extended\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_o.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    junit-xml:\n      path: stdout\n      extended: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_o.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: junit-xml-extended\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_p.golden.yml",
    "content": "version: \"2\"\noutput:\n  formats:\n    junit-xml:\n      path: stdout\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_01_p.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  formats:\n    - format: junit-xml\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_02.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_02.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  print-issued-lines: true\n  print-linter-name: true\n  sort-results: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_03.golden.yml",
    "content": "version: \"2\"\noutput:\n  sort-order:\n    - linter\n    - severity\n    - file\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_03.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  sort-results: true\n  sort-order:\n    - linter\n    - severity\n    - file\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_04.golden.yml",
    "content": "version: \"2\"\noutput:\n  path-prefix: foo\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/output_04.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\noutput:\n  path-prefix: \"foo\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_01.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_01.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  timeout: 5m\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_02_a.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_02_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  relative-path-mode: cfg\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_02_b.golden.yml",
    "content": "version: \"2\"\nrun:\n  relative-path-mode: gomod\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_02_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  relative-path-mode: gomod\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_03_a.golden.yml",
    "content": "version: \"2\"\nrun:\n  issues-exit-code: 2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_03_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  issues-exit-code: 2\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_03_b.golden.yml",
    "content": "version: \"2\"\nrun:\n  issues-exit-code: 0\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_03_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  issues-exit-code: 0\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_04_a.golden.yml",
    "content": "version: \"2\"\nrun:\n  tests: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_04_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  tests: false\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_04_b.golden.yml",
    "content": "version: \"2\"\nrun:\n  tests: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_04_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  tests: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_05.golden.yml",
    "content": "version: \"2\"\nrun:\n  build-tags:\n    - mytag\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_05.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  build-tags:\n    - mytag\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_06.golden.yml",
    "content": "version: \"2\"\nrun:\n  modules-download-mode: readonly\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_06.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  modules-download-mode: readonly\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_07.golden.yml",
    "content": "version: \"2\"\nrun:\n  allow-parallel-runners: true\n  allow-serial-runners: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_07.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  allow-parallel-runners: true\n  allow-serial-runners: true\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_08.golden.yml",
    "content": "version: \"2\"\nrun:\n  go: \"1.19\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_08.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  go: '1.19'\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_09_a.golden.yml",
    "content": "version: \"2\"\nrun:\n  concurrency: 4\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_09_a.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  concurrency: 4\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_09_b.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_09_b.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  concurrency: 0\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_10.golden.yml",
    "content": "version: \"2\"\nrun:\n  concurrency: 4\n  go: \"1.19\"\n  relative-path-mode: gomod\n  build-tags:\n    - mytag\n  modules-download-mode: readonly\n  issues-exit-code: 2\n  tests: false\n  allow-parallel-runners: true\n  allow-serial-runners: true\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/run_10.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nrun:\n  timeout: 5m\n  relative-path-mode: gomod\n  issues-exit-code: 2\n  tests: false\n  build-tags:\n    - mytag\n  modules-download-mode: readonly\n  allow-parallel-runners: true\n  allow-serial-runners: true\n  go: '1.19'\n  concurrency: 4\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/severity_01.golden.yml",
    "content": "version: \"2\"\nseverity:\n  default: error\n  rules:\n    - linters:\n        - dupl\n      severity: info\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/severity_01.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nseverity:\n  default-severity: error\n  case-sensitive: true\n  rules:\n    - linters:\n        - dupl\n      severity: info\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/severity_02.golden.yml",
    "content": "version: \"2\"\nseverity:\n  default: error\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/severity_02.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nseverity:\n  default-severity: error\n\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/severity_03.golden.yml",
    "content": "version: \"2\"\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/severity_03.yml",
    "content": "issues:\n  # Only to not generate unrelated elements inside golden.\n  exclude-use-default: false\n  # Only to not generate unrelated elements inside golden.\n  exclude-generated: strict\n  # Only to not generate unrelated elements inside golden.\n  exclude-dirs-use-default: false\n\nseverity:\n  rules:\n    - path: _test\\.go\n      severity: info\n      linters:\n        - typecheck\n\n    - path-except: _test\\.go\n      severity: info\n      linters:\n        - typecheck\n\n    - path: internal/hmac/\n      severity: info\n      text: \"weak cryptographic primitive\"\n      linters:\n        - typecheck\n\n    - linters:\n        - typecheck\n      text: \"SA9003:\"\n      severity: info\n\n    - linters:\n        - typecheck\n      source: \"foo\"\n      severity: info\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/unknown-fields.golden.yml",
    "content": "version: \"2\"\nlinters:\n  exclusions:\n    generated: lax\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\nformatters:\n  exclusions:\n    generated: lax\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\n"
  },
  {
    "path": "pkg/commands/internal/migrate/testdata/yaml/unknown-fields.yml",
    "content": "foo:\n  bar: a\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/base_rule.go",
    "content": "package versionone\n\ntype BaseRule struct {\n\tLinters    []string `mapstructure:\"linters\"`\n\tPath       *string  `mapstructure:\"path\"`\n\tPathExcept *string  `mapstructure:\"path-except\"`\n\tText       *string  `mapstructure:\"text\"`\n\tSource     *string  `mapstructure:\"source\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/config.go",
    "content": "package versionone\n\ntype Config struct {\n\tVersion string `mapstructure:\"version\"` // From v2, to be able to detect already migrated config file.\n\n\tRun Run `mapstructure:\"run\"`\n\n\tOutput Output `mapstructure:\"output\"`\n\n\tLintersSettings LintersSettings `mapstructure:\"linters-settings\"`\n\tLinters         Linters         `mapstructure:\"linters\"`\n\tIssues          Issues          `mapstructure:\"issues\"`\n\tSeverity        Severity        `mapstructure:\"severity\"`\n}\n\nfunc NewConfig() *Config {\n\treturn &Config{}\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/doc.go",
    "content": "// Package versionone contains a modified copy of v1 configuration.\n// The structures are altered to use pointer on builtin types.\n// The field version is added to enforce the detection of already migrated file.\npackage versionone\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/issues.go",
    "content": "package versionone\n\ntype Issues struct {\n\tIncludeDefaultExcludes []string      `mapstructure:\"include\"`\n\tExcludeCaseSensitive   *bool         `mapstructure:\"exclude-case-sensitive\"`\n\tExcludePatterns        []string      `mapstructure:\"exclude\"`\n\tExcludeRules           []ExcludeRule `mapstructure:\"exclude-rules\"`\n\tUseDefaultExcludes     *bool         `mapstructure:\"exclude-use-default\"`\n\n\tExcludeGenerated *string `mapstructure:\"exclude-generated\"`\n\n\tExcludeFiles []string `mapstructure:\"exclude-files\"`\n\tExcludeDirs  []string `mapstructure:\"exclude-dirs\"`\n\n\tUseDefaultExcludeDirs *bool `mapstructure:\"exclude-dirs-use-default\"`\n\n\tMaxIssuesPerLinter *int  `mapstructure:\"max-issues-per-linter\"`\n\tMaxSameIssues      *int  `mapstructure:\"max-same-issues\"`\n\tUniqByLine         *bool `mapstructure:\"uniq-by-line\"`\n\n\tDiffFromRevision  *string `mapstructure:\"new-from-rev\"`\n\tDiffFromMergeBase *string `mapstructure:\"new-from-merge-base\"`\n\tDiffPatchFilePath *string `mapstructure:\"new-from-patch\"`\n\tWholeFiles        *bool   `mapstructure:\"whole-files\"`\n\tDiff              *bool   `mapstructure:\"new\"`\n\n\tNeedFix *bool `mapstructure:\"fix\"`\n}\n\ntype ExcludeRule struct {\n\tBaseRule `mapstructure:\",squash\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/linters.go",
    "content": "package versionone\n\ntype Linters struct {\n\tEnable     []string `mapstructure:\"enable\"`\n\tDisable    []string `mapstructure:\"disable\"`\n\tEnableAll  *bool    `mapstructure:\"enable-all\"`\n\tDisableAll *bool    `mapstructure:\"disable-all\"`\n\tFast       *bool    `mapstructure:\"fast\"`\n\n\tPresets []string `mapstructure:\"presets\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/linters_settings.go",
    "content": "package versionone\n\nimport (\n\t\"encoding\"\n\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n)\n\ntype LintersSettings struct {\n\tAsasalint       AsasalintSettings       `mapstructure:\"asasalint\"`\n\tBiDiChk         BiDiChkSettings         `mapstructure:\"bidichk\"`\n\tCopyLoopVar     CopyLoopVarSettings     `mapstructure:\"copyloopvar\"`\n\tCyclop          Cyclop                  `mapstructure:\"cyclop\"`\n\tDecorder        DecorderSettings        `mapstructure:\"decorder\"`\n\tDepguard        DepGuardSettings        `mapstructure:\"depguard\"`\n\tDogsled         DogsledSettings         `mapstructure:\"dogsled\"`\n\tDupl            DuplSettings            `mapstructure:\"dupl\"`\n\tDupWord         DupWordSettings         `mapstructure:\"dupword\"`\n\tErrcheck        ErrcheckSettings        `mapstructure:\"errcheck\"`\n\tErrChkJSON      ErrChkJSONSettings      `mapstructure:\"errchkjson\"`\n\tErrorLint       ErrorLintSettings       `mapstructure:\"errorlint\"`\n\tExhaustive      ExhaustiveSettings      `mapstructure:\"exhaustive\"`\n\tExhaustruct     ExhaustructSettings     `mapstructure:\"exhaustruct\"`\n\tFatcontext      FatcontextSettings      `mapstructure:\"fatcontext\"`\n\tForbidigo       ForbidigoSettings       `mapstructure:\"forbidigo\"`\n\tFunlen          FunlenSettings          `mapstructure:\"funlen\"`\n\tGinkgoLinter    GinkgoLinterSettings    `mapstructure:\"ginkgolinter\"`\n\tGocognit        GocognitSettings        `mapstructure:\"gocognit\"`\n\tGoChecksumType  GoChecksumTypeSettings  `mapstructure:\"gochecksumtype\"`\n\tGoconst         GoConstSettings         `mapstructure:\"goconst\"`\n\tGocritic        GoCriticSettings        `mapstructure:\"gocritic\"`\n\tGocyclo         GoCycloSettings         `mapstructure:\"gocyclo\"`\n\tGodot           GodotSettings           `mapstructure:\"godot\"`\n\tGodox           GodoxSettings           `mapstructure:\"godox\"`\n\tGoheader        GoHeaderSettings        `mapstructure:\"goheader\"`\n\tGoModDirectives GoModDirectivesSettings `mapstructure:\"gomoddirectives\"`\n\tGomodguard      GoModGuardSettings      `mapstructure:\"gomodguard\"`\n\tGosec           GoSecSettings           `mapstructure:\"gosec\"`\n\tGosimple        StaticCheckSettings     `mapstructure:\"gosimple\"`\n\tGosmopolitan    GosmopolitanSettings    `mapstructure:\"gosmopolitan\"`\n\tGovet           GovetSettings           `mapstructure:\"govet\"`\n\tGrouper         GrouperSettings         `mapstructure:\"grouper\"`\n\tIface           IfaceSettings           `mapstructure:\"iface\"`\n\tImportAs        ImportAsSettings        `mapstructure:\"importas\"`\n\tInamedparam     INamedParamSettings     `mapstructure:\"inamedparam\"`\n\tInterfaceBloat  InterfaceBloatSettings  `mapstructure:\"interfacebloat\"`\n\tIreturn         IreturnSettings         `mapstructure:\"ireturn\"`\n\tLll             LllSettings             `mapstructure:\"lll\"`\n\tLoggerCheck     LoggerCheckSettings     `mapstructure:\"loggercheck\"`\n\tMaintIdx        MaintIdxSettings        `mapstructure:\"maintidx\"`\n\tMakezero        MakezeroSettings        `mapstructure:\"makezero\"`\n\tMisspell        MisspellSettings        `mapstructure:\"misspell\"`\n\tMnd             MndSettings             `mapstructure:\"mnd\"`\n\tMustTag         MustTagSettings         `mapstructure:\"musttag\"`\n\tNakedret        NakedretSettings        `mapstructure:\"nakedret\"`\n\tNestif          NestifSettings          `mapstructure:\"nestif\"`\n\tNilNil          NilNilSettings          `mapstructure:\"nilnil\"`\n\tNlreturn        NlreturnSettings        `mapstructure:\"nlreturn\"`\n\tNoLintLint      NoLintLintSettings      `mapstructure:\"nolintlint\"`\n\tNoNamedReturns  NoNamedReturnsSettings  `mapstructure:\"nonamedreturns\"`\n\tParallelTest    ParallelTestSettings    `mapstructure:\"paralleltest\"`\n\tPerfSprint      PerfSprintSettings      `mapstructure:\"perfsprint\"`\n\tPrealloc        PreallocSettings        `mapstructure:\"prealloc\"`\n\tPredeclared     PredeclaredSettings     `mapstructure:\"predeclared\"`\n\tPromlinter      PromlinterSettings      `mapstructure:\"promlinter\"`\n\tProtoGetter     ProtoGetterSettings     `mapstructure:\"protogetter\"`\n\tReassign        ReassignSettings        `mapstructure:\"reassign\"`\n\tRecvcheck       RecvcheckSettings       `mapstructure:\"recvcheck\"`\n\tRevive          ReviveSettings          `mapstructure:\"revive\"`\n\tRowsErrCheck    RowsErrCheckSettings    `mapstructure:\"rowserrcheck\"`\n\tSlogLint        SlogLintSettings        `mapstructure:\"sloglint\"`\n\tSpancheck       SpancheckSettings       `mapstructure:\"spancheck\"`\n\tStaticcheck     StaticCheckSettings     `mapstructure:\"staticcheck\"`\n\tStylecheck      StaticCheckSettings     `mapstructure:\"stylecheck\"`\n\tTagAlign        TagAlignSettings        `mapstructure:\"tagalign\"`\n\tTagliatelle     TagliatelleSettings     `mapstructure:\"tagliatelle\"`\n\tTenv            TenvSettings            `mapstructure:\"tenv\"`\n\tTestifylint     TestifylintSettings     `mapstructure:\"testifylint\"`\n\tTestpackage     TestpackageSettings     `mapstructure:\"testpackage\"`\n\tThelper         ThelperSettings         `mapstructure:\"thelper\"`\n\tUnconvert       UnconvertSettings       `mapstructure:\"unconvert\"`\n\tUnparam         UnparamSettings         `mapstructure:\"unparam\"`\n\tUnused          UnusedSettings          `mapstructure:\"unused\"`\n\tUseStdlibVars   UseStdlibVarsSettings   `mapstructure:\"usestdlibvars\"`\n\tUseTesting      UseTestingSettings      `mapstructure:\"usetesting\"`\n\tVarnamelen      VarnamelenSettings      `mapstructure:\"varnamelen\"`\n\tWhitespace      WhitespaceSettings      `mapstructure:\"whitespace\"`\n\tWrapcheck       WrapcheckSettings       `mapstructure:\"wrapcheck\"`\n\tWSL             WSLSettings             `mapstructure:\"wsl\"`\n\n\tCustom map[string]CustomLinterSettings `mapstructure:\"custom\"`\n\n\tGci       GciSettings       `mapstructure:\"gci\"`\n\tGoFmt     GoFmtSettings     `mapstructure:\"gofmt\"`\n\tGoFumpt   GoFumptSettings   `mapstructure:\"gofumpt\"`\n\tGoImports GoImportsSettings `mapstructure:\"goimports\"`\n}\n\ntype AsasalintSettings struct {\n\tExclude              []string `mapstructure:\"exclude\"`\n\tUseBuiltinExclusions *bool    `mapstructure:\"use-builtin-exclusions\"`\n\tIgnoreTest           *bool    `mapstructure:\"ignore-test\"`\n}\n\ntype BiDiChkSettings struct {\n\tLeftToRightEmbedding     *bool `mapstructure:\"left-to-right-embedding\"`\n\tRightToLeftEmbedding     *bool `mapstructure:\"right-to-left-embedding\"`\n\tPopDirectionalFormatting *bool `mapstructure:\"pop-directional-formatting\"`\n\tLeftToRightOverride      *bool `mapstructure:\"left-to-right-override\"`\n\tRightToLeftOverride      *bool `mapstructure:\"right-to-left-override\"`\n\tLeftToRightIsolate       *bool `mapstructure:\"left-to-right-isolate\"`\n\tRightToLeftIsolate       *bool `mapstructure:\"right-to-left-isolate\"`\n\tFirstStrongIsolate       *bool `mapstructure:\"first-strong-isolate\"`\n\tPopDirectionalIsolate    *bool `mapstructure:\"pop-directional-isolate\"`\n}\n\ntype CopyLoopVarSettings struct {\n\tCheckAlias *bool `mapstructure:\"check-alias\"`\n\n\t// Deprecated: use CheckAlias\n\tIgnoreAlias *bool `mapstructure:\"ignore-alias\"`\n}\n\ntype Cyclop struct {\n\tMaxComplexity  *int     `mapstructure:\"max-complexity\"`\n\tPackageAverage *float64 `mapstructure:\"package-average\"`\n\tSkipTests      *bool    `mapstructure:\"skip-tests\"`\n}\n\ntype DepGuardSettings struct {\n\tRules map[string]*DepGuardList `mapstructure:\"rules\"`\n}\n\ntype DepGuardList struct {\n\tListMode *string        `mapstructure:\"list-mode\"`\n\tFiles    []string       `mapstructure:\"files\"`\n\tAllow    []string       `mapstructure:\"allow\"`\n\tDeny     []DepGuardDeny `mapstructure:\"deny\"`\n}\n\ntype DepGuardDeny struct {\n\tPkg  *string `mapstructure:\"pkg\"`\n\tDesc *string `mapstructure:\"desc\"`\n}\n\ntype DecorderSettings struct {\n\tDecOrder                  []string `mapstructure:\"dec-order\"`\n\tIgnoreUnderscoreVars      *bool    `mapstructure:\"ignore-underscore-vars\"`\n\tDisableDecNumCheck        *bool    `mapstructure:\"disable-dec-num-check\"`\n\tDisableTypeDecNumCheck    *bool    `mapstructure:\"disable-type-dec-num-check\"`\n\tDisableConstDecNumCheck   *bool    `mapstructure:\"disable-const-dec-num-check\"`\n\tDisableVarDecNumCheck     *bool    `mapstructure:\"disable-var-dec-num-check\"`\n\tDisableDecOrderCheck      *bool    `mapstructure:\"disable-dec-order-check\"`\n\tDisableInitFuncFirstCheck *bool    `mapstructure:\"disable-init-func-first-check\"`\n}\n\ntype DogsledSettings struct {\n\tMaxBlankIdentifiers *int `mapstructure:\"max-blank-identifiers\"`\n}\n\ntype DuplSettings struct {\n\tThreshold *int `mapstructure:\"threshold\"`\n}\n\ntype DupWordSettings struct {\n\tKeywords []string `mapstructure:\"keywords\"`\n\tIgnore   []string `mapstructure:\"ignore\"`\n}\n\ntype ErrcheckSettings struct {\n\tDisableDefaultExclusions *bool    `mapstructure:\"disable-default-exclusions\"`\n\tCheckTypeAssertions      *bool    `mapstructure:\"check-type-assertions\"`\n\tCheckAssignToBlank       *bool    `mapstructure:\"check-blank\"`\n\tExcludeFunctions         []string `mapstructure:\"exclude-functions\"`\n\n\t// Deprecated: use ExcludeFunctions instead\n\tExclude *string `mapstructure:\"exclude\"`\n\n\t// Deprecated: use ExcludeFunctions instead\n\tIgnore *string `mapstructure:\"ignore\"`\n}\n\ntype ErrChkJSONSettings struct {\n\tCheckErrorFreeEncoding *bool `mapstructure:\"check-error-free-encoding\"`\n\tReportNoExported       *bool `mapstructure:\"report-no-exported\"`\n}\n\ntype ErrorLintSettings struct {\n\tErrorf                *bool                `mapstructure:\"errorf\"`\n\tErrorfMulti           *bool                `mapstructure:\"errorf-multi\"`\n\tAsserts               *bool                `mapstructure:\"asserts\"`\n\tComparison            *bool                `mapstructure:\"comparison\"`\n\tAllowedErrors         []ErrorLintAllowPair `mapstructure:\"allowed-errors\"`\n\tAllowedErrorsWildcard []ErrorLintAllowPair `mapstructure:\"allowed-errors-wildcard\"`\n}\n\ntype ErrorLintAllowPair struct {\n\tErr *string `mapstructure:\"err\"`\n\tFun *string `mapstructure:\"fun\"`\n}\n\ntype ExhaustiveSettings struct {\n\tCheck                      []string `mapstructure:\"check\"`\n\tCheckGenerated             *bool    `mapstructure:\"check-generated\"`\n\tDefaultSignifiesExhaustive *bool    `mapstructure:\"default-signifies-exhaustive\"`\n\tIgnoreEnumMembers          *string  `mapstructure:\"ignore-enum-members\"`\n\tIgnoreEnumTypes            *string  `mapstructure:\"ignore-enum-types\"`\n\tPackageScopeOnly           *bool    `mapstructure:\"package-scope-only\"`\n\tExplicitExhaustiveMap      *bool    `mapstructure:\"explicit-exhaustive-map\"`\n\tExplicitExhaustiveSwitch   *bool    `mapstructure:\"explicit-exhaustive-switch\"`\n\tDefaultCaseRequired        *bool    `mapstructure:\"default-case-required\"`\n}\n\ntype ExhaustructSettings struct {\n\tInclude []string `mapstructure:\"include\"`\n\tExclude []string `mapstructure:\"exclude\"`\n}\n\ntype FatcontextSettings struct {\n\tCheckStructPointers *bool `mapstructure:\"check-struct-pointers\"`\n}\n\ntype ForbidigoSettings struct {\n\tForbid               []ForbidigoPattern `mapstructure:\"forbid\"`\n\tExcludeGodocExamples *bool              `mapstructure:\"exclude-godoc-examples\"`\n\tAnalyzeTypes         *bool              `mapstructure:\"analyze-types\"`\n}\n\nvar _ encoding.TextUnmarshaler = &ForbidigoPattern{}\n\n// ForbidigoPattern corresponds to forbidigo.pattern and adds mapstructure support.\n// The YAML field names must match what forbidigo expects.\ntype ForbidigoPattern struct {\n\t// patternString gets populated when the config contains a *string as entry in ForbidigoSettings.Forbid[]\n\t// because ForbidigoPattern implements encoding.TextUnmarshaler\n\t// and the reader uses the mapstructure.TextUnmarshallerHookFunc as decoder hook.\n\t//\n\t// If the entry is a map, then the other fields are set as usual by mapstructure.\n\tpatternString *string\n\tPattern       *string `yaml:\"p\" mapstructure:\"p\"`\n\tPackage       *string `yaml:\"pkg,omitempty\" mapstructure:\"pkg,omitempty\"`\n\tMsg           *string `yaml:\"msg,omitempty\" mapstructure:\"msg,omitempty\"`\n}\n\nfunc (p *ForbidigoPattern) UnmarshalText(text []byte) error {\n\t// Validation happens when instantiating forbidigo.\n\tp.patternString = ptr.Pointer(string(text))\n\treturn nil\n}\n\n// MarshalString converts the pattern into a *string as needed by forbidigo.NewLinter.\n//\n// MarshalString is intentionally not called MarshalText,\n// although it has the same signature\n// because implementing encoding.TextMarshaler led to infinite recursion when yaml.Marshal called MarshalText.\nfunc (p *ForbidigoPattern) MarshalString() ([]byte, error) {\n\tif ptr.Deref(p.patternString) != \"\" {\n\t\treturn []byte(ptr.Deref(p.patternString)), nil\n\t}\n\n\treturn yaml.Marshal(p)\n}\n\ntype FunlenSettings struct {\n\tLines          *int  `mapstructure:\"lines\"`\n\tStatements     *int  `mapstructure:\"statements\"`\n\tIgnoreComments *bool `mapstructure:\"ignore-comments\"`\n}\n\ntype GinkgoLinterSettings struct {\n\tSuppressLenAssertion       *bool `mapstructure:\"suppress-len-assertion\"`\n\tSuppressNilAssertion       *bool `mapstructure:\"suppress-nil-assertion\"`\n\tSuppressErrAssertion       *bool `mapstructure:\"suppress-err-assertion\"`\n\tSuppressCompareAssertion   *bool `mapstructure:\"suppress-compare-assertion\"`\n\tSuppressAsyncAssertion     *bool `mapstructure:\"suppress-async-assertion\"`\n\tSuppressTypeCompareWarning *bool `mapstructure:\"suppress-type-compare-assertion\"`\n\tForbidFocusContainer       *bool `mapstructure:\"forbid-focus-container\"`\n\tAllowHaveLenZero           *bool `mapstructure:\"allow-havelen-zero\"`\n\tForceExpectTo              *bool `mapstructure:\"force-expect-to\"`\n\tValidateAsyncIntervals     *bool `mapstructure:\"validate-async-intervals\"`\n\tForbidSpecPollution        *bool `mapstructure:\"forbid-spec-pollution\"`\n\tForceSucceedForFuncs       *bool `mapstructure:\"force-succeed\"`\n}\n\ntype GoChecksumTypeSettings struct {\n\tDefaultSignifiesExhaustive *bool `mapstructure:\"default-signifies-exhaustive\"`\n\tIncludeSharedInterfaces    *bool `mapstructure:\"include-shared-interfaces\"`\n}\n\ntype GocognitSettings struct {\n\tMinComplexity *int `mapstructure:\"min-complexity\"`\n}\n\ntype GoConstSettings struct {\n\tIgnoreStrings       *string `mapstructure:\"ignore-strings\"`\n\tIgnoreTests         *bool   `mapstructure:\"ignore-tests\"`\n\tMatchWithConstants  *bool   `mapstructure:\"match-constant\"`\n\tMinStringLen        *int    `mapstructure:\"min-len\"`\n\tMinOccurrencesCount *int    `mapstructure:\"min-occurrences\"`\n\tParseNumbers        *bool   `mapstructure:\"numbers\"`\n\tNumberMin           *int    `mapstructure:\"min\"`\n\tNumberMax           *int    `mapstructure:\"max\"`\n\tIgnoreCalls         *bool   `mapstructure:\"ignore-calls\"`\n}\n\ntype GoCriticSettings struct {\n\tGo               *string                          `mapstructure:\"-\"`\n\tDisableAll       *bool                            `mapstructure:\"disable-all\"`\n\tEnabledChecks    []string                         `mapstructure:\"enabled-checks\"`\n\tEnableAll        *bool                            `mapstructure:\"enable-all\"`\n\tDisabledChecks   []string                         `mapstructure:\"disabled-checks\"`\n\tEnabledTags      []string                         `mapstructure:\"enabled-tags\"`\n\tDisabledTags     []string                         `mapstructure:\"disabled-tags\"`\n\tSettingsPerCheck map[string]GoCriticCheckSettings `mapstructure:\"settings\"`\n}\n\ntype GoCriticCheckSettings map[string]any\n\ntype GoCycloSettings struct {\n\tMinComplexity *int `mapstructure:\"min-complexity\"`\n}\n\ntype GodotSettings struct {\n\tScope   *string  `mapstructure:\"scope\"`\n\tExclude []string `mapstructure:\"exclude\"`\n\tCapital *bool    `mapstructure:\"capital\"`\n\tPeriod  *bool    `mapstructure:\"period\"`\n\n\t// Deprecated: use Scope instead\n\tCheckAll *bool `mapstructure:\"check-all\"`\n}\n\ntype GodoxSettings struct {\n\tKeywords []string `mapstructure:\"keywords\"`\n}\n\ntype GoHeaderSettings struct {\n\tValues       map[string]map[string]string `mapstructure:\"values\"`\n\tTemplate     *string                      `mapstructure:\"template\"`\n\tTemplatePath *string                      `mapstructure:\"template-path\"`\n}\n\ntype GoModDirectivesSettings struct {\n\tReplaceAllowList          []string `mapstructure:\"replace-allow-list\"`\n\tReplaceLocal              *bool    `mapstructure:\"replace-local\"`\n\tExcludeForbidden          *bool    `mapstructure:\"exclude-forbidden\"`\n\tRetractAllowNoExplanation *bool    `mapstructure:\"retract-allow-no-explanation\"`\n\tToolchainForbidden        *bool    `mapstructure:\"toolchain-forbidden\"`\n\tToolchainPattern          *string  `mapstructure:\"toolchain-pattern\"`\n\tToolForbidden             *bool    `mapstructure:\"tool-forbidden\"`\n\tGoDebugForbidden          *bool    `mapstructure:\"go-debug-forbidden\"`\n\tGoVersionPattern          *string  `mapstructure:\"go-version-pattern\"`\n}\n\ntype GoModGuardSettings struct {\n\tAllowed struct {\n\t\tModules []string `mapstructure:\"modules\"`\n\t\tDomains []string `mapstructure:\"domains\"`\n\t} `mapstructure:\"allowed\"`\n\tBlocked struct {\n\t\tModules []map[string]struct {\n\t\t\tRecommendations []string `mapstructure:\"recommendations\"`\n\t\t\tReason          *string  `mapstructure:\"reason\"`\n\t\t} `mapstructure:\"modules\"`\n\t\tVersions []map[string]struct {\n\t\t\tVersion *string `mapstructure:\"version\"`\n\t\t\tReason  *string `mapstructure:\"reason\"`\n\t\t} `mapstructure:\"versions\"`\n\t\tLocalReplaceDirectives *bool `mapstructure:\"local_replace_directives\"`\n\t} `mapstructure:\"blocked\"`\n}\n\ntype GoSecSettings struct {\n\tIncludes         []string       `mapstructure:\"includes\"`\n\tExcludes         []string       `mapstructure:\"excludes\"`\n\tSeverity         *string        `mapstructure:\"severity\"`\n\tConfidence       *string        `mapstructure:\"confidence\"`\n\tExcludeGenerated *bool          `mapstructure:\"exclude-generated\"`\n\tConfig           map[string]any `mapstructure:\"config\"`\n\tConcurrency      *int           `mapstructure:\"concurrency\"`\n}\n\ntype GosmopolitanSettings struct {\n\tAllowTimeLocal  *bool    `mapstructure:\"allow-time-local\"`\n\tEscapeHatches   []string `mapstructure:\"escape-hatches\"`\n\tIgnoreTests     *bool    `mapstructure:\"ignore-tests\"`\n\tWatchForScripts []string `mapstructure:\"watch-for-scripts\"`\n}\n\ntype GovetSettings struct {\n\tGo *string `mapstructure:\"-\"`\n\n\tEnable     []string `mapstructure:\"enable\"`\n\tDisable    []string `mapstructure:\"disable\"`\n\tEnableAll  *bool    `mapstructure:\"enable-all\"`\n\tDisableAll *bool    `mapstructure:\"disable-all\"`\n\n\tSettings map[string]map[string]any `mapstructure:\"settings\"`\n\n\t// Deprecated: the linter should be enabled inside Enable.\n\tCheckShadowing *bool `mapstructure:\"check-shadowing\"`\n}\n\ntype GrouperSettings struct {\n\tConstRequireSingleConst   *bool `mapstructure:\"const-require-single-const\"`\n\tConstRequireGrouping      *bool `mapstructure:\"const-require-grouping\"`\n\tImportRequireSingleImport *bool `mapstructure:\"import-require-single-import\"`\n\tImportRequireGrouping     *bool `mapstructure:\"import-require-grouping\"`\n\tTypeRequireSingleType     *bool `mapstructure:\"type-require-single-type\"`\n\tTypeRequireGrouping       *bool `mapstructure:\"type-require-grouping\"`\n\tVarRequireSingleVar       *bool `mapstructure:\"var-require-single-var\"`\n\tVarRequireGrouping        *bool `mapstructure:\"var-require-grouping\"`\n}\n\ntype IfaceSettings struct {\n\tEnable   []string                  `mapstructure:\"enable\"`\n\tSettings map[string]map[string]any `mapstructure:\"settings\"`\n}\n\ntype ImportAsSettings struct {\n\tAlias          []ImportAsAlias `mapstructure:\"alias\"`\n\tNoUnaliased    *bool           `mapstructure:\"no-unaliased\"`\n\tNoExtraAliases *bool           `mapstructure:\"no-extra-aliases\"`\n}\n\ntype ImportAsAlias struct {\n\tPkg   *string `mapstructure:\"pkg\"`\n\tAlias *string `mapstructure:\"alias\"`\n}\n\ntype INamedParamSettings struct {\n\tSkipSingleParam *bool `mapstructure:\"skip-single-param\"`\n}\n\ntype InterfaceBloatSettings struct {\n\tMax *int `mapstructure:\"max\"`\n}\n\ntype IreturnSettings struct {\n\tAllow  []string `mapstructure:\"allow\"`\n\tReject []string `mapstructure:\"reject\"`\n}\n\ntype LllSettings struct {\n\tLineLength *int `mapstructure:\"line-length\"`\n\tTabWidth   *int `mapstructure:\"tab-width\"`\n}\n\ntype LoggerCheckSettings struct {\n\tKitlog           *bool    `mapstructure:\"kitlog\"`\n\tKlog             *bool    `mapstructure:\"klog\"`\n\tLogr             *bool    `mapstructure:\"logr\"`\n\tSlog             *bool    `mapstructure:\"slog\"`\n\tZap              *bool    `mapstructure:\"zap\"`\n\tRequireStringKey *bool    `mapstructure:\"require-string-key\"`\n\tNoPrintfLike     *bool    `mapstructure:\"no-printf-like\"`\n\tRules            []string `mapstructure:\"rules\"`\n}\n\ntype MaintIdxSettings struct {\n\tUnder *int `mapstructure:\"under\"`\n}\n\ntype MakezeroSettings struct {\n\tAlways *bool `mapstructure:\"always\"`\n}\n\ntype MisspellSettings struct {\n\tMode       *string              `mapstructure:\"mode\"`\n\tLocale     *string              `mapstructure:\"locale\"`\n\tExtraWords []MisspellExtraWords `mapstructure:\"extra-words\"`\n\t// TODO(ldez): v2 the option must be renamed to `IgnoredRules`.\n\tIgnoreWords []string `mapstructure:\"ignore-words\"`\n}\n\ntype MisspellExtraWords struct {\n\tTypo       *string `mapstructure:\"typo\"`\n\tCorrection *string `mapstructure:\"correction\"`\n}\n\ntype MustTagSettings struct {\n\tFunctions []struct {\n\t\tName   *string `mapstructure:\"name\"`\n\t\tTag    *string `mapstructure:\"tag\"`\n\t\tArgPos *int    `mapstructure:\"arg-pos\"`\n\t} `mapstructure:\"functions\"`\n}\n\ntype NakedretSettings struct {\n\tMaxFuncLines *uint `mapstructure:\"max-func-lines\"`\n}\n\ntype NestifSettings struct {\n\tMinComplexity *int `mapstructure:\"min-complexity\"`\n}\n\ntype NilNilSettings struct {\n\tDetectOpposite *bool    `mapstructure:\"detect-opposite\"`\n\tCheckedTypes   []string `mapstructure:\"checked-types\"`\n}\n\ntype NlreturnSettings struct {\n\tBlockSize *int `mapstructure:\"block-size\"`\n}\n\ntype MndSettings struct {\n\tChecks           []string `mapstructure:\"checks\"`\n\tIgnoredNumbers   []string `mapstructure:\"ignored-numbers\"`\n\tIgnoredFiles     []string `mapstructure:\"ignored-files\"`\n\tIgnoredFunctions []string `mapstructure:\"ignored-functions\"`\n}\n\ntype NoLintLintSettings struct {\n\tRequireExplanation *bool    `mapstructure:\"require-explanation\"`\n\tRequireSpecific    *bool    `mapstructure:\"require-specific\"`\n\tAllowNoExplanation []string `mapstructure:\"allow-no-explanation\"`\n\tAllowUnused        *bool    `mapstructure:\"allow-unused\"`\n}\n\ntype NoNamedReturnsSettings struct {\n\tReportErrorInDefer *bool `mapstructure:\"report-error-in-defer\"`\n}\n\ntype ParallelTestSettings struct {\n\tGo                    *string `mapstructure:\"-\"`\n\tIgnoreMissing         *bool   `mapstructure:\"ignore-missing\"`\n\tIgnoreMissingSubtests *bool   `mapstructure:\"ignore-missing-subtests\"`\n}\n\ntype PerfSprintSettings struct {\n\tIntegerFormat *bool `mapstructure:\"integer-format\"`\n\tIntConversion *bool `mapstructure:\"int-conversion\"`\n\n\tErrorFormat *bool `mapstructure:\"error-format\"`\n\tErrError    *bool `mapstructure:\"err-error\"`\n\tErrorF      *bool `mapstructure:\"errorf\"`\n\n\tStringFormat *bool `mapstructure:\"string-format\"`\n\tSprintF1     *bool `mapstructure:\"sprintf1\"`\n\tStrConcat    *bool `mapstructure:\"strconcat\"`\n\n\tBoolFormat *bool `mapstructure:\"bool-format\"`\n\tHexFormat  *bool `mapstructure:\"hex-format\"`\n}\n\ntype PreallocSettings struct {\n\tSimple     *bool `mapstructure:\"simple\"`\n\tRangeLoops *bool `mapstructure:\"range-loops\"`\n\tForLoops   *bool `mapstructure:\"for-loops\"`\n}\n\ntype PredeclaredSettings struct {\n\tIgnore    *string `mapstructure:\"ignore\"`\n\tQualified *bool   `mapstructure:\"q\"`\n}\n\ntype PromlinterSettings struct {\n\tStrict          *bool    `mapstructure:\"strict\"`\n\tDisabledLinters []string `mapstructure:\"disabled-linters\"`\n}\n\ntype ProtoGetterSettings struct {\n\tSkipGeneratedBy         []string `mapstructure:\"skip-generated-by\"`\n\tSkipFiles               []string `mapstructure:\"skip-files\"`\n\tSkipAnyGenerated        *bool    `mapstructure:\"skip-any-generated\"`\n\tReplaceFirstArgInAppend *bool    `mapstructure:\"replace-first-arg-in-append\"`\n}\n\ntype ReassignSettings struct {\n\tPatterns []string `mapstructure:\"patterns\"`\n}\n\ntype RecvcheckSettings struct {\n\tDisableBuiltin *bool    `mapstructure:\"disable-builtin\"`\n\tExclusions     []string `mapstructure:\"exclusions\"`\n}\n\ntype ReviveSettings struct {\n\tGo                    *string  `mapstructure:\"-\"`\n\tMaxOpenFiles          *int     `mapstructure:\"max-open-files\"`\n\tIgnoreGeneratedHeader *bool    `mapstructure:\"ignore-generated-header\"`\n\tConfidence            *float64 `mapstructure:\"confidence\"`\n\tSeverity              *string  `mapstructure:\"severity\"`\n\tEnableAllRules        *bool    `mapstructure:\"enable-all-rules\"`\n\tRules                 []struct {\n\t\tName      *string  `mapstructure:\"name\"`\n\t\tArguments []any    `mapstructure:\"arguments\"`\n\t\tSeverity  *string  `mapstructure:\"severity\"`\n\t\tDisabled  *bool    `mapstructure:\"disabled\"`\n\t\tExclude   []string `mapstructure:\"exclude\"`\n\t} `mapstructure:\"rules\"`\n\tErrorCode   *int `mapstructure:\"error-code\"`\n\tWarningCode *int `mapstructure:\"warning-code\"`\n\tDirectives  []struct {\n\t\tName     *string `mapstructure:\"name\"`\n\t\tSeverity *string `mapstructure:\"severity\"`\n\t} `mapstructure:\"directives\"`\n}\n\ntype RowsErrCheckSettings struct {\n\tPackages []string `mapstructure:\"packages\"`\n}\n\ntype SlogLintSettings struct {\n\tNoMixedArgs    *bool    `mapstructure:\"no-mixed-args\"`\n\tKVOnly         *bool    `mapstructure:\"kv-only\"`\n\tAttrOnly       *bool    `mapstructure:\"attr-only\"`\n\tNoGlobal       *string  `mapstructure:\"no-global\"`\n\tContext        *string  `mapstructure:\"context\"`\n\tStaticMsg      *bool    `mapstructure:\"static-msg\"`\n\tNoRawKeys      *bool    `mapstructure:\"no-raw-keys\"`\n\tKeyNamingCase  *string  `mapstructure:\"key-naming-case\"`\n\tForbiddenKeys  []string `mapstructure:\"forbidden-keys\"`\n\tArgsOnSepLines *bool    `mapstructure:\"args-on-sep-lines\"`\n}\n\ntype SpancheckSettings struct {\n\tChecks                   []string `mapstructure:\"checks\"`\n\tIgnoreCheckSignatures    []string `mapstructure:\"ignore-check-signatures\"`\n\tExtraStartSpanSignatures []string `mapstructure:\"extra-start-span-signatures\"`\n}\n\ntype StaticCheckSettings struct {\n\tChecks                  []string `mapstructure:\"checks\"`\n\tInitialisms             []string `mapstructure:\"initialisms\"`                // only for stylecheck\n\tDotImportWhitelist      []string `mapstructure:\"dot-import-whitelist\"`       // only for stylecheck\n\tHTTPStatusCodeWhitelist []string `mapstructure:\"http-status-code-whitelist\"` // only for stylecheck\n}\n\ntype TagAlignSettings struct {\n\tAlign  *bool    `mapstructure:\"align\"`\n\tSort   *bool    `mapstructure:\"sort\"`\n\tOrder  []string `mapstructure:\"order\"`\n\tStrict *bool    `mapstructure:\"strict\"`\n}\n\ntype TagliatelleSettings struct {\n\tCase TagliatelleCase `mapstructure:\"case\"`\n}\n\ntype TagliatelleCase struct {\n\tTagliatelleBase `mapstructure:\",squash\"`\n\tOverrides       []TagliatelleOverrides `mapstructure:\"overrides\"`\n}\n\ntype TagliatelleOverrides struct {\n\tTagliatelleBase `mapstructure:\",squash\"`\n\tPackage         *string `mapstructure:\"pkg\"`\n\tIgnore          *bool   `mapstructure:\"ignore\"`\n}\n\ntype TagliatelleBase struct {\n\tRules         map[string]string                  `mapstructure:\"rules\"`\n\tExtendedRules map[string]TagliatelleExtendedRule `mapstructure:\"extended-rules\"`\n\tUseFieldName  *bool                              `mapstructure:\"use-field-name\"`\n\tIgnoredFields []string                           `mapstructure:\"ignored-fields\"`\n}\n\ntype TagliatelleExtendedRule struct {\n\tCase                *string         `mapstructure:\"case\"`\n\tExtraInitialisms    *bool           `mapstructure:\"extra-initialisms\"`\n\tInitialismOverrides map[string]bool `mapstructure:\"initialism-overrides\"`\n}\n\ntype TestifylintSettings struct {\n\tEnableAll        *bool    `mapstructure:\"enable-all\"`\n\tDisableAll       *bool    `mapstructure:\"disable-all\"`\n\tEnabledCheckers  []string `mapstructure:\"enable\"`\n\tDisabledCheckers []string `mapstructure:\"disable\"`\n\n\tBoolCompare struct {\n\t\tIgnoreCustomTypes *bool `mapstructure:\"ignore-custom-types\"`\n\t} `mapstructure:\"bool-compare\"`\n\n\tExpectedActual struct {\n\t\tExpVarPattern *string `mapstructure:\"pattern\"`\n\t} `mapstructure:\"expected-actual\"`\n\n\tFormatter struct {\n\t\tCheckFormatString *bool `mapstructure:\"check-format-string\"`\n\t\tRequireFFuncs     *bool `mapstructure:\"require-f-funcs\"`\n\t} `mapstructure:\"formatter\"`\n\n\tGoRequire struct {\n\t\tIgnoreHTTPHandlers *bool `mapstructure:\"ignore-http-handlers\"`\n\t} `mapstructure:\"go-require\"`\n\n\tRequireError struct {\n\t\tFnPattern *string `mapstructure:\"fn-pattern\"`\n\t} `mapstructure:\"require-error\"`\n\n\tSuiteExtraAssertCall struct {\n\t\tMode *string `mapstructure:\"mode\"`\n\t} `mapstructure:\"suite-extra-assert-call\"`\n}\n\ntype TestpackageSettings struct {\n\tSkipRegexp    *string  `mapstructure:\"skip-regexp\"`\n\tAllowPackages []string `mapstructure:\"allow-packages\"`\n}\n\ntype ThelperSettings struct {\n\tTest      ThelperOptions `mapstructure:\"test\"`\n\tFuzz      ThelperOptions `mapstructure:\"fuzz\"`\n\tBenchmark ThelperOptions `mapstructure:\"benchmark\"`\n\tTB        ThelperOptions `mapstructure:\"tb\"`\n}\n\ntype ThelperOptions struct {\n\tFirst *bool `mapstructure:\"first\"`\n\tName  *bool `mapstructure:\"name\"`\n\tBegin *bool `mapstructure:\"begin\"`\n}\n\ntype TenvSettings struct {\n\tAll *bool `mapstructure:\"all\"`\n}\n\ntype UseStdlibVarsSettings struct {\n\tHTTPMethod         *bool `mapstructure:\"http-method\"`\n\tHTTPStatusCode     *bool `mapstructure:\"http-status-code\"`\n\tTimeWeekday        *bool `mapstructure:\"time-weekday\"`\n\tTimeMonth          *bool `mapstructure:\"time-month\"`\n\tTimeLayout         *bool `mapstructure:\"time-layout\"`\n\tCryptoHash         *bool `mapstructure:\"crypto-hash\"`\n\tDefaultRPCPath     *bool `mapstructure:\"default-rpc-path\"`\n\tSQLIsolationLevel  *bool `mapstructure:\"sql-isolation-level\"`\n\tTLSSignatureScheme *bool `mapstructure:\"tls-signature-scheme\"`\n\tConstantKind       *bool `mapstructure:\"constant-kind\"`\n\n\t// Deprecated\n\tOSDevNull *bool `mapstructure:\"os-dev-null\"`\n\t// Deprecated\n\tSyslogPriority *bool `mapstructure:\"syslog-priority\"`\n}\n\ntype UseTestingSettings struct {\n\tContextBackground *bool `mapstructure:\"context-background\"`\n\tContextTodo       *bool `mapstructure:\"context-todo\"`\n\tOSChdir           *bool `mapstructure:\"os-chdir\"`\n\tOSMkdirTemp       *bool `mapstructure:\"os-mkdir-temp\"`\n\tOSSetenv          *bool `mapstructure:\"os-setenv\"`\n\tOSTempDir         *bool `mapstructure:\"os-temp-dir\"`\n\tOSCreateTemp      *bool `mapstructure:\"os-create-temp\"`\n}\n\ntype UnconvertSettings struct {\n\tFastMath *bool `mapstructure:\"fast-math\"`\n\tSafe     *bool `mapstructure:\"safe\"`\n}\n\ntype UnparamSettings struct {\n\tCheckExported *bool   `mapstructure:\"check-exported\"`\n\tAlgo          *string `mapstructure:\"algo\"`\n}\n\ntype UnusedSettings struct {\n\tFieldWritesAreUses     *bool `mapstructure:\"field-writes-are-uses\"`\n\tPostStatementsAreReads *bool `mapstructure:\"post-statements-are-reads\"`\n\tExportedFieldsAreUsed  *bool `mapstructure:\"exported-fields-are-used\"`\n\tParametersAreUsed      *bool `mapstructure:\"parameters-are-used\"`\n\tLocalVariablesAreUsed  *bool `mapstructure:\"local-variables-are-used\"`\n\tGeneratedIsUsed        *bool `mapstructure:\"generated-is-used\"`\n\n\t// Deprecated\n\tExportedIsUsed *bool `mapstructure:\"exported-is-used\"`\n}\n\ntype VarnamelenSettings struct {\n\tMaxDistance        *int     `mapstructure:\"max-distance\"`\n\tMinNameLength      *int     `mapstructure:\"min-name-length\"`\n\tCheckReceiver      *bool    `mapstructure:\"check-receiver\"`\n\tCheckReturn        *bool    `mapstructure:\"check-return\"`\n\tCheckTypeParam     *bool    `mapstructure:\"check-type-param\"`\n\tIgnoreNames        []string `mapstructure:\"ignore-names\"`\n\tIgnoreTypeAssertOk *bool    `mapstructure:\"ignore-type-assert-ok\"`\n\tIgnoreMapIndexOk   *bool    `mapstructure:\"ignore-map-index-ok\"`\n\tIgnoreChanRecvOk   *bool    `mapstructure:\"ignore-chan-recv-ok\"`\n\tIgnoreDecls        []string `mapstructure:\"ignore-decls\"`\n}\n\ntype WhitespaceSettings struct {\n\tMultiIf   *bool `mapstructure:\"multi-if\"`\n\tMultiFunc *bool `mapstructure:\"multi-func\"`\n}\n\ntype WrapcheckSettings struct {\n\tExtraIgnoreSigs []string `mapstructure:\"extra-ignore-sigs\"`\n\t// TODO(ldez): v2 the options must be renamed to use hyphen.\n\tIgnoreSigs             []string `mapstructure:\"ignoreSigs\"`\n\tIgnoreSigRegexps       []string `mapstructure:\"ignoreSigRegexps\"`\n\tIgnorePackageGlobs     []string `mapstructure:\"ignorePackageGlobs\"`\n\tIgnoreInterfaceRegexps []string `mapstructure:\"ignoreInterfaceRegexps\"`\n}\n\ntype WSLSettings struct {\n\tStrictAppend                     *bool    `mapstructure:\"strict-append\"`\n\tAllowAssignAndCallCuddle         *bool    `mapstructure:\"allow-assign-and-call\"`\n\tAllowAssignAndAnythingCuddle     *bool    `mapstructure:\"allow-assign-and-anything\"`\n\tAllowMultiLineAssignCuddle       *bool    `mapstructure:\"allow-multiline-assign\"`\n\tForceCaseTrailingWhitespaceLimit *int     `mapstructure:\"force-case-trailing-whitespace\"`\n\tAllowTrailingComment             *bool    `mapstructure:\"allow-trailing-comment\"`\n\tAllowSeparatedLeadingComment     *bool    `mapstructure:\"allow-separated-leading-comment\"`\n\tAllowCuddleDeclaration           *bool    `mapstructure:\"allow-cuddle-declarations\"`\n\tAllowCuddleWithCalls             []string `mapstructure:\"allow-cuddle-with-calls\"`\n\tAllowCuddleWithRHS               []string `mapstructure:\"allow-cuddle-with-rhs\"`\n\tForceCuddleErrCheckAndAssign     *bool    `mapstructure:\"force-err-cuddling\"`\n\tErrorVariableNames               []string `mapstructure:\"error-variable-names\"`\n\tForceExclusiveShortDeclarations  *bool    `mapstructure:\"force-short-decl-cuddling\"`\n}\n\n// CustomLinterSettings encapsulates the meta-data of a private linter.\ntype CustomLinterSettings struct {\n\t// Type plugin type.\n\t// It can be `goplugin` or `module`.\n\tType *string `mapstructure:\"type\"`\n\n\t// Path to a plugin *.so file that implements the private linter.\n\t// Only for Go plugin system.\n\tPath *string `mapstructure:\"path\"`\n\n\t// Description describes the purpose of the private linter.\n\tDescription *string `mapstructure:\"description\"`\n\t// OriginalURL The URL containing the source code for the private linter.\n\tOriginalURL *string `mapstructure:\"original-url\"`\n\n\t// Settings plugin settings only work with linterdb.PluginConstructor symbol.\n\tSettings any `mapstructure:\"settings\"`\n}\n\ntype GciSettings struct {\n\tSections         []string `mapstructure:\"sections\"`\n\tNoInlineComments *bool    `mapstructure:\"no-inline-comments\"`\n\tNoPrefixComments *bool    `mapstructure:\"no-prefix-comments\"`\n\tSkipGenerated    *bool    `mapstructure:\"skip-generated\"`\n\tCustomOrder      *bool    `mapstructure:\"custom-order\"`\n\tNoLexOrder       *bool    `mapstructure:\"no-lex-order\"`\n\n\t// Deprecated: use Sections instead.\n\tLocalPrefixes *string `mapstructure:\"local-prefixes\"`\n}\n\ntype GoFmtSettings struct {\n\tSimplify     *bool              `mapstructure:\"simplify\"`\n\tRewriteRules []GoFmtRewriteRule `mapstructure:\"rewrite-rules\"`\n}\n\ntype GoFmtRewriteRule struct {\n\tPattern     *string `mapstructure:\"pattern\"`\n\tReplacement *string `mapstructure:\"replacement\"`\n}\n\ntype GoFumptSettings struct {\n\tModulePath *string `mapstructure:\"module-path\"`\n\tExtraRules *bool   `mapstructure:\"extra-rules\"`\n\n\t// Deprecated: use the global `run.go` instead.\n\tLangVersion *string `mapstructure:\"lang-version\"`\n}\n\ntype GoImportsSettings struct {\n\tLocalPrefixes *string `mapstructure:\"local-prefixes\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/output.go",
    "content": "package versionone\n\nimport (\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/ptr\"\n)\n\ntype Output struct {\n\tFormats         OutputFormats `mapstructure:\"formats\"`\n\tPrintIssuedLine *bool         `mapstructure:\"print-issued-lines\"`\n\tPrintLinterName *bool         `mapstructure:\"print-linter-name\"`\n\tSortResults     *bool         `mapstructure:\"sort-results\"`\n\tSortOrder       []string      `mapstructure:\"sort-order\"`\n\tPathPrefix      *string       `mapstructure:\"path-prefix\"`\n\tShowStats       *bool         `mapstructure:\"show-stats\"`\n}\n\ntype OutputFormat struct {\n\tFormat *string `mapstructure:\"format\"`\n\tPath   *string `mapstructure:\"path\"`\n}\n\ntype OutputFormats []OutputFormat\n\nfunc (p *OutputFormats) UnmarshalText(text []byte) error {\n\tfor item := range strings.SplitSeq(string(text), \",\") {\n\t\tformat, path, _ := strings.Cut(item, \":\")\n\n\t\t*p = append(*p, OutputFormat{\n\t\t\tPath:   ptr.Pointer(path),\n\t\t\tFormat: ptr.Pointer(format),\n\t\t})\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/run.go",
    "content": "package versionone\n\nimport (\n\t\"time\"\n)\n\n// Run encapsulates the config options for running the linter analysis.\ntype Run struct {\n\tTimeout time.Duration `mapstructure:\"timeout\"`\n\n\tConcurrency *int `mapstructure:\"concurrency\"`\n\n\tGo *string `mapstructure:\"go\"`\n\n\tRelativePathMode *string `mapstructure:\"relative-path-mode\"`\n\n\tBuildTags           []string `mapstructure:\"build-tags\"`\n\tModulesDownloadMode *string  `mapstructure:\"modules-download-mode\"`\n\n\tExitCodeIfIssuesFound *int  `mapstructure:\"issues-exit-code\"`\n\tAnalyzeTests          *bool `mapstructure:\"tests\"`\n\n\tAllowParallelRunners *bool `mapstructure:\"allow-parallel-runners\"`\n\tAllowSerialRunners   *bool `mapstructure:\"allow-serial-runners\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versionone/severity.go",
    "content": "package versionone\n\ntype Severity struct {\n\tDefault       *string        `mapstructure:\"default-severity\"`\n\tCaseSensitive *bool          `mapstructure:\"case-sensitive\"`\n\tRules         []SeverityRule `mapstructure:\"rules\"`\n}\n\ntype SeverityRule struct {\n\tBaseRule `mapstructure:\",squash\"`\n\tSeverity *string `mapstructure:\"severity\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/base_rule.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype BaseRule struct {\n\tLinters    []string `yaml:\"linters,omitempty\" toml:\"linters,multiline,omitempty\"`\n\tPath       *string  `yaml:\"path,omitempty\" toml:\"path,multiline,omitempty\"`\n\tPathExcept *string  `yaml:\"path-except,omitempty\" toml:\"path-except,multiline,omitempty\"`\n\tText       *string  `yaml:\"text,omitempty\" toml:\"text,multiline,omitempty\"`\n\tSource     *string  `yaml:\"source,omitempty\" toml:\"source,multiline,omitempty\"`\n\n\tInternalReference *string `yaml:\"-,omitempty\" toml:\"-,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/config.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype Config struct {\n\tVersion *string `yaml:\"version,omitempty\" toml:\"version,multiline,omitempty\"`\n\n\tRun Run `yaml:\"run,omitempty\" toml:\"run,multiline,omitempty\"`\n\n\tOutput Output `yaml:\"output,omitempty\" toml:\"output,multiline,omitempty\"`\n\n\tLinters Linters `yaml:\"linters,omitempty\" toml:\"linters,multiline,omitempty\"`\n\n\tIssues   Issues   `yaml:\"issues,omitempty\" toml:\"issues,multiline,omitempty\"`\n\tSeverity Severity `yaml:\"severity,omitempty\" toml:\"severity,multiline,omitempty\"`\n\n\tFormatters Formatters `yaml:\"formatters,omitempty\" toml:\"formatters,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/formatters.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype Formatters struct {\n\tEnable     []string            `yaml:\"enable,omitempty\" toml:\"enable,multiline,omitempty\"`\n\tSettings   FormatterSettings   `yaml:\"settings,omitempty\" toml:\"settings,multiline,omitempty\"`\n\tExclusions FormatterExclusions `yaml:\"exclusions,omitempty\" toml:\"exclusions,multiline,omitempty\"`\n}\n\ntype FormatterExclusions struct {\n\tGenerated  *string  `yaml:\"generated,omitempty\" toml:\"generated,multiline,omitempty\"`\n\tPaths      []string `yaml:\"paths,omitempty\" toml:\"paths,multiline,omitempty\"`\n\tWarnUnused *bool    `yaml:\"warn-unused,omitempty\" toml:\"warn-unused,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/formatters_settings.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype FormatterSettings struct {\n\tGci       GciSettings       `yaml:\"gci,omitempty\" toml:\"gci,multiline,omitempty\"`\n\tGoFmt     GoFmtSettings     `yaml:\"gofmt,omitempty\" toml:\"gofmt,multiline,omitempty\"`\n\tGoFumpt   GoFumptSettings   `yaml:\"gofumpt,omitempty\" toml:\"gofumpt,multiline,omitempty\"`\n\tGoImports GoImportsSettings `yaml:\"goimports,omitempty\" toml:\"goimports,multiline,omitempty\"`\n\tGoLines   GoLinesSettings   `yaml:\"golines,omitempty\" toml:\"golines,multiline,omitempty\"`\n}\n\ntype GciSettings struct {\n\tSections         []string `yaml:\"sections,omitempty\" toml:\"sections,multiline,omitempty\"`\n\tNoInlineComments *bool    `yaml:\"no-inline-comments,omitempty\" toml:\"no-inline-comments,multiline,omitempty\"`\n\tNoPrefixComments *bool    `yaml:\"no-prefix-comments,omitempty\" toml:\"no-prefix-comments,multiline,omitempty\"`\n\tCustomOrder      *bool    `yaml:\"custom-order,omitempty\" toml:\"custom-order,multiline,omitempty\"`\n\tNoLexOrder       *bool    `yaml:\"no-lex-order,omitempty\" toml:\"no-lex-order,multiline,omitempty\"`\n}\n\ntype GoFmtSettings struct {\n\tSimplify     *bool              `yaml:\"simplify,omitempty\" toml:\"simplify,multiline,omitempty\"`\n\tRewriteRules []GoFmtRewriteRule `yaml:\"rewrite-rules,omitempty\" toml:\"rewrite-rules,multiline,omitempty\"`\n}\n\ntype GoFmtRewriteRule struct {\n\tPattern     *string `yaml:\"pattern,omitempty\" toml:\"pattern,multiline,omitempty\"`\n\tReplacement *string `yaml:\"replacement,omitempty\" toml:\"replacement,multiline,omitempty\"`\n}\n\ntype GoFumptSettings struct {\n\tModulePath *string `yaml:\"module-path,omitempty\" toml:\"module-path,multiline,omitempty\"`\n\tExtraRules *bool   `yaml:\"extra-rules,omitempty\" toml:\"extra-rules,multiline,omitempty\"`\n\n\tLangVersion *string `yaml:\"-,omitempty\" toml:\"-,multiline,omitempty\"`\n}\n\ntype GoImportsSettings struct {\n\tLocalPrefixes []string `yaml:\"local-prefixes,omitempty\" toml:\"local-prefixes,multiline,omitempty\"`\n}\n\ntype GoLinesSettings struct {\n\tMaxLen          *int  `yaml:\"max-len,omitempty\" toml:\"max-len,multiline,omitempty\"`\n\tTabLen          *int  `yaml:\"tab-len,omitempty\" toml:\"tab-len,multiline,omitempty\"`\n\tShortenComments *bool `yaml:\"shorten-comments,omitempty\" toml:\"shorten-comments,multiline,omitempty\"`\n\tReformatTags    *bool `yaml:\"reformat-tags,omitempty\" toml:\"reformat-tags,multiline,omitempty\"`\n\tChainSplitDots  *bool `yaml:\"chain-split-dots,omitempty\" toml:\"chain-split-dots,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/issues.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype Issues struct {\n\tMaxIssuesPerLinter *int  `yaml:\"max-issues-per-linter,omitempty\" toml:\"max-issues-per-linter,multiline,omitempty\"`\n\tMaxSameIssues      *int  `yaml:\"max-same-issues,omitempty\" toml:\"max-same-issues,multiline,omitempty\"`\n\tUniqByLine         *bool `yaml:\"uniq-by-line,omitempty\" toml:\"uniq-by-line,multiline,omitempty\"`\n\n\tDiffFromRevision  *string `yaml:\"new-from-rev,omitempty\" toml:\"new-from-rev,multiline,omitempty\"`\n\tDiffFromMergeBase *string `yaml:\"new-from-merge-base,omitempty\" toml:\"new-from-merge-base,multiline,omitempty\"`\n\tDiffPatchFilePath *string `yaml:\"new-from-patch,omitempty\" toml:\"new-from-patch,multiline,omitempty\"`\n\tWholeFiles        *bool   `yaml:\"whole-files,omitempty\" toml:\"whole-files,multiline,omitempty\"`\n\tDiff              *bool   `yaml:\"new,omitempty\" toml:\"new,multiline,omitempty\"`\n\n\tNeedFix *bool `yaml:\"fix,omitempty\" toml:\"fix,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/linters.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype Linters struct {\n\tDefault  *string  `yaml:\"default,omitempty\" toml:\"default,multiline,omitempty\"`\n\tEnable   []string `yaml:\"enable,omitempty\" toml:\"enable,multiline,omitempty\"`\n\tDisable  []string `yaml:\"disable,omitempty\" toml:\"disable,multiline,omitempty\"`\n\tFastOnly *bool    `yaml:\"fast-only,omitempty\" toml:\"fast-only,multiline,omitempty\"`\n\n\tSettings LintersSettings `yaml:\"settings,omitempty\" toml:\"settings,multiline,omitempty\"`\n\n\tExclusions LinterExclusions `yaml:\"exclusions,omitempty\" toml:\"exclusions,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/linters_exclusions.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype LinterExclusions struct {\n\tGenerated   *string       `yaml:\"generated,omitempty\" toml:\"generated,multiline,omitempty\"`\n\tWarnUnused  *bool         `yaml:\"warn-unused,omitempty\" toml:\"warn-unused,multiline,omitempty\"`\n\tPresets     []string      `yaml:\"presets,omitempty\" toml:\"presets,multiline,omitempty\"`\n\tRules       []ExcludeRule `yaml:\"rules,omitempty\" toml:\"rules,multiline,omitempty\"`\n\tPaths       []string      `yaml:\"paths,omitempty\" toml:\"paths,multiline,omitempty\"`\n\tPathsExcept []string      `yaml:\"paths-except,omitempty\" toml:\"paths-except,multiline,omitempty\"`\n}\n\ntype ExcludeRule struct {\n\tBaseRule `yaml:\",inline\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/linters_settings.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype LintersSettings struct {\n\tFormatterSettings `yaml:\"-,omitempty\" toml:\"-,multiline,omitempty\"`\n\n\tAsasalint                AsasalintSettings                `yaml:\"asasalint,omitempty\" toml:\"asasalint,multiline,omitempty\"`\n\tBiDiChk                  BiDiChkSettings                  `yaml:\"bidichk,omitempty\" toml:\"bidichk,multiline,omitempty\"`\n\tCopyLoopVar              CopyLoopVarSettings              `yaml:\"copyloopvar,omitempty\" toml:\"copyloopvar,multiline,omitempty\"`\n\tCyclop                   CyclopSettings                   `yaml:\"cyclop,omitempty\" toml:\"cyclop,multiline,omitempty\"`\n\tDecorder                 DecorderSettings                 `yaml:\"decorder,omitempty\" toml:\"decorder,multiline,omitempty\"`\n\tDepguard                 DepGuardSettings                 `yaml:\"depguard,omitempty\" toml:\"depguard,multiline,omitempty\"`\n\tDogsled                  DogsledSettings                  `yaml:\"dogsled,omitempty\" toml:\"dogsled,multiline,omitempty\"`\n\tDupl                     DuplSettings                     `yaml:\"dupl,omitempty\" toml:\"dupl,multiline,omitempty\"`\n\tDupWord                  DupWordSettings                  `yaml:\"dupword,omitempty\" toml:\"dupword,multiline,omitempty\"`\n\tEmbeddedStructFieldCheck EmbeddedStructFieldCheckSettings `yaml:\"embeddedstructfieldcheck,omitempty\" toml:\"embeddedstructfieldcheck,multiline,omitempty\"`\n\tErrcheck                 ErrcheckSettings                 `yaml:\"errcheck,omitempty\" toml:\"errcheck,multiline,omitempty\"`\n\tErrChkJSON               ErrChkJSONSettings               `yaml:\"errchkjson,omitempty\" toml:\"errchkjson,multiline,omitempty\"`\n\tErrorLint                ErrorLintSettings                `yaml:\"errorlint,omitempty\" toml:\"errorlint,multiline,omitempty\"`\n\tExhaustive               ExhaustiveSettings               `yaml:\"exhaustive,omitempty\" toml:\"exhaustive,multiline,omitempty\"`\n\tExhaustruct              ExhaustructSettings              `yaml:\"exhaustruct,omitempty\" toml:\"exhaustruct,multiline,omitempty\"`\n\tFatcontext               FatcontextSettings               `yaml:\"fatcontext,omitempty\" toml:\"fatcontext,multiline,omitempty\"`\n\tForbidigo                ForbidigoSettings                `yaml:\"forbidigo,omitempty\" toml:\"forbidigo,multiline,omitempty\"`\n\tFuncOrder                FuncOrderSettings                `yaml:\"funcorder,omitempty\" toml:\"funcorder,multiline,omitempty\"`\n\tFunlen                   FunlenSettings                   `yaml:\"funlen,omitempty\" toml:\"funlen,multiline,omitempty\"`\n\tGinkgoLinter             GinkgoLinterSettings             `yaml:\"ginkgolinter,omitempty\" toml:\"ginkgolinter,multiline,omitempty\"`\n\tGocognit                 GocognitSettings                 `yaml:\"gocognit,omitempty\" toml:\"gocognit,multiline,omitempty\"`\n\tGoChecksumType           GoChecksumTypeSettings           `yaml:\"gochecksumtype,omitempty\" toml:\"gochecksumtype,multiline,omitempty\"`\n\tGoconst                  GoConstSettings                  `yaml:\"goconst,omitempty\" toml:\"goconst,multiline,omitempty\"`\n\tGocritic                 GoCriticSettings                 `yaml:\"gocritic,omitempty\" toml:\"gocritic,multiline,omitempty\"`\n\tGocyclo                  GoCycloSettings                  `yaml:\"gocyclo,omitempty\" toml:\"gocyclo,multiline,omitempty\"`\n\tGodot                    GodotSettings                    `yaml:\"godot,omitempty\" toml:\"godot,multiline,omitempty\"`\n\tGodox                    GodoxSettings                    `yaml:\"godox,omitempty\" toml:\"godox,multiline,omitempty\"`\n\tGoheader                 GoHeaderSettings                 `yaml:\"goheader,omitempty\" toml:\"goheader,multiline,omitempty\"`\n\tGoModDirectives          GoModDirectivesSettings          `yaml:\"gomoddirectives,omitempty\" toml:\"gomoddirectives,multiline,omitempty\"`\n\tGomodguard               GoModGuardSettings               `yaml:\"gomodguard,omitempty\" toml:\"gomodguard,multiline,omitempty\"`\n\tGosec                    GoSecSettings                    `yaml:\"gosec,omitempty\" toml:\"gosec,multiline,omitempty\"`\n\tGosmopolitan             GosmopolitanSettings             `yaml:\"gosmopolitan,omitempty\" toml:\"gosmopolitan,multiline,omitempty\"`\n\tGovet                    GovetSettings                    `yaml:\"govet,omitempty\" toml:\"govet,multiline,omitempty\"`\n\tGrouper                  GrouperSettings                  `yaml:\"grouper,omitempty\" toml:\"grouper,multiline,omitempty\"`\n\tIface                    IfaceSettings                    `yaml:\"iface,omitempty\" toml:\"iface,multiline,omitempty\"`\n\tImportAs                 ImportAsSettings                 `yaml:\"importas,omitempty\" toml:\"importas,multiline,omitempty\"`\n\tInamedparam              INamedParamSettings              `yaml:\"inamedparam,omitempty\" toml:\"inamedparam,multiline,omitempty\"`\n\tInterfaceBloat           InterfaceBloatSettings           `yaml:\"interfacebloat,omitempty\" toml:\"interfacebloat,multiline,omitempty\"`\n\tIreturn                  IreturnSettings                  `yaml:\"ireturn,omitempty\" toml:\"ireturn,multiline,omitempty\"`\n\tLll                      LllSettings                      `yaml:\"lll,omitempty\" toml:\"lll,multiline,omitempty\"`\n\tLoggerCheck              LoggerCheckSettings              `yaml:\"loggercheck,omitempty\" toml:\"loggercheck,multiline,omitempty\"`\n\tMaintIdx                 MaintIdxSettings                 `yaml:\"maintidx,omitempty\" toml:\"maintidx,multiline,omitempty\"`\n\tMakezero                 MakezeroSettings                 `yaml:\"makezero,omitempty\" toml:\"makezero,multiline,omitempty\"`\n\tMisspell                 MisspellSettings                 `yaml:\"misspell,omitempty\" toml:\"misspell,multiline,omitempty\"`\n\tMnd                      MndSettings                      `yaml:\"mnd,omitempty\" toml:\"mnd,multiline,omitempty\"`\n\tMustTag                  MustTagSettings                  `yaml:\"musttag,omitempty\" toml:\"musttag,multiline,omitempty\"`\n\tNakedret                 NakedretSettings                 `yaml:\"nakedret,omitempty\" toml:\"nakedret,multiline,omitempty\"`\n\tNestif                   NestifSettings                   `yaml:\"nestif,omitempty\" toml:\"nestif,multiline,omitempty\"`\n\tNilNil                   NilNilSettings                   `yaml:\"nilnil,omitempty\" toml:\"nilnil,multiline,omitempty\"`\n\tNlreturn                 NlreturnSettings                 `yaml:\"nlreturn,omitempty\" toml:\"nlreturn,multiline,omitempty\"`\n\tNoLintLint               NoLintLintSettings               `yaml:\"nolintlint,omitempty\" toml:\"nolintlint,multiline,omitempty\"`\n\tNoNamedReturns           NoNamedReturnsSettings           `yaml:\"nonamedreturns,omitempty\" toml:\"nonamedreturns,multiline,omitempty\"`\n\tParallelTest             ParallelTestSettings             `yaml:\"paralleltest,omitempty\" toml:\"paralleltest,multiline,omitempty\"`\n\tPerfSprint               PerfSprintSettings               `yaml:\"perfsprint,omitempty\" toml:\"perfsprint,multiline,omitempty\"`\n\tPrealloc                 PreallocSettings                 `yaml:\"prealloc,omitempty\" toml:\"prealloc,multiline,omitempty\"`\n\tPredeclared              PredeclaredSettings              `yaml:\"predeclared,omitempty\" toml:\"predeclared,multiline,omitempty\"`\n\tPromlinter               PromlinterSettings               `yaml:\"promlinter,omitempty\" toml:\"promlinter,multiline,omitempty\"`\n\tProtoGetter              ProtoGetterSettings              `yaml:\"protogetter,omitempty\" toml:\"protogetter,multiline,omitempty\"`\n\tReassign                 ReassignSettings                 `yaml:\"reassign,omitempty\" toml:\"reassign,multiline,omitempty\"`\n\tRecvcheck                RecvcheckSettings                `yaml:\"recvcheck,omitempty\" toml:\"recvcheck,multiline,omitempty\"`\n\tRevive                   ReviveSettings                   `yaml:\"revive,omitempty\" toml:\"revive,multiline,omitempty\"`\n\tRowsErrCheck             RowsErrCheckSettings             `yaml:\"rowserrcheck,omitempty\" toml:\"rowserrcheck,multiline,omitempty\"`\n\tSlogLint                 SlogLintSettings                 `yaml:\"sloglint,omitempty\" toml:\"sloglint,multiline,omitempty\"`\n\tSpancheck                SpancheckSettings                `yaml:\"spancheck,omitempty\" toml:\"spancheck,multiline,omitempty\"`\n\tStaticcheck              StaticCheckSettings              `yaml:\"staticcheck,omitempty\" toml:\"staticcheck,multiline,omitempty\"`\n\tTagAlign                 TagAlignSettings                 `yaml:\"tagalign,omitempty\" toml:\"tagalign,multiline,omitempty\"`\n\tTagliatelle              TagliatelleSettings              `yaml:\"tagliatelle,omitempty\" toml:\"tagliatelle,multiline,omitempty\"`\n\tTestifylint              TestifylintSettings              `yaml:\"testifylint,omitempty\" toml:\"testifylint,multiline,omitempty\"`\n\tTestpackage              TestpackageSettings              `yaml:\"testpackage,omitempty\" toml:\"testpackage,multiline,omitempty\"`\n\tThelper                  ThelperSettings                  `yaml:\"thelper,omitempty\" toml:\"thelper,multiline,omitempty\"`\n\tUnconvert                UnconvertSettings                `yaml:\"unconvert,omitempty\" toml:\"unconvert,multiline,omitempty\"`\n\tUnparam                  UnparamSettings                  `yaml:\"unparam,omitempty\" toml:\"unparam,multiline,omitempty\"`\n\tUnused                   UnusedSettings                   `yaml:\"unused,omitempty\" toml:\"unused,multiline,omitempty\"`\n\tUseStdlibVars            UseStdlibVarsSettings            `yaml:\"usestdlibvars,omitempty\" toml:\"usestdlibvars,multiline,omitempty\"`\n\tUseTesting               UseTestingSettings               `yaml:\"usetesting,omitempty\" toml:\"usetesting,multiline,omitempty\"`\n\tVarnamelen               VarnamelenSettings               `yaml:\"varnamelen,omitempty\" toml:\"varnamelen,multiline,omitempty\"`\n\tWhitespace               WhitespaceSettings               `yaml:\"whitespace,omitempty\" toml:\"whitespace,multiline,omitempty\"`\n\tWrapcheck                WrapcheckSettings                `yaml:\"wrapcheck,omitempty\" toml:\"wrapcheck,multiline,omitempty\"`\n\tWSL                      WSLv4Settings                    `yaml:\"wsl,omitempty\" toml:\"wsl,multiline,omitempty\"`\n\tWSLv5                    WSLv5Settings                    `yaml:\"wsl_v5,omitempty\" toml:\"wsl_v5,multiline,omitempty\"`\n\n\tCustom map[string]CustomLinterSettings `yaml:\"custom,omitempty\" toml:\"custom,multiline,omitempty\"`\n}\n\ntype AsasalintSettings struct {\n\tExclude              []string `yaml:\"exclude,omitempty\" toml:\"exclude,multiline,omitempty\"`\n\tUseBuiltinExclusions *bool    `yaml:\"use-builtin-exclusions,omitempty\" toml:\"use-builtin-exclusions,multiline,omitempty\"`\n}\n\ntype BiDiChkSettings struct {\n\tLeftToRightEmbedding     *bool `yaml:\"left-to-right-embedding,omitempty\" toml:\"left-to-right-embedding,multiline,omitempty\"`\n\tRightToLeftEmbedding     *bool `yaml:\"right-to-left-embedding,omitempty\" toml:\"right-to-left-embedding,multiline,omitempty\"`\n\tPopDirectionalFormatting *bool `yaml:\"pop-directional-formatting,omitempty\" toml:\"pop-directional-formatting,multiline,omitempty\"`\n\tLeftToRightOverride      *bool `yaml:\"left-to-right-override,omitempty\" toml:\"left-to-right-override,multiline,omitempty\"`\n\tRightToLeftOverride      *bool `yaml:\"right-to-left-override,omitempty\" toml:\"right-to-left-override,multiline,omitempty\"`\n\tLeftToRightIsolate       *bool `yaml:\"left-to-right-isolate,omitempty\" toml:\"left-to-right-isolate,multiline,omitempty\"`\n\tRightToLeftIsolate       *bool `yaml:\"right-to-left-isolate,omitempty\" toml:\"right-to-left-isolate,multiline,omitempty\"`\n\tFirstStrongIsolate       *bool `yaml:\"first-strong-isolate,omitempty\" toml:\"first-strong-isolate,multiline,omitempty\"`\n\tPopDirectionalIsolate    *bool `yaml:\"pop-directional-isolate,omitempty\" toml:\"pop-directional-isolate,multiline,omitempty\"`\n}\n\ntype CopyLoopVarSettings struct {\n\tCheckAlias *bool `yaml:\"check-alias,omitempty\" toml:\"check-alias,multiline,omitempty\"`\n}\n\ntype CyclopSettings struct {\n\tMaxComplexity  *int     `yaml:\"max-complexity,omitempty\" toml:\"max-complexity,multiline,omitempty\"`\n\tPackageAverage *float64 `yaml:\"package-average,omitempty\" toml:\"package-average,multiline,omitempty\"`\n}\n\ntype DepGuardSettings struct {\n\tRules map[string]*DepGuardList `yaml:\"rules,omitempty\" toml:\"rules,multiline,omitempty\"`\n}\n\ntype DepGuardList struct {\n\tListMode *string        `yaml:\"list-mode,omitempty\" toml:\"list-mode,multiline,omitempty\"`\n\tFiles    []string       `yaml:\"files,omitempty\" toml:\"files,multiline,omitempty\"`\n\tAllow    []string       `yaml:\"allow,omitempty\" toml:\"allow,multiline,omitempty\"`\n\tDeny     []DepGuardDeny `yaml:\"deny,omitempty\" toml:\"deny,multiline,omitempty\"`\n}\n\ntype DepGuardDeny struct {\n\tPkg  *string `yaml:\"pkg,omitempty\" toml:\"pkg,multiline,omitempty\"`\n\tDesc *string `yaml:\"desc,omitempty\" toml:\"desc,multiline,omitempty\"`\n}\n\ntype DecorderSettings struct {\n\tDecOrder                  []string `yaml:\"dec-order,omitempty\" toml:\"dec-order,multiline,omitempty\"`\n\tIgnoreUnderscoreVars      *bool    `yaml:\"ignore-underscore-vars,omitempty\" toml:\"ignore-underscore-vars,multiline,omitempty\"`\n\tDisableDecNumCheck        *bool    `yaml:\"disable-dec-num-check,omitempty\" toml:\"disable-dec-num-check,multiline,omitempty\"`\n\tDisableTypeDecNumCheck    *bool    `yaml:\"disable-type-dec-num-check,omitempty\" toml:\"disable-type-dec-num-check,multiline,omitempty\"`\n\tDisableConstDecNumCheck   *bool    `yaml:\"disable-const-dec-num-check,omitempty\" toml:\"disable-const-dec-num-check,multiline,omitempty\"`\n\tDisableVarDecNumCheck     *bool    `yaml:\"disable-var-dec-num-check,omitempty\" toml:\"disable-var-dec-num-check,multiline,omitempty\"`\n\tDisableDecOrderCheck      *bool    `yaml:\"disable-dec-order-check,omitempty\" toml:\"disable-dec-order-check,multiline,omitempty\"`\n\tDisableInitFuncFirstCheck *bool    `yaml:\"disable-init-func-first-check,omitempty\" toml:\"disable-init-func-first-check,multiline,omitempty\"`\n}\n\ntype DogsledSettings struct {\n\tMaxBlankIdentifiers *int `yaml:\"max-blank-identifiers,omitempty\" toml:\"max-blank-identifiers,multiline,omitempty\"`\n}\n\ntype DuplSettings struct {\n\tThreshold *int `yaml:\"threshold,omitempty\" toml:\"threshold,multiline,omitempty\"`\n}\n\ntype DupWordSettings struct {\n\tKeywords []string `yaml:\"keywords,omitempty\" toml:\"keywords,multiline,omitempty\"`\n\tIgnore   []string `yaml:\"ignore,omitempty\" toml:\"ignore,multiline,omitempty\"`\n}\n\ntype EmbeddedStructFieldCheckSettings struct {\n\tForbidMutex *bool `yaml:\"forbid-mutex,omitempty\" toml:\"forbid-mutex,multiline,omitempty\"`\n}\n\ntype ErrcheckSettings struct {\n\tDisableDefaultExclusions *bool    `yaml:\"disable-default-exclusions,omitempty\" toml:\"disable-default-exclusions,multiline,omitempty\"`\n\tCheckTypeAssertions      *bool    `yaml:\"check-type-assertions,omitempty\" toml:\"check-type-assertions,multiline,omitempty\"`\n\tCheckAssignToBlank       *bool    `yaml:\"check-blank,omitempty\" toml:\"check-blank,multiline,omitempty\"`\n\tExcludeFunctions         []string `yaml:\"exclude-functions,omitempty\" toml:\"exclude-functions,multiline,omitempty\"`\n\tVerbose                  *bool    `yaml:\"verbose,omitempty\" toml:\"verbose,multiline,omitempty\"`\n}\n\ntype ErrChkJSONSettings struct {\n\tCheckErrorFreeEncoding *bool `yaml:\"check-error-free-encoding,omitempty\" toml:\"check-error-free-encoding,multiline,omitempty\"`\n\tReportNoExported       *bool `yaml:\"report-no-exported,omitempty\" toml:\"report-no-exported,multiline,omitempty\"`\n}\n\ntype ErrorLintSettings struct {\n\tErrorf                *bool                `yaml:\"errorf,omitempty\" toml:\"errorf,multiline,omitempty\"`\n\tErrorfMulti           *bool                `yaml:\"errorf-multi,omitempty\" toml:\"errorf-multi,multiline,omitempty\"`\n\tAsserts               *bool                `yaml:\"asserts,omitempty\" toml:\"asserts,multiline,omitempty\"`\n\tComparison            *bool                `yaml:\"comparison,omitempty\" toml:\"comparison,multiline,omitempty\"`\n\tAllowedErrors         []ErrorLintAllowPair `yaml:\"allowed-errors,omitempty\" toml:\"allowed-errors,multiline,omitempty\"`\n\tAllowedErrorsWildcard []ErrorLintAllowPair `yaml:\"allowed-errors-wildcard,omitempty\" toml:\"allowed-errors-wildcard,multiline,omitempty\"`\n}\n\ntype ErrorLintAllowPair struct {\n\tErr *string `yaml:\"err,omitempty\" toml:\"err,multiline,omitempty\"`\n\tFun *string `yaml:\"fun,omitempty\" toml:\"fun,multiline,omitempty\"`\n}\n\ntype ExhaustiveSettings struct {\n\tCheck                      []string `yaml:\"check,omitempty\" toml:\"check,multiline,omitempty\"`\n\tDefaultSignifiesExhaustive *bool    `yaml:\"default-signifies-exhaustive,omitempty\" toml:\"default-signifies-exhaustive,multiline,omitempty\"`\n\tIgnoreEnumMembers          *string  `yaml:\"ignore-enum-members,omitempty\" toml:\"ignore-enum-members,multiline,omitempty\"`\n\tIgnoreEnumTypes            *string  `yaml:\"ignore-enum-types,omitempty\" toml:\"ignore-enum-types,multiline,omitempty\"`\n\tPackageScopeOnly           *bool    `yaml:\"package-scope-only,omitempty\" toml:\"package-scope-only,multiline,omitempty\"`\n\tExplicitExhaustiveMap      *bool    `yaml:\"explicit-exhaustive-map,omitempty\" toml:\"explicit-exhaustive-map,multiline,omitempty\"`\n\tExplicitExhaustiveSwitch   *bool    `yaml:\"explicit-exhaustive-switch,omitempty\" toml:\"explicit-exhaustive-switch,multiline,omitempty\"`\n\tDefaultCaseRequired        *bool    `yaml:\"default-case-required,omitempty\" toml:\"default-case-required,multiline,omitempty\"`\n}\n\ntype ExhaustructSettings struct {\n\tInclude []string `yaml:\"include,omitempty\" toml:\"include,multiline,omitempty\"`\n\tExclude []string `yaml:\"exclude,omitempty\" toml:\"exclude,multiline,omitempty\"`\n}\n\ntype FatcontextSettings struct {\n\tCheckStructPointers *bool `yaml:\"check-struct-pointers,omitempty\" toml:\"check-struct-pointers,multiline,omitempty\"`\n}\n\ntype ForbidigoSettings struct {\n\tForbid               []ForbidigoPattern `yaml:\"forbid,omitempty\" toml:\"forbid,multiline,omitempty\"`\n\tExcludeGodocExamples *bool              `yaml:\"exclude-godoc-examples,omitempty\" toml:\"exclude-godoc-examples,multiline,omitempty\"`\n\tAnalyzeTypes         *bool              `yaml:\"analyze-types,omitempty\" toml:\"analyze-types,multiline,omitempty\"`\n}\n\ntype ForbidigoPattern struct {\n\tPattern *string `yaml:\"pattern,omitempty\" toml:\"pattern,multiline,omitempty\"`\n\tPackage *string `yaml:\"pkg,omitempty,omitempty\" toml:\"pkg,omitempty,multiline,omitempty\"`\n\tMsg     *string `yaml:\"msg,omitempty,omitempty\" toml:\"msg,omitempty,multiline,omitempty\"`\n}\n\ntype FuncOrderSettings struct {\n\tConstructor  *bool `yaml:\"constructor,omitempty,omitempty\" toml:\"constructor,omitempty,multiline,omitempty\"`\n\tStructMethod *bool `yaml:\"struct-method,omitempty,omitempty\" toml:\"struct-method,omitempty,multiline,omitempty\"`\n\tAlphabetical *bool `yaml:\"alphabetical,omitempty,omitempty\" toml:\"alphabetical,omitempty,multiline,omitempty\"`\n}\n\ntype FunlenSettings struct {\n\tLines          *int  `yaml:\"lines,omitempty\" toml:\"lines,multiline,omitempty\"`\n\tStatements     *int  `yaml:\"statements,omitempty\" toml:\"statements,multiline,omitempty\"`\n\tIgnoreComments *bool `yaml:\"ignore-comments,omitempty\" toml:\"ignore-comments,multiline,omitempty\"`\n}\n\ntype GinkgoLinterSettings struct {\n\tSuppressLenAssertion       *bool `yaml:\"suppress-len-assertion,omitempty\" toml:\"suppress-len-assertion,multiline,omitempty\"`\n\tSuppressNilAssertion       *bool `yaml:\"suppress-nil-assertion,omitempty\" toml:\"suppress-nil-assertion,multiline,omitempty\"`\n\tSuppressErrAssertion       *bool `yaml:\"suppress-err-assertion,omitempty\" toml:\"suppress-err-assertion,multiline,omitempty\"`\n\tSuppressCompareAssertion   *bool `yaml:\"suppress-compare-assertion,omitempty\" toml:\"suppress-compare-assertion,multiline,omitempty\"`\n\tSuppressAsyncAssertion     *bool `yaml:\"suppress-async-assertion,omitempty\" toml:\"suppress-async-assertion,multiline,omitempty\"`\n\tSuppressTypeCompareWarning *bool `yaml:\"suppress-type-compare-assertion,omitempty\" toml:\"suppress-type-compare-assertion,multiline,omitempty\"`\n\tForbidFocusContainer       *bool `yaml:\"forbid-focus-container,omitempty\" toml:\"forbid-focus-container,multiline,omitempty\"`\n\tAllowHaveLenZero           *bool `yaml:\"allow-havelen-zero,omitempty\" toml:\"allow-havelen-zero,multiline,omitempty\"`\n\tForceExpectTo              *bool `yaml:\"force-expect-to,omitempty\" toml:\"force-expect-to,multiline,omitempty\"`\n\tValidateAsyncIntervals     *bool `yaml:\"validate-async-intervals,omitempty\" toml:\"validate-async-intervals,multiline,omitempty\"`\n\tForbidSpecPollution        *bool `yaml:\"forbid-spec-pollution,omitempty\" toml:\"forbid-spec-pollution,multiline,omitempty\"`\n\tForceSucceedForFuncs       *bool `yaml:\"force-succeed,omitempty\" toml:\"force-succeed,multiline,omitempty\"`\n}\n\ntype GoChecksumTypeSettings struct {\n\tDefaultSignifiesExhaustive *bool `yaml:\"default-signifies-exhaustive,omitempty\" toml:\"default-signifies-exhaustive,multiline,omitempty\"`\n\tIncludeSharedInterfaces    *bool `yaml:\"include-shared-interfaces,omitempty\" toml:\"include-shared-interfaces,multiline,omitempty\"`\n}\n\ntype GocognitSettings struct {\n\tMinComplexity *int `yaml:\"min-complexity,omitempty\" toml:\"min-complexity,multiline,omitempty\"`\n}\n\ntype GoConstSettings struct {\n\tIgnoreStringValues   []string `yaml:\"ignore-string-values,omitempty\" toml:\"ignore-string-values,multiline,omitempty\"`\n\tMatchWithConstants   *bool    `yaml:\"match-constant,omitempty\" toml:\"match-constant,multiline,omitempty\"`\n\tMinStringLen         *int     `yaml:\"min-len,omitempty\" toml:\"min-len,multiline,omitempty\"`\n\tMinOccurrencesCount  *int     `yaml:\"min-occurrences,omitempty\" toml:\"min-occurrences,multiline,omitempty\"`\n\tParseNumbers         *bool    `yaml:\"numbers,omitempty\" toml:\"numbers,multiline,omitempty\"`\n\tNumberMin            *int     `yaml:\"min,omitempty\" toml:\"min,multiline,omitempty\"`\n\tNumberMax            *int     `yaml:\"max,omitempty\" toml:\"max,multiline,omitempty\"`\n\tIgnoreCalls          *bool    `yaml:\"ignore-calls,omitempty\" toml:\"ignore-calls,multiline,omitempty\"`\n\tFindDuplicates       *bool    `yaml:\"find-duplicates,omitempty\" toml:\"find-duplicates,multiline,omitempty\"`\n\tEvalConstExpressions *bool    `yaml:\"eval-const-expressions,omitempty\" toml:\"eval-const-expressions,multiline,omitempty\"`\n\n\tIgnoreStrings *string `yaml:\"ignore-strings,omitempty\" toml:\"ignore-strings,multiline,omitempty\"`\n}\n\ntype GoCriticSettings struct {\n\tGo               *string                          `yaml:\"-,omitempty\" toml:\"-,multiline,omitempty\"`\n\tDisableAll       *bool                            `yaml:\"disable-all,omitempty\" toml:\"disable-all,multiline,omitempty\"`\n\tEnabledChecks    []string                         `yaml:\"enabled-checks,omitempty\" toml:\"enabled-checks,multiline,omitempty\"`\n\tEnableAll        *bool                            `yaml:\"enable-all,omitempty\" toml:\"enable-all,multiline,omitempty\"`\n\tDisabledChecks   []string                         `yaml:\"disabled-checks,omitempty\" toml:\"disabled-checks,multiline,omitempty\"`\n\tEnabledTags      []string                         `yaml:\"enabled-tags,omitempty\" toml:\"enabled-tags,multiline,omitempty\"`\n\tDisabledTags     []string                         `yaml:\"disabled-tags,omitempty\" toml:\"disabled-tags,multiline,omitempty\"`\n\tSettingsPerCheck map[string]GoCriticCheckSettings `yaml:\"settings,omitempty\" toml:\"settings,multiline,omitempty\"`\n}\n\ntype GoCriticCheckSettings map[string]any\n\ntype GoCycloSettings struct {\n\tMinComplexity *int `yaml:\"min-complexity,omitempty\" toml:\"min-complexity,multiline,omitempty\"`\n}\n\ntype GodotSettings struct {\n\tScope   *string  `yaml:\"scope,omitempty\" toml:\"scope,multiline,omitempty\"`\n\tExclude []string `yaml:\"exclude,omitempty\" toml:\"exclude,multiline,omitempty\"`\n\tCapital *bool    `yaml:\"capital,omitempty\" toml:\"capital,multiline,omitempty\"`\n\tPeriod  *bool    `yaml:\"period,omitempty\" toml:\"period,multiline,omitempty\"`\n}\n\ntype GodoxSettings struct {\n\tKeywords []string `yaml:\"keywords,omitempty\" toml:\"keywords,multiline,omitempty\"`\n}\n\ntype GoHeaderSettings struct {\n\tValues       map[string]map[string]string `yaml:\"values,omitempty\" toml:\"values,multiline,omitempty\"`\n\tTemplate     *string                      `yaml:\"template,omitempty\" toml:\"template,multiline,omitempty\"`\n\tTemplatePath *string                      `yaml:\"template-path,omitempty\" toml:\"template-path,multiline,omitempty\"`\n}\n\ntype GoModDirectivesSettings struct {\n\tReplaceAllowList          []string `yaml:\"replace-allow-list,omitempty\" toml:\"replace-allow-list,multiline,omitempty\"`\n\tReplaceLocal              *bool    `yaml:\"replace-local,omitempty\" toml:\"replace-local,multiline,omitempty\"`\n\tExcludeForbidden          *bool    `yaml:\"exclude-forbidden,omitempty\" toml:\"exclude-forbidden,multiline,omitempty\"`\n\tRetractAllowNoExplanation *bool    `yaml:\"retract-allow-no-explanation,omitempty\" toml:\"retract-allow-no-explanation,multiline,omitempty\"`\n\tToolchainForbidden        *bool    `yaml:\"toolchain-forbidden,omitempty\" toml:\"toolchain-forbidden,multiline,omitempty\"`\n\tToolchainPattern          *string  `yaml:\"toolchain-pattern,omitempty\" toml:\"toolchain-pattern,multiline,omitempty\"`\n\tToolForbidden             *bool    `yaml:\"tool-forbidden,omitempty\" toml:\"tool-forbidden,multiline,omitempty\"`\n\tGoDebugForbidden          *bool    `yaml:\"go-debug-forbidden,omitempty\" toml:\"go-debug-forbidden,multiline,omitempty\"`\n\tGoVersionPattern          *string  `yaml:\"go-version-pattern,omitempty\" toml:\"go-version-pattern,multiline,omitempty\"`\n}\n\ntype GoModGuardSettings struct {\n\tAllowed GoModGuardAllowed `yaml:\"allowed,omitempty\" toml:\"allowed,multiline,omitempty\"`\n\tBlocked GoModGuardBlocked `yaml:\"blocked,omitempty\" toml:\"blocked,multiline,omitempty\"`\n}\n\ntype GoModGuardAllowed struct {\n\tModules []string `yaml:\"modules,omitempty\" toml:\"modules,multiline,omitempty\"`\n\tDomains []string `yaml:\"domains,omitempty\" toml:\"domains,multiline,omitempty\"`\n}\n\ntype GoModGuardBlocked struct {\n\tModules                []map[string]GoModGuardModule  `yaml:\"modules,omitempty\" toml:\"modules,multiline,omitempty\"`\n\tVersions               []map[string]GoModGuardVersion `yaml:\"versions,omitempty\" toml:\"versions,multiline,omitempty\"`\n\tLocalReplaceDirectives *bool                          `yaml:\"local-replace-directives,omitempty\" toml:\"local-replace-directives,multiline,omitempty\"`\n}\n\ntype GoModGuardModule struct {\n\tRecommendations []string `yaml:\"recommendations,omitempty\" toml:\"recommendations,multiline,omitempty\"`\n\tReason          *string  `yaml:\"reason,omitempty\" toml:\"reason,multiline,omitempty\"`\n}\n\ntype GoModGuardVersion struct {\n\tVersion *string `yaml:\"version,omitempty\" toml:\"version,multiline,omitempty\"`\n\tReason  *string `yaml:\"reason,omitempty\" toml:\"reason,multiline,omitempty\"`\n}\n\ntype GoSecSettings struct {\n\tIncludes    []string       `yaml:\"includes,omitempty\" toml:\"includes,multiline,omitempty\"`\n\tExcludes    []string       `yaml:\"excludes,omitempty\" toml:\"excludes,multiline,omitempty\"`\n\tSeverity    *string        `yaml:\"severity,omitempty\" toml:\"severity,multiline,omitempty\"`\n\tConfidence  *string        `yaml:\"confidence,omitempty\" toml:\"confidence,multiline,omitempty\"`\n\tConfig      map[string]any `yaml:\"config,omitempty\" toml:\"config,multiline,omitempty\"`\n\tConcurrency *int           `yaml:\"concurrency,omitempty\" toml:\"concurrency,multiline,omitempty\"`\n}\n\ntype GosmopolitanSettings struct {\n\tAllowTimeLocal  *bool    `yaml:\"allow-time-local,omitempty\" toml:\"allow-time-local,multiline,omitempty\"`\n\tEscapeHatches   []string `yaml:\"escape-hatches,omitempty\" toml:\"escape-hatches,multiline,omitempty\"`\n\tWatchForScripts []string `yaml:\"watch-for-scripts,omitempty\" toml:\"watch-for-scripts,multiline,omitempty\"`\n}\n\ntype GovetSettings struct {\n\tGo *string `yaml:\"-,omitempty\" toml:\"-,multiline,omitempty\"`\n\n\tEnable     []string `yaml:\"enable,omitempty\" toml:\"enable,multiline,omitempty\"`\n\tDisable    []string `yaml:\"disable,omitempty\" toml:\"disable,multiline,omitempty\"`\n\tEnableAll  *bool    `yaml:\"enable-all,omitempty\" toml:\"enable-all,multiline,omitempty\"`\n\tDisableAll *bool    `yaml:\"disable-all,omitempty\" toml:\"disable-all,multiline,omitempty\"`\n\n\tSettings map[string]map[string]any `yaml:\"settings,omitempty\" toml:\"settings,multiline,omitempty\"`\n}\n\ntype GrouperSettings struct {\n\tConstRequireSingleConst   *bool `yaml:\"const-require-single-const,omitempty\" toml:\"const-require-single-const,multiline,omitempty\"`\n\tConstRequireGrouping      *bool `yaml:\"const-require-grouping,omitempty\" toml:\"const-require-grouping,multiline,omitempty\"`\n\tImportRequireSingleImport *bool `yaml:\"import-require-single-import,omitempty\" toml:\"import-require-single-import,multiline,omitempty\"`\n\tImportRequireGrouping     *bool `yaml:\"import-require-grouping,omitempty\" toml:\"import-require-grouping,multiline,omitempty\"`\n\tTypeRequireSingleType     *bool `yaml:\"type-require-single-type,omitempty\" toml:\"type-require-single-type,multiline,omitempty\"`\n\tTypeRequireGrouping       *bool `yaml:\"type-require-grouping,omitempty\" toml:\"type-require-grouping,multiline,omitempty\"`\n\tVarRequireSingleVar       *bool `yaml:\"var-require-single-var,omitempty\" toml:\"var-require-single-var,multiline,omitempty\"`\n\tVarRequireGrouping        *bool `yaml:\"var-require-grouping,omitempty\" toml:\"var-require-grouping,multiline,omitempty\"`\n}\n\ntype IfaceSettings struct {\n\tEnable   []string                  `yaml:\"enable,omitempty\" toml:\"enable,multiline,omitempty\"`\n\tSettings map[string]map[string]any `yaml:\"settings,omitempty\" toml:\"settings,multiline,omitempty\"`\n}\n\ntype ImportAsSettings struct {\n\tAlias          []ImportAsAlias `yaml:\"alias,omitempty\" toml:\"alias,multiline,omitempty\"`\n\tNoUnaliased    *bool           `yaml:\"no-unaliased,omitempty\" toml:\"no-unaliased,multiline,omitempty\"`\n\tNoExtraAliases *bool           `yaml:\"no-extra-aliases,omitempty\" toml:\"no-extra-aliases,multiline,omitempty\"`\n}\n\ntype ImportAsAlias struct {\n\tPkg   *string `yaml:\"pkg,omitempty\" toml:\"pkg,multiline,omitempty\"`\n\tAlias *string `yaml:\"alias,omitempty\" toml:\"alias,multiline,omitempty\"`\n}\n\ntype INamedParamSettings struct {\n\tSkipSingleParam *bool `yaml:\"skip-single-param,omitempty\" toml:\"skip-single-param,multiline,omitempty\"`\n}\n\ntype InterfaceBloatSettings struct {\n\tMax *int `yaml:\"max,omitempty\" toml:\"max,multiline,omitempty\"`\n}\n\ntype IreturnSettings struct {\n\tAllow  []string `yaml:\"allow,omitempty\" toml:\"allow,multiline,omitempty\"`\n\tReject []string `yaml:\"reject,omitempty\" toml:\"reject,multiline,omitempty\"`\n}\n\ntype LllSettings struct {\n\tLineLength *int `yaml:\"line-length,omitempty\" toml:\"line-length,multiline,omitempty\"`\n\tTabWidth   *int `yaml:\"tab-width,omitempty\" toml:\"tab-width,multiline,omitempty\"`\n}\n\ntype LoggerCheckSettings struct {\n\tKitlog           *bool    `yaml:\"kitlog,omitempty\" toml:\"kitlog,multiline,omitempty\"`\n\tKlog             *bool    `yaml:\"klog,omitempty\" toml:\"klog,multiline,omitempty\"`\n\tLogr             *bool    `yaml:\"logr,omitempty\" toml:\"logr,multiline,omitempty\"`\n\tSlog             *bool    `yaml:\"slog,omitempty\" toml:\"slog,multiline,omitempty\"`\n\tZap              *bool    `yaml:\"zap,omitempty\" toml:\"zap,multiline,omitempty\"`\n\tRequireStringKey *bool    `yaml:\"require-string-key,omitempty\" toml:\"require-string-key,multiline,omitempty\"`\n\tNoPrintfLike     *bool    `yaml:\"no-printf-like,omitempty\" toml:\"no-printf-like,multiline,omitempty\"`\n\tRules            []string `yaml:\"rules,omitempty\" toml:\"rules,multiline,omitempty\"`\n}\n\ntype MaintIdxSettings struct {\n\tUnder *int `yaml:\"under,omitempty\" toml:\"under,multiline,omitempty\"`\n}\n\ntype MakezeroSettings struct {\n\tAlways *bool `yaml:\"always,omitempty\" toml:\"always,multiline,omitempty\"`\n}\n\ntype MisspellSettings struct {\n\tMode        *string              `yaml:\"mode,omitempty\" toml:\"mode,multiline,omitempty\"`\n\tLocale      *string              `yaml:\"locale,omitempty\" toml:\"locale,multiline,omitempty\"`\n\tExtraWords  []MisspellExtraWords `yaml:\"extra-words,omitempty\" toml:\"extra-words,multiline,omitempty\"`\n\tIgnoreRules []string             `yaml:\"ignore-rules,omitempty\" toml:\"ignore-rules,multiline,omitempty\"`\n}\n\ntype MisspellExtraWords struct {\n\tTypo       *string `yaml:\"typo,omitempty\" toml:\"typo,multiline,omitempty\"`\n\tCorrection *string `yaml:\"correction,omitempty\" toml:\"correction,multiline,omitempty\"`\n}\n\ntype MustTagSettings struct {\n\tFunctions []MustTagFunction `yaml:\"functions,omitempty\" toml:\"functions,multiline,omitempty\"`\n}\n\ntype MustTagFunction struct {\n\tName   *string `yaml:\"name,omitempty\" toml:\"name,multiline,omitempty\"`\n\tTag    *string `yaml:\"tag,omitempty\" toml:\"tag,multiline,omitempty\"`\n\tArgPos *int    `yaml:\"arg-pos,omitempty\" toml:\"arg-pos,multiline,omitempty\"`\n}\n\ntype NakedretSettings struct {\n\tMaxFuncLines *uint `yaml:\"max-func-lines,omitempty\" toml:\"max-func-lines,multiline,omitempty\"`\n}\n\ntype NestifSettings struct {\n\tMinComplexity *int `yaml:\"min-complexity,omitempty\" toml:\"min-complexity,multiline,omitempty\"`\n}\n\ntype NilNilSettings struct {\n\tOnlyTwo        *bool    `yaml:\"only-two,omitempty\" toml:\"only-two,multiline,omitempty\"`\n\tDetectOpposite *bool    `yaml:\"detect-opposite,omitempty\" toml:\"detect-opposite,multiline,omitempty\"`\n\tCheckedTypes   []string `yaml:\"checked-types,omitempty\" toml:\"checked-types,multiline,omitempty\"`\n}\n\ntype NlreturnSettings struct {\n\tBlockSize *int `yaml:\"block-size,omitempty\" toml:\"block-size,multiline,omitempty\"`\n}\n\ntype MndSettings struct {\n\tChecks           []string `yaml:\"checks,omitempty\" toml:\"checks,multiline,omitempty\"`\n\tIgnoredNumbers   []string `yaml:\"ignored-numbers,omitempty\" toml:\"ignored-numbers,multiline,omitempty\"`\n\tIgnoredFiles     []string `yaml:\"ignored-files,omitempty\" toml:\"ignored-files,multiline,omitempty\"`\n\tIgnoredFunctions []string `yaml:\"ignored-functions,omitempty\" toml:\"ignored-functions,multiline,omitempty\"`\n}\n\ntype NoLintLintSettings struct {\n\tRequireExplanation *bool    `yaml:\"require-explanation,omitempty\" toml:\"require-explanation,multiline,omitempty\"`\n\tRequireSpecific    *bool    `yaml:\"require-specific,omitempty\" toml:\"require-specific,multiline,omitempty\"`\n\tAllowNoExplanation []string `yaml:\"allow-no-explanation,omitempty\" toml:\"allow-no-explanation,multiline,omitempty\"`\n\tAllowUnused        *bool    `yaml:\"allow-unused,omitempty\" toml:\"allow-unused,multiline,omitempty\"`\n}\n\ntype NoNamedReturnsSettings struct {\n\tReportErrorInDefer *bool `yaml:\"report-error-in-defer,omitempty\" toml:\"report-error-in-defer,multiline,omitempty\"`\n}\n\ntype ParallelTestSettings struct {\n\tGo                    *string `yaml:\"-,omitempty\" toml:\"-,multiline,omitempty\"`\n\tIgnoreMissing         *bool   `yaml:\"ignore-missing,omitempty\" toml:\"ignore-missing,multiline,omitempty\"`\n\tIgnoreMissingSubtests *bool   `yaml:\"ignore-missing-subtests,omitempty\" toml:\"ignore-missing-subtests,multiline,omitempty\"`\n}\n\ntype PerfSprintSettings struct {\n\tIntegerFormat *bool `yaml:\"integer-format,omitempty\" toml:\"integer-format,multiline,omitempty\"`\n\tIntConversion *bool `yaml:\"int-conversion,omitempty\" toml:\"int-conversion,multiline,omitempty\"`\n\n\tErrorFormat *bool `yaml:\"error-format,omitempty\" toml:\"error-format,multiline,omitempty\"`\n\tErrError    *bool `yaml:\"err-error,omitempty\" toml:\"err-error,multiline,omitempty\"`\n\tErrorF      *bool `yaml:\"errorf,omitempty\" toml:\"errorf,multiline,omitempty\"`\n\n\tStringFormat *bool `yaml:\"string-format,omitempty\" toml:\"string-format,multiline,omitempty\"`\n\tSprintF1     *bool `yaml:\"sprintf1,omitempty\" toml:\"sprintf1,multiline,omitempty\"`\n\tStrConcat    *bool `yaml:\"strconcat,omitempty\" toml:\"strconcat,multiline,omitempty\"`\n\n\tBoolFormat *bool `yaml:\"bool-format,omitempty\" toml:\"bool-format,multiline,omitempty\"`\n\tHexFormat  *bool `yaml:\"hex-format,omitempty\" toml:\"hex-format,multiline,omitempty\"`\n}\n\ntype PreallocSettings struct {\n\tSimple     *bool `yaml:\"simple,omitempty\" toml:\"simple,multiline,omitempty\"`\n\tRangeLoops *bool `yaml:\"range-loops,omitempty\" toml:\"range-loops,multiline,omitempty\"`\n\tForLoops   *bool `yaml:\"for-loops,omitempty\" toml:\"for-loops,multiline,omitempty\"`\n}\n\ntype PredeclaredSettings struct {\n\tIgnore    []string `yaml:\"ignore,omitempty\" toml:\"ignore,multiline,omitempty\"`\n\tQualified *bool    `yaml:\"qualified-name,omitempty\" toml:\"qualified-name,multiline,omitempty\"`\n}\n\ntype PromlinterSettings struct {\n\tStrict          *bool    `yaml:\"strict,omitempty\" toml:\"strict,multiline,omitempty\"`\n\tDisabledLinters []string `yaml:\"disabled-linters,omitempty\" toml:\"disabled-linters,multiline,omitempty\"`\n}\n\ntype ProtoGetterSettings struct {\n\tSkipGeneratedBy         []string `yaml:\"skip-generated-by,omitempty\" toml:\"skip-generated-by,multiline,omitempty\"`\n\tSkipFiles               []string `yaml:\"skip-files,omitempty\" toml:\"skip-files,multiline,omitempty\"`\n\tSkipAnyGenerated        *bool    `yaml:\"skip-any-generated,omitempty\" toml:\"skip-any-generated,multiline,omitempty\"`\n\tReplaceFirstArgInAppend *bool    `yaml:\"replace-first-arg-in-append,omitempty\" toml:\"replace-first-arg-in-append,multiline,omitempty\"`\n}\n\ntype ReassignSettings struct {\n\tPatterns []string `yaml:\"patterns,omitempty\" toml:\"patterns,multiline,omitempty\"`\n}\n\ntype RecvcheckSettings struct {\n\tDisableBuiltin *bool    `yaml:\"disable-builtin,omitempty\" toml:\"disable-builtin,multiline,omitempty\"`\n\tExclusions     []string `yaml:\"exclusions,omitempty\" toml:\"exclusions,multiline,omitempty\"`\n}\n\ntype ReviveSettings struct {\n\tGo             *string           `yaml:\"-,omitempty\" toml:\"-,multiline,omitempty\"`\n\tMaxOpenFiles   *int              `yaml:\"max-open-files,omitempty\" toml:\"max-open-files,multiline,omitempty\"`\n\tConfidence     *float64          `yaml:\"confidence,omitempty\" toml:\"confidence,multiline,omitempty\"`\n\tSeverity       *string           `yaml:\"severity,omitempty\" toml:\"severity,multiline,omitempty\"`\n\tEnableAllRules *bool             `yaml:\"enable-all-rules,omitempty\" toml:\"enable-all-rules,multiline,omitempty\"`\n\tRules          []ReviveRule      `yaml:\"rules,omitempty\" toml:\"rules,multiline,omitempty\"`\n\tErrorCode      *int              `yaml:\"error-code,omitempty\" toml:\"error-code,multiline,omitempty\"`\n\tWarningCode    *int              `yaml:\"warning-code,omitempty\" toml:\"warning-code,multiline,omitempty\"`\n\tDirectives     []ReviveDirective `yaml:\"directives,omitempty\" toml:\"directives,multiline,omitempty\"`\n}\n\ntype ReviveRule struct {\n\tName      *string  `yaml:\"name,omitempty\" toml:\"name,multiline,omitempty\"`\n\tArguments []any    `yaml:\"arguments,omitempty\" toml:\"arguments,multiline,omitempty\"`\n\tSeverity  *string  `yaml:\"severity,omitempty\" toml:\"severity,multiline,omitempty\"`\n\tDisabled  *bool    `yaml:\"disabled,omitempty\" toml:\"disabled,multiline,omitempty\"`\n\tExclude   []string `yaml:\"exclude,omitempty\" toml:\"exclude,multiline,omitempty\"`\n}\n\ntype ReviveDirective struct {\n\tName     *string `yaml:\"name,omitempty\" toml:\"name,multiline,omitempty\"`\n\tSeverity *string `yaml:\"severity,omitempty\" toml:\"severity,multiline,omitempty\"`\n}\n\ntype RowsErrCheckSettings struct {\n\tPackages []string `yaml:\"packages,omitempty\" toml:\"packages,multiline,omitempty\"`\n}\n\ntype SlogLintSettings struct {\n\tNoMixedArgs    *bool    `yaml:\"no-mixed-args,omitempty\" toml:\"no-mixed-args,multiline,omitempty\"`\n\tKVOnly         *bool    `yaml:\"kv-only,omitempty\" toml:\"kv-only,multiline,omitempty\"`\n\tAttrOnly       *bool    `yaml:\"attr-only,omitempty\" toml:\"attr-only,multiline,omitempty\"`\n\tNoGlobal       *string  `yaml:\"no-global,omitempty\" toml:\"no-global,multiline,omitempty\"`\n\tContext        *string  `yaml:\"context,omitempty\" toml:\"context,multiline,omitempty\"`\n\tStaticMsg      *bool    `yaml:\"static-msg,omitempty\" toml:\"static-msg,multiline,omitempty\"`\n\tMsgStyle       *string  `yaml:\"msg-style,omitempty\" toml:\"msg-style,multiline,omitempty\"`\n\tNoRawKeys      *bool    `yaml:\"no-raw-keys,omitempty\" toml:\"no-raw-keys,multiline,omitempty\"`\n\tKeyNamingCase  *string  `yaml:\"key-naming-case,omitempty\" toml:\"key-naming-case,multiline,omitempty\"`\n\tForbiddenKeys  []string `yaml:\"forbidden-keys,omitempty\" toml:\"forbidden-keys,multiline,omitempty\"`\n\tArgsOnSepLines *bool    `yaml:\"args-on-sep-lines,omitempty\" toml:\"args-on-sep-lines,multiline,omitempty\"`\n}\n\ntype SpancheckSettings struct {\n\tChecks                   []string `yaml:\"checks,omitempty\" toml:\"checks,multiline,omitempty\"`\n\tIgnoreCheckSignatures    []string `yaml:\"ignore-check-signatures,omitempty\" toml:\"ignore-check-signatures,multiline,omitempty\"`\n\tExtraStartSpanSignatures []string `yaml:\"extra-start-span-signatures,omitempty\" toml:\"extra-start-span-signatures,multiline,omitempty\"`\n}\n\ntype StaticCheckSettings struct {\n\tChecks                  []string `yaml:\"checks,omitempty\" toml:\"checks,multiline,omitempty\"`\n\tInitialisms             []string `yaml:\"initialisms,omitempty\" toml:\"initialisms,multiline,omitempty\"`\n\tDotImportWhitelist      []string `yaml:\"dot-import-whitelist,omitempty\" toml:\"dot-import-whitelist,multiline,omitempty\"`\n\tHTTPStatusCodeWhitelist []string `yaml:\"http-status-code-whitelist,omitempty\" toml:\"http-status-code-whitelist,multiline,omitempty\"`\n}\n\ntype TagAlignSettings struct {\n\tAlign  *bool    `yaml:\"align,omitempty\" toml:\"align,multiline,omitempty\"`\n\tSort   *bool    `yaml:\"sort,omitempty\" toml:\"sort,multiline,omitempty\"`\n\tOrder  []string `yaml:\"order,omitempty\" toml:\"order,multiline,omitempty\"`\n\tStrict *bool    `yaml:\"strict,omitempty\" toml:\"strict,multiline,omitempty\"`\n}\n\ntype TagliatelleSettings struct {\n\tCase TagliatelleCase `yaml:\"case,omitempty\" toml:\"case,multiline,omitempty\"`\n}\n\ntype TagliatelleCase struct {\n\tTagliatelleBase `yaml:\",inline\"`\n\tOverrides       []TagliatelleOverrides `yaml:\"overrides,omitempty\" toml:\"overrides,multiline,omitempty\"`\n}\n\ntype TagliatelleOverrides struct {\n\tTagliatelleBase `yaml:\",inline\"`\n\tPackage         *string `yaml:\"pkg,omitempty\" toml:\"pkg,multiline,omitempty\"`\n\tIgnore          *bool   `yaml:\"ignore,omitempty\" toml:\"ignore,multiline,omitempty\"`\n}\n\ntype TagliatelleBase struct {\n\tRules         map[string]string                  `yaml:\"rules,omitempty\" toml:\"rules,multiline,omitempty\"`\n\tExtendedRules map[string]TagliatelleExtendedRule `yaml:\"extended-rules,omitempty\" toml:\"extended-rules,multiline,omitempty\"`\n\tUseFieldName  *bool                              `yaml:\"use-field-name,omitempty\" toml:\"use-field-name,multiline,omitempty\"`\n\tIgnoredFields []string                           `yaml:\"ignored-fields,omitempty\" toml:\"ignored-fields,multiline,omitempty\"`\n}\n\ntype TagliatelleExtendedRule struct {\n\tCase                *string         `yaml:\"case,omitempty\" toml:\"case,multiline,omitempty\"`\n\tExtraInitialisms    *bool           `yaml:\"extra-initialisms,omitempty\" toml:\"extra-initialisms,multiline,omitempty\"`\n\tInitialismOverrides map[string]bool `yaml:\"initialism-overrides,omitempty\" toml:\"initialism-overrides,multiline,omitempty\"`\n}\n\ntype TestifylintSettings struct {\n\tEnableAll        *bool    `yaml:\"enable-all,omitempty\" toml:\"enable-all,multiline,omitempty\"`\n\tDisableAll       *bool    `yaml:\"disable-all,omitempty\" toml:\"disable-all,multiline,omitempty\"`\n\tEnabledCheckers  []string `yaml:\"enable,omitempty\" toml:\"enable,multiline,omitempty\"`\n\tDisabledCheckers []string `yaml:\"disable,omitempty\" toml:\"disable,multiline,omitempty\"`\n\n\tBoolCompare          TestifylintBoolCompare          `yaml:\"bool-compare,omitempty\" toml:\"bool-compare,multiline,omitempty\"`\n\tExpectedActual       TestifylintExpectedActual       `yaml:\"expected-actual,omitempty\" toml:\"expected-actual,multiline,omitempty\"`\n\tFormatter            TestifylintFormatter            `yaml:\"formatter,omitempty\" toml:\"formatter,multiline,omitempty\"`\n\tGoRequire            TestifylintGoRequire            `yaml:\"go-require,omitempty\" toml:\"go-require,multiline,omitempty\"`\n\tRequireError         TestifylintRequireError         `yaml:\"require-error,omitempty\" toml:\"require-error,multiline,omitempty\"`\n\tSuiteExtraAssertCall TestifylintSuiteExtraAssertCall `yaml:\"suite-extra-assert-call,omitempty\" toml:\"suite-extra-assert-call,multiline,omitempty\"`\n}\n\ntype TestifylintBoolCompare struct {\n\tIgnoreCustomTypes *bool `yaml:\"ignore-custom-types,omitempty\" toml:\"ignore-custom-types,multiline,omitempty\"`\n}\n\ntype TestifylintExpectedActual struct {\n\tExpVarPattern *string `yaml:\"pattern,omitempty\" toml:\"pattern,multiline,omitempty\"`\n}\n\ntype TestifylintFormatter struct {\n\tCheckFormatString *bool `yaml:\"check-format-string,omitempty\" toml:\"check-format-string,multiline,omitempty\"`\n\tRequireFFuncs     *bool `yaml:\"require-f-funcs,omitempty\" toml:\"require-f-funcs,multiline,omitempty\"`\n\tRequireStringMsg  *bool `yaml:\"require-string-msg,omitempty\" toml:\"require-string-msg,multiline,omitempty\"`\n}\n\ntype TestifylintGoRequire struct {\n\tIgnoreHTTPHandlers *bool `yaml:\"ignore-http-handlers,omitempty\" toml:\"ignore-http-handlers,multiline,omitempty\"`\n}\n\ntype TestifylintRequireError struct {\n\tFnPattern *string `yaml:\"fn-pattern,omitempty\" toml:\"fn-pattern,multiline,omitempty\"`\n}\n\ntype TestifylintSuiteExtraAssertCall struct {\n\tMode *string `yaml:\"mode,omitempty\" toml:\"mode,multiline,omitempty\"`\n}\n\ntype TestpackageSettings struct {\n\tSkipRegexp    *string  `yaml:\"skip-regexp,omitempty\" toml:\"skip-regexp,multiline,omitempty\"`\n\tAllowPackages []string `yaml:\"allow-packages,omitempty\" toml:\"allow-packages,multiline,omitempty\"`\n}\n\ntype ThelperSettings struct {\n\tTest      ThelperOptions `yaml:\"test,omitempty\" toml:\"test,multiline,omitempty\"`\n\tFuzz      ThelperOptions `yaml:\"fuzz,omitempty\" toml:\"fuzz,multiline,omitempty\"`\n\tBenchmark ThelperOptions `yaml:\"benchmark,omitempty\" toml:\"benchmark,multiline,omitempty\"`\n\tTB        ThelperOptions `yaml:\"tb,omitempty\" toml:\"tb,multiline,omitempty\"`\n}\n\ntype ThelperOptions struct {\n\tFirst *bool `yaml:\"first,omitempty\" toml:\"first,multiline,omitempty\"`\n\tName  *bool `yaml:\"name,omitempty\" toml:\"name,multiline,omitempty\"`\n\tBegin *bool `yaml:\"begin,omitempty\" toml:\"begin,multiline,omitempty\"`\n}\n\ntype UseStdlibVarsSettings struct {\n\tHTTPMethod         *bool `yaml:\"http-method,omitempty\" toml:\"http-method,multiline,omitempty\"`\n\tHTTPStatusCode     *bool `yaml:\"http-status-code,omitempty\" toml:\"http-status-code,multiline,omitempty\"`\n\tTimeWeekday        *bool `yaml:\"time-weekday,omitempty\" toml:\"time-weekday,multiline,omitempty\"`\n\tTimeMonth          *bool `yaml:\"time-month,omitempty\" toml:\"time-month,multiline,omitempty\"`\n\tTimeLayout         *bool `yaml:\"time-layout,omitempty\" toml:\"time-layout,multiline,omitempty\"`\n\tCryptoHash         *bool `yaml:\"crypto-hash,omitempty\" toml:\"crypto-hash,multiline,omitempty\"`\n\tDefaultRPCPath     *bool `yaml:\"default-rpc-path,omitempty\" toml:\"default-rpc-path,multiline,omitempty\"`\n\tSQLIsolationLevel  *bool `yaml:\"sql-isolation-level,omitempty\" toml:\"sql-isolation-level,multiline,omitempty\"`\n\tTLSSignatureScheme *bool `yaml:\"tls-signature-scheme,omitempty\" toml:\"tls-signature-scheme,multiline,omitempty\"`\n\tConstantKind       *bool `yaml:\"constant-kind,omitempty\" toml:\"constant-kind,multiline,omitempty\"`\n\tTimeDateMonth      *bool `yaml:\"time-date-month,omitempty\" toml:\"time-date-month,multiline,omitempty\"`\n}\n\ntype UseTestingSettings struct {\n\tContextBackground *bool `yaml:\"context-background,omitempty\" toml:\"context-background,multiline,omitempty\"`\n\tContextTodo       *bool `yaml:\"context-todo,omitempty\" toml:\"context-todo,multiline,omitempty\"`\n\tOSChdir           *bool `yaml:\"os-chdir,omitempty\" toml:\"os-chdir,multiline,omitempty\"`\n\tOSMkdirTemp       *bool `yaml:\"os-mkdir-temp,omitempty\" toml:\"os-mkdir-temp,multiline,omitempty\"`\n\tOSSetenv          *bool `yaml:\"os-setenv,omitempty\" toml:\"os-setenv,multiline,omitempty\"`\n\tOSTempDir         *bool `yaml:\"os-temp-dir,omitempty\" toml:\"os-temp-dir,multiline,omitempty\"`\n\tOSCreateTemp      *bool `yaml:\"os-create-temp,omitempty\" toml:\"os-create-temp,multiline,omitempty\"`\n}\n\ntype UnconvertSettings struct {\n\tFastMath *bool `yaml:\"fast-math,omitempty\" toml:\"fast-math,multiline,omitempty\"`\n\tSafe     *bool `yaml:\"safe,omitempty\" toml:\"safe,multiline,omitempty\"`\n}\n\ntype UnparamSettings struct {\n\tCheckExported *bool `yaml:\"check-exported,omitempty\" toml:\"check-exported,multiline,omitempty\"`\n}\n\ntype UnusedSettings struct {\n\tFieldWritesAreUses     *bool `yaml:\"field-writes-are-uses,omitempty\" toml:\"field-writes-are-uses,multiline,omitempty\"`\n\tPostStatementsAreReads *bool `yaml:\"post-statements-are-reads,omitempty\" toml:\"post-statements-are-reads,multiline,omitempty\"`\n\tExportedFieldsAreUsed  *bool `yaml:\"exported-fields-are-used,omitempty\" toml:\"exported-fields-are-used,multiline,omitempty\"`\n\tParametersAreUsed      *bool `yaml:\"parameters-are-used,omitempty\" toml:\"parameters-are-used,multiline,omitempty\"`\n\tLocalVariablesAreUsed  *bool `yaml:\"local-variables-are-used,omitempty\" toml:\"local-variables-are-used,multiline,omitempty\"`\n\tGeneratedIsUsed        *bool `yaml:\"generated-is-used,omitempty\" toml:\"generated-is-used,multiline,omitempty\"`\n}\n\ntype VarnamelenSettings struct {\n\tMaxDistance        *int     `yaml:\"max-distance,omitempty\" toml:\"max-distance,multiline,omitempty\"`\n\tMinNameLength      *int     `yaml:\"min-name-length,omitempty\" toml:\"min-name-length,multiline,omitempty\"`\n\tCheckReceiver      *bool    `yaml:\"check-receiver,omitempty\" toml:\"check-receiver,multiline,omitempty\"`\n\tCheckReturn        *bool    `yaml:\"check-return,omitempty\" toml:\"check-return,multiline,omitempty\"`\n\tCheckTypeParam     *bool    `yaml:\"check-type-param,omitempty\" toml:\"check-type-param,multiline,omitempty\"`\n\tIgnoreNames        []string `yaml:\"ignore-names,omitempty\" toml:\"ignore-names,multiline,omitempty\"`\n\tIgnoreTypeAssertOk *bool    `yaml:\"ignore-type-assert-ok,omitempty\" toml:\"ignore-type-assert-ok,multiline,omitempty\"`\n\tIgnoreMapIndexOk   *bool    `yaml:\"ignore-map-index-ok,omitempty\" toml:\"ignore-map-index-ok,multiline,omitempty\"`\n\tIgnoreChanRecvOk   *bool    `yaml:\"ignore-chan-recv-ok,omitempty\" toml:\"ignore-chan-recv-ok,multiline,omitempty\"`\n\tIgnoreDecls        []string `yaml:\"ignore-decls,omitempty\" toml:\"ignore-decls,multiline,omitempty\"`\n}\n\ntype WhitespaceSettings struct {\n\tMultiIf   *bool `yaml:\"multi-if,omitempty\" toml:\"multi-if,multiline,omitempty\"`\n\tMultiFunc *bool `yaml:\"multi-func,omitempty\" toml:\"multi-func,multiline,omitempty\"`\n}\n\ntype WrapcheckSettings struct {\n\tExtraIgnoreSigs        []string `yaml:\"extra-ignore-sigs,omitempty\" toml:\"extra-ignore-sigs,multiline,omitempty\"`\n\tIgnoreSigs             []string `yaml:\"ignore-sigs,omitempty\" toml:\"ignore-sigs,multiline,omitempty\"`\n\tIgnoreSigRegexps       []string `yaml:\"ignore-sig-regexps,omitempty\" toml:\"ignore-sig-regexps,multiline,omitempty\"`\n\tIgnorePackageGlobs     []string `yaml:\"ignore-package-globs,omitempty\" toml:\"ignore-package-globs,multiline,omitempty\"`\n\tIgnoreInterfaceRegexps []string `yaml:\"ignore-interface-regexps,omitempty\" toml:\"ignore-interface-regexps,multiline,omitempty\"`\n\tReportInternalErrors   *bool    `yaml:\"report-internal-errors,omitempty\" toml:\"report-internal-errors,multiline,omitempty\"`\n}\n\ntype WSLv4Settings struct {\n\tStrictAppend                     *bool    `yaml:\"strict-append,omitempty\" toml:\"strict-append,multiline,omitempty\"`\n\tAllowAssignAndCallCuddle         *bool    `yaml:\"allow-assign-and-call,omitempty\" toml:\"allow-assign-and-call,multiline,omitempty\"`\n\tAllowAssignAndAnythingCuddle     *bool    `yaml:\"allow-assign-and-anything,omitempty\" toml:\"allow-assign-and-anything,multiline,omitempty\"`\n\tAllowMultiLineAssignCuddle       *bool    `yaml:\"allow-multiline-assign,omitempty\" toml:\"allow-multiline-assign,multiline,omitempty\"`\n\tForceCaseTrailingWhitespaceLimit *int     `yaml:\"force-case-trailing-whitespace,omitempty\" toml:\"force-case-trailing-whitespace,multiline,omitempty\"`\n\tAllowTrailingComment             *bool    `yaml:\"allow-trailing-comment,omitempty\" toml:\"allow-trailing-comment,multiline,omitempty\"`\n\tAllowSeparatedLeadingComment     *bool    `yaml:\"allow-separated-leading-comment,omitempty\" toml:\"allow-separated-leading-comment,multiline,omitempty\"`\n\tAllowCuddleDeclaration           *bool    `yaml:\"allow-cuddle-declarations,omitempty\" toml:\"allow-cuddle-declarations,multiline,omitempty\"`\n\tAllowCuddleWithCalls             []string `yaml:\"allow-cuddle-with-calls,omitempty\" toml:\"allow-cuddle-with-calls,multiline,omitempty\"`\n\tAllowCuddleWithRHS               []string `yaml:\"allow-cuddle-with-rhs,omitempty\" toml:\"allow-cuddle-with-rhs,multiline,omitempty\"`\n\tAllowCuddleUsedInBlock           *bool    `yaml:\"allow-cuddle-used-in-block,omitempty\" toml:\"allow-cuddle-used-in-block,multiline,omitempty\"`\n\tForceCuddleErrCheckAndAssign     *bool    `yaml:\"force-err-cuddling,omitempty\" toml:\"force-err-cuddling,multiline,omitempty\"`\n\tErrorVariableNames               []string `yaml:\"error-variable-names,omitempty\" toml:\"error-variable-names,multiline,omitempty\"`\n\tForceExclusiveShortDeclarations  *bool    `yaml:\"force-short-decl-cuddling,omitempty\" toml:\"force-short-decl-cuddling,multiline,omitempty\"`\n}\n\ntype WSLv5Settings struct {\n\tAllowFirstInBlock *bool    `yaml:\"allow-first-in-block,omitempty\" toml:\"allow-first-in-block,multiline,omitempty\"`\n\tAllowWholeBlock   *bool    `yaml:\"allow-whole-block,omitempty\" toml:\"allow-whole-block,multiline,omitempty\"`\n\tBranchMaxLines    *int     `yaml:\"branch-max-lines,omitempty\" toml:\"branch-max-lines,multiline,omitempty\"`\n\tCaseMaxLines      *int     `yaml:\"case-max-lines,omitempty\" toml:\"case-max-lines,multiline,omitempty\"`\n\tDefault           *string  `yaml:\"default,omitempty\" toml:\"default,multiline,omitempty\"`\n\tEnable            []string `yaml:\"enable,omitempty\" toml:\"enable,multiline,omitempty\"`\n\tDisable           []string `yaml:\"disable,omitempty\" toml:\"disable,multiline,omitempty\"`\n}\n\ntype CustomLinterSettings struct {\n\tType *string `yaml:\"type,omitempty\" toml:\"type,multiline,omitempty\"`\n\n\tPath *string `yaml:\"path,omitempty\" toml:\"path,multiline,omitempty\"`\n\n\tDescription *string `yaml:\"description,omitempty\" toml:\"description,multiline,omitempty\"`\n\n\tOriginalURL *string `yaml:\"original-url,omitempty\" toml:\"original-url,multiline,omitempty\"`\n\n\tSettings any `yaml:\"settings,omitempty\" toml:\"settings,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/output.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype Output struct {\n\tFormats    Formats  `yaml:\"formats,omitempty\" toml:\"formats,multiline,omitempty\"`\n\tSortOrder  []string `yaml:\"sort-order,omitempty\" toml:\"sort-order,multiline,omitempty\"`\n\tShowStats  *bool    `yaml:\"show-stats,omitempty\" toml:\"show-stats,multiline,omitempty\"`\n\tPathPrefix *string  `yaml:\"path-prefix,omitempty\" toml:\"path-prefix,multiline,omitempty\"`\n\tPathMode   *string  `yaml:\"path-mode,omitempty\" toml:\"path-mode,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/output_formats.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype Formats struct {\n\tText        Text         `yaml:\"text,omitempty\" toml:\"text,multiline,omitempty\"`\n\tJSON        SimpleFormat `yaml:\"json,omitempty\" toml:\"json,multiline,omitempty\"`\n\tTab         Tab          `yaml:\"tab,omitempty\" toml:\"tab,multiline,omitempty\"`\n\tHTML        SimpleFormat `yaml:\"html,omitempty\" toml:\"html,multiline,omitempty\"`\n\tCheckstyle  SimpleFormat `yaml:\"checkstyle,omitempty\" toml:\"checkstyle,multiline,omitempty\"`\n\tCodeClimate SimpleFormat `yaml:\"code-climate,omitempty\" toml:\"code-climate,multiline,omitempty\"`\n\tJUnitXML    JUnitXML     `yaml:\"junit-xml,omitempty\" toml:\"junit-xml,multiline,omitempty\"`\n\tTeamCity    SimpleFormat `yaml:\"teamcity,omitempty\" toml:\"teamcity,multiline,omitempty\"`\n\tSarif       SimpleFormat `yaml:\"sarif,omitempty\" toml:\"sarif,multiline,omitempty\"`\n}\n\ntype SimpleFormat struct {\n\tPath *string `yaml:\"path,omitempty\" toml:\"path,multiline,omitempty\"`\n}\n\ntype Text struct {\n\tSimpleFormat    `yaml:\",inline\"`\n\tPrintLinterName *bool `yaml:\"print-linter-name,omitempty\" toml:\"print-linter-name,multiline,omitempty\"`\n\tPrintIssuedLine *bool `yaml:\"print-issued-lines,omitempty\" toml:\"print-issued-lines,multiline,omitempty\"`\n\tColors          *bool `yaml:\"colors,omitempty\" toml:\"colors,multiline,omitempty\"`\n}\n\ntype Tab struct {\n\tSimpleFormat    `yaml:\",inline\"`\n\tPrintLinterName *bool `yaml:\"print-linter-name,omitempty\" toml:\"print-linter-name,multiline,omitempty\"`\n\tColors          *bool `yaml:\"colors,omitempty\" toml:\"colors,multiline,omitempty\"`\n}\n\ntype JUnitXML struct {\n\tSimpleFormat `yaml:\",inline\"`\n\tExtended     *bool `yaml:\"extended,omitempty\" toml:\"extended,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/run.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\nimport (\n\t\"time\"\n)\n\ntype Run struct {\n\tTimeout time.Duration `yaml:\"timeout,omitempty\" toml:\"timeout,multiline,omitempty\"`\n\n\tConcurrency *int `yaml:\"concurrency,omitempty\" toml:\"concurrency,multiline,omitempty\"`\n\n\tGo *string `yaml:\"go,omitempty\" toml:\"go,multiline,omitempty\"`\n\n\tRelativePathMode *string `yaml:\"relative-path-mode,omitempty\" toml:\"relative-path-mode,multiline,omitempty\"`\n\n\tBuildTags           []string `yaml:\"build-tags,omitempty\" toml:\"build-tags,multiline,omitempty\"`\n\tModulesDownloadMode *string  `yaml:\"modules-download-mode,omitempty\" toml:\"modules-download-mode,multiline,omitempty\"`\n\n\tExitCodeIfIssuesFound *int  `yaml:\"issues-exit-code,omitempty\" toml:\"issues-exit-code,multiline,omitempty\"`\n\tAnalyzeTests          *bool `yaml:\"tests,omitempty\" toml:\"tests,multiline,omitempty\"`\n\n\tAllowParallelRunners *bool `yaml:\"allow-parallel-runners,omitempty\" toml:\"allow-parallel-runners,multiline,omitempty\"`\n\tAllowSerialRunners   *bool `yaml:\"allow-serial-runners,omitempty\" toml:\"allow-serial-runners,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/migrate/versiontwo/severity.go",
    "content": "// Code generated by pkg/commands/internal/migrate/cloner/cloner.go. DO NOT EDIT.\n\npackage versiontwo\n\ntype Severity struct {\n\tDefault *string        `yaml:\"default,omitempty\" toml:\"default,multiline,omitempty\"`\n\tRules   []SeverityRule `yaml:\"rules,omitempty\" toml:\"rules,multiline,omitempty\"`\n}\n\ntype SeverityRule struct {\n\tBaseRule `yaml:\",inline\"`\n\tSeverity *string `yaml:\"severity,omitempty\" toml:\"severity,multiline,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/commands/internal/testdata/imports.go",
    "content": "package main\n\nimport (\n\t_ \"example.com/foo/bar/test\"\n\t_ \"example.org/foo/bar/test\"\n)\n"
  },
  {
    "path": "pkg/commands/internal/vibra.go",
    "content": "package internal\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/spf13/pflag\"\n\t\"github.com/spf13/viper\"\n)\n\ntype FlagFunc[T any] func(name string, value T, usage string) *T\n\ntype FlagPFunc[T any] func(name, shorthand string, value T, usage string) *T\n\n// AddFlagAndBind adds a Cobra/pflag flag and binds it with Viper.\nfunc AddFlagAndBind[T any](v *viper.Viper, fs *pflag.FlagSet, pfn FlagFunc[T], name, bind string, value T, usage string) {\n\tpfn(name, value, usage)\n\n\terr := v.BindPFlag(bind, fs.Lookup(name))\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"failed to bind flag %s: %v\", name, err))\n\t}\n}\n\n// AddFlagAndBindP adds a Cobra/pflag flag and binds it with Viper.\nfunc AddFlagAndBindP[T any](v *viper.Viper, fs *pflag.FlagSet, pfn FlagPFunc[T], name, shorthand, bind string, value T, usage string) {\n\tpfn(name, shorthand, value, usage)\n\n\terr := v.BindPFlag(bind, fs.Lookup(name))\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"failed to bind flag %s: %v\", name, err))\n\t}\n}\n\n// AddDeprecatedFlagAndBind similar to AddFlagAndBind but deprecate the flag.\nfunc AddDeprecatedFlagAndBind[T any](v *viper.Viper, fs *pflag.FlagSet, pfn FlagFunc[T], name, bind string, value T, usage string) {\n\tAddFlagAndBind(v, fs, pfn, name, bind, value, usage)\n\tdeprecateFlag(fs, name)\n}\n\n// AddHackedStringSliceP Hack for slice, see Loader.applyStringSliceHack.\nfunc AddHackedStringSliceP(fs *pflag.FlagSet, name, shorthand, usage string) {\n\tfs.StringSliceP(name, shorthand, nil, usage)\n}\n\n// AddHackedStringSlice Hack for slice, see Loader.applyStringSliceHack.\nfunc AddHackedStringSlice(fs *pflag.FlagSet, name, usage string) {\n\tAddHackedStringSliceP(fs, name, \"\", usage)\n}\n\n// AddDeprecatedHackedStringSlice similar to AddHackedStringSlice but deprecate the flag.\nfunc AddDeprecatedHackedStringSlice(fs *pflag.FlagSet, name, usage string) {\n\tAddHackedStringSlice(fs, name, usage)\n\tdeprecateFlag(fs, name)\n}\n\nfunc deprecateFlag(fs *pflag.FlagSet, name string) {\n\t_ = fs.MarkHidden(name)\n\t_ = fs.MarkDeprecated(name, \"check the documentation for more information.\")\n}\n"
  },
  {
    "path": "pkg/commands/linters.go",
    "content": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype lintersHelp struct {\n\tEnabled  []linterHelp\n\tDisabled []linterHelp\n}\n\ntype lintersOptions struct {\n\tconfig.LoaderOptions\n\tJSON bool\n}\n\ntype lintersCommand struct {\n\tviper *viper.Viper\n\tcmd   *cobra.Command\n\n\topts lintersOptions\n\n\tcfg *config.Config\n\n\tlog logutils.Log\n\n\tdbManager *lintersdb.Manager\n}\n\nfunc newLintersCommand(logger logutils.Log) *lintersCommand {\n\tc := &lintersCommand{\n\t\tviper: viper.New(),\n\t\tcfg:   config.NewDefault(),\n\t\tlog:   logger,\n\t}\n\n\tlintersCmd := &cobra.Command{\n\t\tUse:               \"linters\",\n\t\tShort:             \"List current linters configuration.\",\n\t\tArgs:              cobra.NoArgs,\n\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\tRunE:              c.execute,\n\t\tPreRunE:           c.preRunE,\n\t\tSilenceUsage:      true,\n\t}\n\n\tfs := lintersCmd.Flags()\n\tfs.SortFlags = false // sort them as they are defined here\n\n\tsetupConfigFileFlagSet(fs, &c.opts.LoaderOptions)\n\tsetupLintersFlagSet(c.viper, fs)\n\n\tfs.BoolVar(&c.opts.JSON, \"json\", false, color.GreenString(\"Display as JSON\"))\n\n\tc.cmd = lintersCmd\n\n\treturn c\n}\n\nfunc (c *lintersCommand) preRunE(cmd *cobra.Command, args []string) error {\n\tloader := config.NewLintersLoader(c.log.Child(logutils.DebugKeyConfigReader), c.viper, cmd.Flags(), c.opts.LoaderOptions, c.cfg, args)\n\n\terr := loader.Load(config.LoadOptions{Validation: true})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't load config: %w\", err)\n\t}\n\n\tdbManager, err := lintersdb.NewManager(c.log.Child(logutils.DebugKeyLintersDB), c.cfg,\n\t\tlintersdb.NewLinterBuilder(), lintersdb.NewPluginModuleBuilder(c.log), lintersdb.NewPluginGoBuilder(c.log))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.dbManager = dbManager\n\n\treturn nil\n}\n\nfunc (c *lintersCommand) execute(_ *cobra.Command, _ []string) error {\n\tenabledLintersMap, err := c.dbManager.GetEnabledLintersMap()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't get enabled linters: %w\", err)\n\t}\n\n\tvar enabledLinters []*linter.Config\n\tvar disabledLinters []*linter.Config\n\n\tfor _, lc := range c.dbManager.GetAllSupportedLinterConfigs() {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif goformatters.IsFormatter(lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif enabledLintersMap[lc.Name()] == nil {\n\t\t\tdisabledLinters = append(disabledLinters, lc)\n\t\t} else {\n\t\t\tenabledLinters = append(enabledLinters, lc)\n\t\t}\n\t}\n\n\tif c.opts.JSON {\n\t\tlinters := lintersHelp{}\n\n\t\tfor _, lc := range enabledLinters {\n\t\t\tlinters.Enabled = append(linters.Enabled, newLinterHelp(lc))\n\t\t}\n\n\t\tfor _, lc := range disabledLinters {\n\t\t\tlinters.Disabled = append(linters.Disabled, newLinterHelp(lc))\n\t\t}\n\n\t\treturn json.NewEncoder(c.cmd.OutOrStdout()).Encode(linters)\n\t}\n\n\tcolor.Green(\"Enabled by your configuration linters:\\n\")\n\tprintLinters(enabledLinters)\n\n\tcolor.Red(\"\\nDisabled by your configuration linters:\\n\")\n\tprintLinters(disabledLinters)\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/commands/migrate.go",
    "content": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/charmbracelet/lipgloss\"\n\t\"github.com/fatih/color\"\n\t\"github.com/santhosh-tekuri/jsonschema/v6\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/fakeloader\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/parser\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/commands/internal/migrate/versionone\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype migrateOptions struct {\n\tconfig.LoaderOptions\n\n\tformat         string // Flag only.\n\tskipValidation bool   // Flag only.\n}\ntype migrateCommand struct {\n\tviper *viper.Viper\n\tcmd   *cobra.Command\n\n\topts migrateOptions\n\n\tcfg *versionone.Config\n\n\tbuildInfo BuildInfo\n\n\tlog logutils.Log\n}\n\nfunc newMigrateCommand(log logutils.Log, info BuildInfo) *migrateCommand {\n\tc := &migrateCommand{\n\t\tviper:     viper.New(),\n\t\tcfg:       versionone.NewConfig(),\n\t\tbuildInfo: info,\n\t\tlog:       log,\n\t}\n\n\tmigrateCmd := &cobra.Command{\n\t\tUse:               \"migrate\",\n\t\tShort:             \"Migrate configuration file from v1 to v2.\",\n\t\tSilenceUsage:      true,\n\t\tSilenceErrors:     true,\n\t\tArgs:              cobra.NoArgs,\n\t\tRunE:              c.execute,\n\t\tPreRunE:           c.preRunE,\n\t\tPersistentPreRunE: c.persistentPreRunE,\n\t}\n\n\tmigrateCmd.SetOut(logutils.StdOut) // use custom output to properly color it in Windows terminals\n\tmigrateCmd.SetErr(logutils.StdErr)\n\n\tfs := migrateCmd.Flags()\n\tfs.SortFlags = false // sort them as they are defined here\n\n\tsetupConfigFileFlagSet(fs, &c.opts.LoaderOptions)\n\n\tfs.StringVar(&c.opts.format, \"format\", \"\",\n\t\tcolor.GreenString(\"Output file format.\\nBy default, the format of the input configuration file is used.\\n\"+\n\t\t\t\"It can be 'yml', 'yaml', 'toml', or 'json'.\"))\n\n\tfs.BoolVar(&c.opts.skipValidation, \"skip-validation\", false,\n\t\tcolor.GreenString(\"Skip validation of the configuration file against the JSON Schema for v1.\"))\n\n\tc.cmd = migrateCmd\n\n\treturn c\n}\n\nfunc (c *migrateCommand) execute(_ *cobra.Command, _ []string) error {\n\tsrcPath := c.viper.ConfigFileUsed()\n\tif srcPath == \"\" {\n\t\tc.log.Warnf(\"No config file detected\")\n\t\tos.Exit(exitcodes.NoConfigFileDetected)\n\t}\n\n\terr := c.backupConfigurationFile(srcPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.log.Warnf(\"The configuration comments are not migrated.\")\n\tc.log.Warnf(\"Details about the migration: https://golangci-lint.run/docs/product/migration-guide/\")\n\n\tc.log.Infof(\"Migrating v1 configuration file: %s\", srcPath)\n\n\text := filepath.Ext(srcPath)\n\n\tif c.opts.format != \"\" {\n\t\text = \".\" + c.opts.format\n\t}\n\n\tif !strings.EqualFold(filepath.Ext(srcPath), ext) {\n\t\tdefer func() {\n\t\t\t_ = os.RemoveAll(srcPath)\n\t\t}()\n\t}\n\n\tif c.cfg.Run.Timeout != 0 {\n\t\tc.log.Warnf(\"The configuration `run.timeout` is ignored. By default, in v2, the timeout is disabled.\")\n\t}\n\n\tnewCfg := migrate.ToConfig(c.cfg)\n\n\tdstPath := strings.TrimSuffix(srcPath, filepath.Ext(srcPath)) + ext\n\n\terr = saveNewConfiguration(newCfg, dstPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"saving configuration file: %w\", err)\n\t}\n\n\tc.log.Infof(\"Migration done: %s\", dstPath)\n\n\tcallForAction(c.cmd)\n\n\treturn nil\n}\n\nfunc (c *migrateCommand) preRunE(cmd *cobra.Command, _ []string) error {\n\tswitch strings.ToLower(c.opts.format) {\n\tcase \"\", \"yml\", \"yaml\", \"toml\", \"json\":\n\t\t// Valid format.\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported format: %s\", c.opts.format)\n\t}\n\n\tif c.cfg.Version != \"\" {\n\t\treturn fmt.Errorf(\"configuration version is already set: %s\", c.cfg.Version)\n\t}\n\n\tif c.opts.skipValidation {\n\t\treturn nil\n\t}\n\n\tusedConfigFile := c.viper.ConfigFileUsed()\n\tif usedConfigFile == \"\" {\n\t\tc.log.Warnf(\"No config file detected\")\n\t\tos.Exit(exitcodes.NoConfigFileDetected)\n\t}\n\n\tc.log.Infof(\"Validating v1 configuration file: %s\", usedConfigFile)\n\n\terr := validateConfiguration(\"https://golangci-lint.run/jsonschema/golangci.v1.jsonschema.json\", usedConfigFile)\n\tif err != nil {\n\t\tvar v *jsonschema.ValidationError\n\t\tif !errors.As(err, &v) {\n\t\t\treturn fmt.Errorf(\"[%s] validate: %w\", usedConfigFile, err)\n\t\t}\n\n\t\tprintValidationDetail(cmd, v.DetailedOutput())\n\n\t\treturn errors.New(\"the configuration contains invalid elements\")\n\t}\n\n\treturn nil\n}\n\nfunc (c *migrateCommand) persistentPreRunE(_ *cobra.Command, args []string) error {\n\tc.log.Infof(\"%s\", c.buildInfo.String())\n\n\tloader := config.NewBaseLoader(c.log.Child(logutils.DebugKeyConfigReader), c.viper, c.opts.LoaderOptions, fakeloader.NewConfig(), args)\n\n\t// Loads the configuration just to get the effective path of the configuration.\n\terr := loader.Load()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't load config: %w\", err)\n\t}\n\n\tsrcPath := c.viper.ConfigFileUsed()\n\tif srcPath == \"\" {\n\t\tc.log.Warnf(\"No config file detected\")\n\t\tos.Exit(exitcodes.NoConfigFileDetected)\n\t}\n\n\treturn fakeloader.Load(srcPath, c.cfg)\n}\n\nfunc (c *migrateCommand) backupConfigurationFile(srcPath string) error {\n\tfilename := strings.TrimSuffix(filepath.Base(srcPath), filepath.Ext(srcPath)) + \".bck\" + filepath.Ext(srcPath)\n\tdstPath := filepath.Join(filepath.Dir(srcPath), filename)\n\n\tc.log.Infof(\"Saving the v1 configuration to: %s\", dstPath)\n\n\tstat, err := os.Stat(srcPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata, err := os.ReadFile(srcPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = os.WriteFile(dstPath, data, stat.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc saveNewConfiguration(cfg any, dstPath string) error {\n\tdstFile, err := os.Create(dstPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer func() { _ = dstFile.Close() }()\n\n\treturn parser.Encode(cfg, dstFile)\n}\n\nfunc callForAction(cmd *cobra.Command) {\n\tpStyle := lipgloss.NewStyle().\n\t\tPadding(1).\n\t\tBorderStyle(lipgloss.RoundedBorder()).\n\t\tBorderForeground(lipgloss.Color(\"161\")).\n\t\tAlign(lipgloss.Center)\n\n\thStyle := lipgloss.NewStyle().Bold(true)\n\n\ts := fmt.Sprintln(hStyle.Render(\"We need you!\"))\n\ts += `\nDonations help fund the ongoing development and maintenance of this tool.\nIf golangci-lint has been useful to you, please consider contributing.\n\nDonate now: https://donate.golangci.org`\n\n\tcmd.Println(pStyle.Render(s))\n}\n"
  },
  {
    "path": "pkg/commands/root.go",
    "content": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"slices\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/pflag\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nfunc Execute(info BuildInfo) error {\n\treturn newRootCommand(info).Execute()\n}\n\ntype rootOptions struct {\n\tPrintVersion bool // Flag only.\n\n\tVerbose bool   // Flag only.\n\tColor   string // Flag only.\n}\n\ntype rootCommand struct {\n\tcmd  *cobra.Command\n\topts rootOptions\n\n\tlog logutils.Log\n}\n\nfunc newRootCommand(info BuildInfo) *rootCommand {\n\tc := &rootCommand{}\n\n\trootCmd := &cobra.Command{\n\t\tUse:   \"golangci-lint\",\n\t\tShort: \"golangci-lint is a smart linters runner.\",\n\t\tLong:  `Smart, fast linters runner.`,\n\t\tArgs:  cobra.NoArgs,\n\t\tRunE: func(cmd *cobra.Command, _ []string) error {\n\t\t\tif c.opts.PrintVersion {\n\t\t\t\t_ = printVersion(logutils.StdOut, info)\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\treturn cmd.Help()\n\t\t},\n\t}\n\n\tfs := rootCmd.Flags()\n\tfs.BoolVar(&c.opts.PrintVersion, \"version\", false, color.GreenString(\"Print version\"))\n\n\tsetupRootPersistentFlags(rootCmd.PersistentFlags(), &c.opts)\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\n\t// Each command uses a dedicated configuration structure to avoid side effects of bindings.\n\trootCmd.AddCommand(\n\t\tnewLintersCommand(log).cmd,\n\t\tnewFormattersCommand(log).cmd,\n\t\tnewRunCommand(log, info).cmd,\n\t\tnewFmtCommand(log, info).cmd,\n\t\tnewMigrateCommand(log, info).cmd,\n\t\tnewCacheCommand().cmd,\n\t\tnewConfigCommand(log, info).cmd,\n\t\tnewVersionCommand(info).cmd,\n\t\tnewCustomCommand(log).cmd,\n\t)\n\n\trootCmd.SetHelpCommand(newHelpCommand(log).cmd)\n\n\tc.log = log\n\tc.cmd = rootCmd\n\n\treturn c\n}\n\nfunc (c *rootCommand) Execute() error {\n\terr := setupLogger(c.log)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn c.cmd.Execute()\n}\n\nfunc setupRootPersistentFlags(fs *pflag.FlagSet, opts *rootOptions) {\n\tfs.BoolP(\"help\", \"h\", false, color.GreenString(\"Help for a command\"))\n\tfs.BoolVarP(&opts.Verbose, \"verbose\", \"v\", false, color.GreenString(\"Verbose output\"))\n\tfs.StringVar(&opts.Color, \"color\", \"auto\", color.GreenString(\"Use color when printing; can be 'always', 'auto', or 'never'\"))\n}\n\nfunc setupLogger(logger logutils.Log) error {\n\topts, err := forceRootParsePersistentFlags()\n\tif err != nil && !errors.Is(err, pflag.ErrHelp) {\n\t\treturn err\n\t}\n\n\tif opts == nil {\n\t\treturn nil\n\t}\n\n\tlogutils.SetupVerboseLog(logger, opts.Verbose)\n\n\tswitch opts.Color {\n\tcase \"always\":\n\t\tcolor.NoColor = false\n\tcase \"never\":\n\t\tcolor.NoColor = true\n\tcase \"auto\":\n\t\t// nothing\n\tdefault:\n\t\tlogger.Fatalf(\"invalid value %q for --color; must be 'always', 'auto', or 'never'\", opts.Color)\n\t}\n\n\t// For log level colors (mainly for verbose output)\n\tlogutils.DisableColors(color.NoColor)\n\n\treturn nil\n}\n\nfunc forceRootParsePersistentFlags() (*rootOptions, error) {\n\t// We use another pflag.FlagSet here to not set `changed` flag on cmd.Flags() options.\n\t// Otherwise, string slice options will be duplicated.\n\tfs := pflag.NewFlagSet(\"config flag set\", pflag.ContinueOnError)\n\n\t// Ignore unknown flags because we will parse the command flags later.\n\tfs.ParseErrorsAllowlist = pflag.ParseErrorsAllowlist{UnknownFlags: true}\n\n\topts := &rootOptions{}\n\n\t// Don't do `fs.AddFlagSet(cmd.Flags())` because it shares flags representations:\n\t// `changed` variable inside string slice vars will be shared.\n\t// Use another config variable here,\n\t// to not affect main parsing by this parsing of only config option.\n\tsetupRootPersistentFlags(fs, opts)\n\n\tfs.Usage = func() {} // otherwise, help text will be printed twice\n\n\tif err := fs.Parse(safeArgs(fs, os.Args)); err != nil {\n\t\tif errors.Is(err, pflag.ErrHelp) {\n\t\t\treturn nil, err\n\t\t}\n\n\t\treturn nil, fmt.Errorf(\"can't parse args: %w\", err)\n\t}\n\n\treturn opts, nil\n}\n\n// Shorthands are a problem because pflag, with UnknownFlags, will try to parse all the letters as options.\n// A shorthand can aggregate several letters (ex `ps -aux`)\n// The function replaces non-supported shorthands by a dumb flag.\nfunc safeArgs(fs *pflag.FlagSet, args []string) []string {\n\tvar shorthands []string\n\tfs.VisitAll(func(flag *pflag.Flag) {\n\t\tshorthands = append(shorthands, flag.Shorthand)\n\t})\n\n\tvar cleanArgs []string\n\tfor _, arg := range args {\n\t\tif len(arg) > 1 && arg[0] == '-' && arg[1] != '-' && !slices.Contains(shorthands, string(arg[1])) {\n\t\t\tcleanArgs = append(cleanArgs, \"--potato\")\n\t\t\tcontinue\n\t\t}\n\n\t\tcleanArgs = append(cleanArgs, arg)\n\t}\n\n\treturn cleanArgs\n}\n"
  },
  {
    "path": "pkg/commands/run.go",
    "content": "package commands\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"maps\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"runtime/pprof\"\n\t\"runtime/trace\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gofrs/flock\"\n\t\"github.com/ldez/grignotin/goenv\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/pflag\"\n\t\"github.com/spf13/viper\"\n\t\"go.yaml.in/yaml/v3\"\n\t\"golang.org/x/mod/sumdb/dirhash\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/cache\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/load\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/printers\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/report\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/timeutils\"\n)\n\nconst defaultTimeout = 0 * time.Minute\n\nconst (\n\t// envFailOnWarnings value: \"1\"\n\tenvFailOnWarnings = \"FAIL_ON_WARNINGS\"\n\t// envMemLogEvery value: \"1\"\n\tenvMemLogEvery = \"GL_MEM_LOG_EVERY\"\n)\n\nconst (\n\tenvMemProfileRate = \"GL_MEM_PROFILE_RATE\"\n)\n\ntype runOptions struct {\n\tconfig.LoaderOptions\n\n\tCPUProfilePath string // Flag only.\n\tMemProfilePath string // Flag only.\n\tTracePath      string // Flag only.\n\n\tPrintResourcesUsage bool // Flag only.\n}\n\ntype runCommand struct {\n\tviper *viper.Viper\n\tcmd   *cobra.Command\n\n\topts runOptions\n\n\tcfg *config.Config\n\n\tbuildInfo BuildInfo\n\n\tdbManager *lintersdb.Manager\n\n\tprinter *printers.Printer\n\n\tlog        logutils.Log\n\tdebugf     logutils.DebugFunc\n\treportData *report.Data\n\n\tcontextBuilder *lint.ContextBuilder\n\tgoenv          *goutil.Env\n\n\tfileCache *fsutils.FileCache\n\tlineCache *fsutils.LineCache\n\n\tflock *flock.Flock\n\n\texitCode int\n}\n\nfunc newRunCommand(logger logutils.Log, info BuildInfo) *runCommand {\n\treportData := &report.Data{}\n\n\tc := &runCommand{\n\t\tviper:      viper.New(),\n\t\tlog:        report.NewLogWrapper(logger, reportData),\n\t\tdebugf:     logutils.Debug(logutils.DebugKeyExec),\n\t\tcfg:        config.NewDefault(),\n\t\treportData: reportData,\n\t\tbuildInfo:  info,\n\t}\n\n\trunCmd := &cobra.Command{\n\t\tUse:                \"run\",\n\t\tShort:              \"Lint the code.\",\n\t\tRun:                c.execute,\n\t\tPreRunE:            c.preRunE,\n\t\tPostRun:            c.postRun,\n\t\tPersistentPreRunE:  c.persistentPreRunE,\n\t\tPersistentPostRunE: c.persistentPostRunE,\n\t\tSilenceUsage:       true,\n\t}\n\n\trunCmd.SetOut(logutils.StdOut) // use custom output to properly color it in Windows terminals\n\trunCmd.SetErr(logutils.StdErr)\n\n\tfs := runCmd.Flags()\n\tfs.SortFlags = false // sort them as they are defined here\n\n\t// Only for testing purpose.\n\t// Don't add other flags here.\n\tfs.BoolVar(&c.cfg.InternalCmdTest, \"internal-cmd-test\", false,\n\t\tcolor.GreenString(\"Option is used only for testing golangci-lint command, don't use it\"))\n\t_ = fs.MarkHidden(\"internal-cmd-test\")\n\n\tsetupConfigFileFlagSet(fs, &c.opts.LoaderOptions)\n\n\tsetupLintersFlagSet(c.viper, fs)\n\tsetupRunFlagSet(c.viper, fs)\n\tsetupOutputFlagSet(c.viper, fs)\n\tsetupIssuesFlagSet(c.viper, fs)\n\n\tsetupRunPersistentFlags(runCmd.PersistentFlags(), &c.opts)\n\n\tc.cmd = runCmd\n\n\treturn c\n}\n\nfunc (c *runCommand) persistentPreRunE(cmd *cobra.Command, args []string) error {\n\tif err := c.startTracing(); err != nil {\n\t\treturn err\n\t}\n\n\tc.log.Infof(\"%s\", c.buildInfo.String())\n\n\tloader := config.NewLintersLoader(c.log.Child(logutils.DebugKeyConfigReader), c.viper, cmd.Flags(), c.opts.LoaderOptions, c.cfg, args)\n\n\terr := loader.Load(config.LoadOptions{CheckDeprecation: true, Validation: true})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't load config: %w\", err)\n\t}\n\n\t// https://go.dev/doc/go1.25#container-aware-gomaxprocs\n\tif c.cfg.Run.Concurrency != 0 {\n\t\truntime.GOMAXPROCS(c.cfg.Run.Concurrency)\n\t}\n\n\treturn nil\n}\n\nfunc (c *runCommand) persistentPostRunE(_ *cobra.Command, _ []string) error {\n\tif err := c.stopTracing(); err != nil {\n\t\treturn err\n\t}\n\n\tos.Exit(c.exitCode)\n\n\treturn nil\n}\n\nfunc (c *runCommand) preRunE(_ *cobra.Command, args []string) error {\n\tdbManager, err := lintersdb.NewManager(c.log.Child(logutils.DebugKeyLintersDB), c.cfg,\n\t\tlintersdb.NewLinterBuilder(), lintersdb.NewPluginModuleBuilder(c.log), lintersdb.NewPluginGoBuilder(c.log))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.dbManager = dbManager\n\n\tc.printer, err = printers.NewPrinter(c.log, &c.cfg.Output.Formats, c.reportData, c.cfg.GetBasePath())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.goenv = goutil.NewEnv(c.log.Child(logutils.DebugKeyGoEnv))\n\n\tc.fileCache = fsutils.NewFileCache()\n\tc.lineCache = fsutils.NewLineCache(c.fileCache)\n\n\tsw := timeutils.NewStopwatch(\"pkgcache\", c.log.Child(logutils.DebugKeyStopwatch))\n\n\tpkgCache, err := cache.NewCache(sw, c.log.Child(logutils.DebugKeyPkgCache))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to build packages cache: %w\", err)\n\t}\n\n\tguard := load.NewGuard()\n\n\tpkgLoader := lint.NewPackageLoader(c.log.Child(logutils.DebugKeyLoader), c.cfg, args, c.goenv, guard)\n\n\tc.contextBuilder = lint.NewContextBuilder(c.cfg, pkgLoader, pkgCache, guard)\n\n\tif err = initHashSalt(c.log.Child(logutils.DebugKeyGoModSalt), c.buildInfo.Version, c.cfg); err != nil {\n\t\treturn fmt.Errorf(\"failed to init hash salt: %w\", err)\n\t}\n\n\tif ok := c.acquireFileLock(); !ok {\n\t\treturn errors.New(\"parallel golangci-lint is running\")\n\t}\n\n\treturn nil\n}\n\nfunc (c *runCommand) postRun(_ *cobra.Command, _ []string) {\n\tc.releaseFileLock()\n}\n\nfunc (c *runCommand) execute(_ *cobra.Command, _ []string) {\n\tneedTrackResources := logutils.IsVerbose() || c.opts.PrintResourcesUsage\n\n\ttrackResourcesEndCh := make(chan struct{})\n\n\t// Note: this defer must be before ctx.cancel defer\n\tdefer func() {\n\t\t// wait until resource tracking finished to print properly\n\t\tif needTrackResources {\n\t\t\t<-trackResourcesEndCh\n\t\t}\n\t}()\n\n\tctx, cancel := context.WithCancel(context.Background())\n\tif c.cfg.Run.Timeout > 0 {\n\t\tctx, cancel = context.WithTimeout(ctx, c.cfg.Run.Timeout)\n\t}\n\tdefer cancel()\n\n\tif needTrackResources {\n\t\tgo watchResources(ctx, trackResourcesEndCh, c.log, c.debugf)\n\t}\n\n\tif err := c.runAndPrint(ctx); err != nil {\n\t\tc.log.Errorf(\"Running error: %s\", err)\n\t\tif c.exitCode == exitcodes.Success {\n\t\t\tvar exitErr *exitcodes.ExitError\n\t\t\tif errors.As(err, &exitErr) {\n\t\t\t\tc.exitCode = exitErr.Code\n\t\t\t} else {\n\t\t\t\tc.exitCode = exitcodes.Failure\n\t\t\t}\n\t\t}\n\t}\n\n\tc.setupExitCode(ctx)\n}\n\nfunc (c *runCommand) startTracing() error {\n\tif c.opts.CPUProfilePath != \"\" {\n\t\tf, err := os.Create(c.opts.CPUProfilePath)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create file %s: %w\", c.opts.CPUProfilePath, err)\n\t\t}\n\t\tif err := pprof.StartCPUProfile(f); err != nil {\n\t\t\treturn fmt.Errorf(\"can't start CPU profiling: %w\", err)\n\t\t}\n\t}\n\n\tif c.opts.MemProfilePath != \"\" {\n\t\tif rate := os.Getenv(envMemProfileRate); rate != \"\" {\n\t\t\truntime.MemProfileRate, _ = strconv.Atoi(rate)\n\t\t}\n\t}\n\n\tif c.opts.TracePath != \"\" {\n\t\tf, err := os.Create(c.opts.TracePath)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create file %s: %w\", c.opts.TracePath, err)\n\t\t}\n\t\tif err = trace.Start(f); err != nil {\n\t\t\treturn fmt.Errorf(\"can't start tracing: %w\", err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *runCommand) stopTracing() error {\n\tif c.opts.CPUProfilePath != \"\" {\n\t\tpprof.StopCPUProfile()\n\t}\n\n\tif c.opts.MemProfilePath != \"\" {\n\t\tf, err := os.Create(c.opts.MemProfilePath)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create file %s: %w\", c.opts.MemProfilePath, err)\n\t\t}\n\n\t\tvar ms runtime.MemStats\n\t\truntime.ReadMemStats(&ms)\n\t\tprintMemStats(&ms, c.log)\n\n\t\tif err := pprof.WriteHeapProfile(f); err != nil {\n\t\t\treturn fmt.Errorf(\"can't write heap profile: %w\", err)\n\t\t}\n\t\t_ = f.Close()\n\t}\n\n\tif c.opts.TracePath != \"\" {\n\t\ttrace.Stop()\n\t}\n\n\treturn nil\n}\n\nfunc (c *runCommand) runAndPrint(ctx context.Context) error {\n\tif err := c.goenv.Discover(ctx); err != nil {\n\t\tc.log.Warnf(\"Failed to discover go env: %s\", err)\n\t}\n\n\tif !logutils.HaveDebugTag(logutils.DebugKeyLintersOutput) {\n\t\t// Don't allow linters and loader to print anything\n\t\tlog.SetOutput(io.Discard)\n\t\tsavedStdout, savedStderr := c.setOutputToDevNull()\n\t\tdefer func() {\n\t\t\tos.Stdout, os.Stderr = savedStdout, savedStderr\n\t\t}()\n\t}\n\n\tenabledLintersMap, err := c.dbManager.GetEnabledLintersMap()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.printDeprecatedLinterMessages(enabledLintersMap)\n\n\tissues, err := c.runAnalysis(ctx)\n\tif err != nil {\n\t\treturn err // XXX: don't lose type\n\t}\n\n\t// Fills linters information for the JSON printer.\n\tfor _, lc := range c.dbManager.GetAllSupportedLinterConfigs() {\n\t\tisEnabled := enabledLintersMap[lc.Name()] != nil\n\t\tc.reportData.AddLinter(lc.Name(), isEnabled)\n\t}\n\n\terr = c.printer.Print(issues)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.printStats(issues)\n\n\tc.setExitCodeIfIssuesFound(issues)\n\n\tc.fileCache.PrintStats(c.log)\n\n\treturn nil\n}\n\n// runAnalysis executes the linters that have been enabled in the configuration.\nfunc (c *runCommand) runAnalysis(ctx context.Context) ([]*result.Issue, error) {\n\tlintersToRun, err := c.dbManager.GetOptimizedLinters()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tlintCtx, err := c.contextBuilder.Build(ctx, c.log.Child(logutils.DebugKeyLintersContext), lintersToRun)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"context loading failed: %w\", err)\n\t}\n\n\trunner, err := lint.NewRunner(c.log.Child(logutils.DebugKeyRunner), c.cfg,\n\t\tc.goenv, c.lineCache, c.fileCache, c.dbManager, lintCtx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn runner.Run(ctx, lintersToRun)\n}\n\nfunc (c *runCommand) setOutputToDevNull() (savedStdout, savedStderr *os.File) {\n\tsavedStdout, savedStderr = os.Stdout, os.Stderr\n\tdevNull, err := os.Open(os.DevNull)\n\tif err != nil {\n\t\tc.log.Warnf(\"Can't open null device %q: %s\", os.DevNull, err)\n\t\treturn\n\t}\n\n\tos.Stdout, os.Stderr = devNull, devNull\n\treturn\n}\n\nfunc (c *runCommand) setExitCodeIfIssuesFound(issues []*result.Issue) {\n\tif len(issues) != 0 {\n\t\tc.exitCode = c.cfg.Run.ExitCodeIfIssuesFound\n\t}\n}\n\nfunc (c *runCommand) printDeprecatedLinterMessages(enabledLinters map[string]*linter.Config) {\n\tif c.cfg.InternalCmdTest || os.Getenv(logutils.EnvTestRun) == \"1\" {\n\t\treturn\n\t}\n\n\tfor name, lc := range enabledLinters {\n\t\tif !lc.IsDeprecated() {\n\t\t\tcontinue\n\t\t}\n\n\t\tvar extra string\n\t\tif lc.Deprecation.Replacement != \"\" {\n\t\t\textra = fmt.Sprintf(\"Replaced by %s.\", lc.Deprecation.Replacement)\n\t\t}\n\n\t\tc.log.Warnf(\"The linter '%s' is deprecated (since %s) due to: %s %s\", name, lc.Deprecation.Since, lc.Deprecation.Message, extra)\n\n\t\tif lc.Deprecation.ConfigSuggestion != nil {\n\t\t\tsuggestion, err := lc.Deprecation.ConfigSuggestion()\n\t\t\tif err != nil {\n\t\t\t\tc.log.Errorf(\"New configuration suggestion error: %v\", err)\n\t\t\t}\n\n\t\t\tif suggestion != \"\" {\n\t\t\t\tc.log.Warnf(\"Suggested new configuration:\\n%s\", suggestion)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (c *runCommand) printStats(issues []*result.Issue) {\n\tif !c.cfg.Output.ShowStats {\n\t\treturn\n\t}\n\n\tif len(issues) == 0 {\n\t\tc.cmd.Println(\"0 issues.\")\n\t\treturn\n\t}\n\n\tstats := map[string]int{}\n\tfor idx := range issues {\n\t\tstats[issues[idx].FromLinter]++\n\t}\n\n\tc.cmd.Printf(\"%d issues:\\n\", len(issues))\n\n\tkeys := slices.Sorted(maps.Keys(stats))\n\n\tfor _, key := range keys {\n\t\tc.cmd.Printf(\"* %s: %d\\n\", key, stats[key])\n\t}\n}\n\nfunc (c *runCommand) setupExitCode(ctx context.Context) {\n\tif ctx.Err() != nil {\n\t\tc.exitCode = exitcodes.Timeout\n\t\tc.log.Errorf(\"Timeout exceeded: try increasing it by passing --timeout option\")\n\t\treturn\n\t}\n\n\tif c.exitCode != exitcodes.Success {\n\t\treturn\n\t}\n\n\tneedFailOnWarnings := os.Getenv(logutils.EnvTestRun) == \"1\" || os.Getenv(envFailOnWarnings) == \"1\"\n\tif needFailOnWarnings && len(c.reportData.Warnings) != 0 {\n\t\tc.exitCode = exitcodes.WarningInTest\n\t\treturn\n\t}\n\n\tif c.reportData.Error != \"\" {\n\t\t// it's a case e.g. when typecheck linter couldn't parse and error and just logged it\n\t\tc.exitCode = exitcodes.ErrorWasLogged\n\t\treturn\n\t}\n}\n\nfunc (c *runCommand) acquireFileLock() bool {\n\tif c.cfg.Run.AllowParallelRunners {\n\t\tc.debugf(\"Parallel runners are allowed, no locking\")\n\t\treturn true\n\t}\n\n\tlockFile := filepath.Join(os.TempDir(), \"golangci-lint.lock\")\n\tc.debugf(\"Locking on file %s...\", lockFile)\n\tf := flock.New(lockFile)\n\tconst retryDelay = time.Second\n\n\tctx := context.Background()\n\tif !c.cfg.Run.AllowSerialRunners {\n\t\tconst totalTimeout = 5 * time.Second\n\t\tvar cancel context.CancelFunc\n\t\tctx, cancel = context.WithTimeout(ctx, totalTimeout)\n\t\tdefer cancel()\n\t}\n\tif ok, _ := f.TryLockContext(ctx, retryDelay); !ok {\n\t\treturn false\n\t}\n\n\tc.flock = f\n\treturn true\n}\n\nfunc (c *runCommand) releaseFileLock() {\n\tif c.cfg.Run.AllowParallelRunners {\n\t\treturn\n\t}\n\n\tif err := c.flock.Unlock(); err != nil {\n\t\tc.debugf(\"Failed to unlock on file: %s\", err)\n\t}\n\tif err := os.Remove(c.flock.Path()); err != nil {\n\t\tc.debugf(\"Failed to remove lock file: %s\", err)\n\t}\n}\n\nfunc watchResources(ctx context.Context, done chan struct{}, logger logutils.Log, debugf logutils.DebugFunc) {\n\tstartedAt := time.Now()\n\tdebugf(\"Started tracking time\")\n\n\tvar maxRSSMB, totalRSSMB float64\n\tvar iterationsCount int\n\n\tconst intervalMS = 100\n\tticker := time.NewTicker(intervalMS * time.Millisecond)\n\tdefer ticker.Stop()\n\n\tlogEveryRecord := os.Getenv(envMemLogEvery) == \"1\"\n\tconst MB = 1024 * 1024\n\n\ttrack := func() {\n\t\tvar m runtime.MemStats\n\t\truntime.ReadMemStats(&m)\n\n\t\tif logEveryRecord {\n\t\t\tdebugf(\"Stopping memory tracing iteration, printing ...\")\n\t\t\tprintMemStats(&m, logger)\n\t\t}\n\n\t\trssMB := float64(m.Sys) / MB\n\t\tif rssMB > maxRSSMB {\n\t\t\tmaxRSSMB = rssMB\n\t\t}\n\t\ttotalRSSMB += rssMB\n\t\titerationsCount++\n\t}\n\n\tfor {\n\t\ttrack()\n\n\t\tstop := false\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\tstop = true\n\t\t\tdebugf(\"Stopped resources tracking\")\n\t\tcase <-ticker.C:\n\t\t}\n\n\t\tif stop {\n\t\t\tbreak\n\t\t}\n\t}\n\ttrack()\n\n\tavgRSSMB := totalRSSMB / float64(iterationsCount)\n\n\tlogger.Infof(\"Memory: %d samples, avg is %.1fMB, max is %.1fMB\",\n\t\titerationsCount, avgRSSMB, maxRSSMB)\n\tlogger.Infof(\"Execution took %s\", time.Since(startedAt))\n\tclose(done)\n}\n\nfunc setupConfigFileFlagSet(fs *pflag.FlagSet, cfg *config.LoaderOptions) {\n\tfs.StringVarP(&cfg.Config, \"config\", \"c\", \"\", color.GreenString(\"Read config from file path `PATH`\"))\n\tfs.BoolVar(&cfg.NoConfig, \"no-config\", false, color.GreenString(\"Don't read config file\"))\n}\n\nfunc setupRunPersistentFlags(fs *pflag.FlagSet, opts *runOptions) {\n\tfs.BoolVar(&opts.PrintResourcesUsage, \"print-resources-usage\", false,\n\t\tcolor.GreenString(\"Print avg and max memory usage of golangci-lint and total time\"))\n\t_ = fs.MarkDeprecated(\"print-resources-usage\", \"use --verbose instead\")\n\n\tfs.StringVar(&opts.CPUProfilePath, \"cpu-profile-path\", \"\", color.GreenString(\"Path to CPU profile output file\"))\n\tfs.StringVar(&opts.MemProfilePath, \"mem-profile-path\", \"\", color.GreenString(\"Path to memory profile output file\"))\n\tfs.StringVar(&opts.TracePath, \"trace-path\", \"\", color.GreenString(\"Path to trace output file\"))\n}\n\nfunc printMemStats(ms *runtime.MemStats, logger logutils.Log) {\n\tlogger.Infof(\"Mem stats: alloc=%s total_alloc=%s sys=%s \"+\n\t\t\"heap_alloc=%s heap_sys=%s heap_idle=%s heap_released=%s heap_in_use=%s \"+\n\t\t\"stack_in_use=%s stack_sys=%s \"+\n\t\t\"mspan_sys=%s mcache_sys=%s buck_hash_sys=%s gc_sys=%s other_sys=%s \"+\n\t\t\"mallocs_n=%d frees_n=%d heap_objects_n=%d gc_cpu_fraction=%.2f\",\n\t\tformatMemory(ms.Alloc), formatMemory(ms.TotalAlloc), formatMemory(ms.Sys),\n\t\tformatMemory(ms.HeapAlloc), formatMemory(ms.HeapSys),\n\t\tformatMemory(ms.HeapIdle), formatMemory(ms.HeapReleased), formatMemory(ms.HeapInuse),\n\t\tformatMemory(ms.StackInuse), formatMemory(ms.StackSys),\n\t\tformatMemory(ms.MSpanSys), formatMemory(ms.MCacheSys), formatMemory(ms.BuckHashSys),\n\t\tformatMemory(ms.GCSys), formatMemory(ms.OtherSys),\n\t\tms.Mallocs, ms.Frees, ms.HeapObjects, ms.GCCPUFraction)\n}\n\nfunc formatMemory(memBytes uint64) string {\n\tconst Kb = 1024\n\tconst Mb = Kb * 1024\n\n\tif memBytes < Kb {\n\t\treturn fmt.Sprintf(\"%db\", memBytes)\n\t}\n\tif memBytes < Mb {\n\t\treturn fmt.Sprintf(\"%dkb\", memBytes/Kb)\n\t}\n\treturn fmt.Sprintf(\"%dmb\", memBytes/Mb)\n}\n\n// Related to cache.\n\nfunc initHashSalt(logger logutils.Log, version string, cfg *config.Config) error {\n\tbinSalt, err := computeBinarySalt(version)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to calculate binary salt: %w\", err)\n\t}\n\n\tconfigSalt, err := computeConfigSalt(cfg)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to calculate config salt: %w\", err)\n\t}\n\n\tgoModSalt, err := computeGoModSalt()\n\tif err != nil {\n\t\t// NOTE: missing go.mod must be ignored.\n\t\tlogger.Warnf(\"Failed to calculate go.mod salt: %v\", err)\n\t}\n\n\tb := bytes.NewBuffer(binSalt)\n\tb.Write(configSalt)\n\tb.WriteString(goModSalt)\n\n\tcache.SetSalt(b)\n\n\treturn nil\n}\n\nfunc computeBinarySalt(version string) ([]byte, error) {\n\tif version != \"\" && version != \"(devel)\" {\n\t\treturn []byte(version), nil\n\t}\n\n\tif logutils.HaveDebugTag(logutils.DebugKeyBinSalt) {\n\t\treturn []byte(\"debug\"), nil\n\t}\n\n\tp, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tf, err := os.Open(p)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefer f.Close()\n\n\th := sha256.New()\n\tif _, err := io.Copy(h, f); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn h.Sum(nil), nil\n}\n\n// computeConfigSalt computes configuration hash.\n// We don't hash all config fields to reduce meaningless cache invalidations.\n// At least, it has a huge impact on tests speed.\n// Fields: `LintersSettings` and `Run.BuildTags`.\nfunc computeConfigSalt(cfg *config.Config) ([]byte, error) {\n\tlintersSettingsBytes, err := yaml.Marshal(cfg.Linters.Settings)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to JSON marshal config linter settings: %w\", err)\n\t}\n\n\tconfigData := bytes.NewBufferString(\"linters.settings=\")\n\tconfigData.Write(lintersSettingsBytes)\n\tconfigData.WriteString(\"\\nbuild-tags=%s\" + strings.Join(cfg.Run.BuildTags, \",\"))\n\n\th := sha256.New()\n\tif _, err := h.Write(configData.Bytes()); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn h.Sum(nil), nil\n}\n\nfunc computeGoModSalt() (string, error) {\n\tvalues, err := goenv.Get(context.Background(), goenv.GOMOD)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to get goenv: %w\", err)\n\t}\n\n\tgoModPath := filepath.Clean(values[goenv.GOMOD])\n\n\tdata, err := os.ReadFile(goModPath)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to read go.mod: %w\", err)\n\t}\n\n\tsum, err := dirhash.Hash1([]string{goModPath}, func(string) (io.ReadCloser, error) {\n\t\treturn io.NopCloser(bytes.NewReader(data)), nil\n\t})\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to compute go.sum: %w\", err)\n\t}\n\n\treturn sum, nil\n}\n"
  },
  {
    "path": "pkg/commands/version.go",
    "content": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"runtime/debug\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n)\n\ntype BuildInfo struct {\n\tGoVersion string           `json:\"goVersion\"`\n\tVersion   string           `json:\"version\"`\n\tCommit    string           `json:\"commit\"`\n\tDate      string           `json:\"date\"`\n\tBuildInfo *debug.BuildInfo `json:\"buildInfo,omitempty\"`\n}\n\nfunc (b BuildInfo) String() string {\n\treturn fmt.Sprintf(\"golangci-lint has version %s built with %s from %s on %s\",\n\t\tb.Version, b.GoVersion, b.Commit, b.Date)\n}\n\ntype versionOptions struct {\n\tDebug bool\n\tJSON  bool\n\tShort bool\n}\n\ntype versionCommand struct {\n\tcmd  *cobra.Command\n\topts versionOptions\n\n\tinfo BuildInfo\n}\n\nfunc newVersionCommand(info BuildInfo) *versionCommand {\n\tc := &versionCommand{info: info}\n\n\tversionCmd := &cobra.Command{\n\t\tUse:               \"version\",\n\t\tShort:             \"Display the golangci-lint version.\",\n\t\tArgs:              cobra.NoArgs,\n\t\tValidArgsFunction: cobra.NoFileCompletions,\n\t\tRunE:              c.execute,\n\t}\n\n\tfs := versionCmd.Flags()\n\tfs.SortFlags = false // sort them as they are defined here\n\n\tfs.BoolVar(&c.opts.Debug, \"debug\", false, color.GreenString(\"Add build information\"))\n\tfs.BoolVar(&c.opts.JSON, \"json\", false, color.GreenString(\"Display as JSON\"))\n\tfs.BoolVar(&c.opts.Short, \"short\", false, color.GreenString(\"Display only the version number\"))\n\n\tc.cmd = versionCmd\n\n\treturn c\n}\n\nfunc (c *versionCommand) execute(_ *cobra.Command, _ []string) error {\n\tvar info *debug.BuildInfo\n\tif c.opts.Debug {\n\t\tinfo, _ = debug.ReadBuildInfo()\n\t}\n\n\tswitch {\n\tcase c.opts.JSON:\n\t\tc.info.BuildInfo = info\n\n\t\treturn json.NewEncoder(os.Stdout).Encode(c.info)\n\tcase c.opts.Short:\n\t\tfmt.Println(c.info.Version)\n\n\t\treturn nil\n\n\tdefault:\n\t\tif info != nil {\n\t\t\tfmt.Println(info.String())\n\t\t}\n\n\t\treturn printVersion(os.Stdout, c.info)\n\t}\n}\n\nfunc printVersion(w io.Writer, info BuildInfo) error {\n\t_, err := fmt.Fprintln(w, info.String())\n\treturn err\n}\n"
  },
  {
    "path": "pkg/config/base_loader.go",
    "content": "package config\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\n\t\"github.com/go-viper/mapstructure/v2\"\n\t\"github.com/mitchellh/go-homedir\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype BaseConfig interface {\n\tIsInternalTest() bool\n\tSetConfigDir(dir string)\n}\n\ntype BaseLoader struct {\n\topts LoaderOptions\n\n\tviper *viper.Viper\n\n\tlog logutils.Log\n\n\tcfg  BaseConfig\n\targs []string\n}\n\nfunc NewBaseLoader(log logutils.Log, v *viper.Viper, opts LoaderOptions, cfg BaseConfig, args []string) *BaseLoader {\n\treturn &BaseLoader{\n\t\topts:  opts,\n\t\tviper: v,\n\t\tlog:   log,\n\t\tcfg:   cfg,\n\t\targs:  args,\n\t}\n}\n\nfunc (l *BaseLoader) Load() error {\n\terr := l.setConfigFile()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = l.parseConfig()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (l *BaseLoader) setConfigFile() error {\n\tconfigFile, err := l.evaluateOptions()\n\tif err != nil {\n\t\tif errors.Is(err, errConfigDisabled) {\n\t\t\treturn nil\n\t\t}\n\n\t\treturn fmt.Errorf(\"can't parse --config option: %w\", err)\n\t}\n\n\tif configFile != \"\" {\n\t\tl.viper.SetConfigFile(configFile)\n\n\t\t// Assume YAML if the file has no extension.\n\t\tif filepath.Ext(configFile) == \"\" {\n\t\t\tl.viper.SetConfigType(\"yaml\")\n\t\t}\n\t} else {\n\t\tl.setupConfigFileSearch()\n\t}\n\n\treturn nil\n}\n\nfunc (l *BaseLoader) evaluateOptions() (string, error) {\n\tif l.opts.NoConfig && l.opts.Config != \"\" {\n\t\treturn \"\", errors.New(\"can't combine option --config and --no-config\")\n\t}\n\n\tif l.opts.NoConfig {\n\t\treturn \"\", errConfigDisabled\n\t}\n\n\tconfigFile, err := homedir.Expand(l.opts.Config)\n\tif err != nil {\n\t\treturn \"\", errors.New(\"failed to expand configuration path\")\n\t}\n\n\treturn configFile, nil\n}\n\nfunc (l *BaseLoader) setupConfigFileSearch() {\n\tl.viper.SetConfigName(\".golangci\")\n\n\tconfigSearchPaths := l.getConfigSearchPaths()\n\n\tl.log.Infof(\"Config search paths: %s\", configSearchPaths)\n\n\tfor _, p := range configSearchPaths {\n\t\tl.viper.AddConfigPath(p)\n\t}\n}\n\nfunc (l *BaseLoader) getConfigSearchPaths() []string {\n\tfirstArg := \"./...\"\n\tif len(l.args) > 0 {\n\t\tfirstArg = l.args[0]\n\t}\n\n\tabsPath, err := filepath.Abs(firstArg)\n\tif err != nil {\n\t\tl.log.Warnf(\"Can't make abs path for %q: %s\", firstArg, err)\n\t\tabsPath = filepath.Clean(firstArg)\n\t}\n\n\t// start from it\n\tvar currentDir string\n\tif fsutils.IsDir(absPath) {\n\t\tcurrentDir = absPath\n\t} else {\n\t\tcurrentDir = filepath.Dir(absPath)\n\t}\n\n\t// find all dirs from it up to the root\n\tsearchPaths := []string{\"./\"}\n\n\tfor {\n\t\tsearchPaths = append(searchPaths, currentDir)\n\n\t\tparent := filepath.Dir(currentDir)\n\t\tif currentDir == parent || parent == \"\" {\n\t\t\tbreak\n\t\t}\n\n\t\tcurrentDir = parent\n\t}\n\n\t// find home directory for global config\n\tif home, err := homedir.Dir(); err != nil {\n\t\tl.log.Warnf(\"Can't get user's home directory: %v\", err)\n\t} else if !slices.Contains(searchPaths, home) {\n\t\tsearchPaths = append(searchPaths, home)\n\t}\n\n\treturn searchPaths\n}\n\nfunc (l *BaseLoader) parseConfig() error {\n\tif err := l.viper.ReadInConfig(); err != nil {\n\t\tvar configFileNotFoundError viper.ConfigFileNotFoundError\n\t\tif errors.As(err, &configFileNotFoundError) {\n\t\t\t// Load configuration from flags only.\n\t\t\terr = l.viper.Unmarshal(l.cfg, customDecoderHook())\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"can't unmarshal config by viper (flags): %w\", err)\n\t\t\t}\n\n\t\t\treturn nil\n\t\t}\n\n\t\treturn fmt.Errorf(\"can't read viper config: %w\", err)\n\t}\n\n\terr := l.setConfigDir()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Load configuration from all sources (flags, file).\n\tif err := l.viper.Unmarshal(l.cfg, customDecoderHook()); err != nil {\n\t\treturn fmt.Errorf(\"can't unmarshal config by viper (flags, file): %w\", err)\n\t}\n\n\tif l.cfg.IsInternalTest() { // just for testing purposes: to detect config file usage\n\t\t_, _ = fmt.Fprintln(logutils.StdOut, \"test\")\n\t\tos.Exit(exitcodes.Success)\n\t}\n\n\treturn nil\n}\n\nfunc (l *BaseLoader) setConfigDir() error {\n\tusedConfigFile := l.viper.ConfigFileUsed()\n\tif usedConfigFile == \"\" {\n\t\treturn nil\n\t}\n\n\tif usedConfigFile == os.Stdin.Name() {\n\t\tusedConfigFile = \"\"\n\t\tl.log.Infof(\"Reading config file stdin\")\n\t} else {\n\t\tvar err error\n\t\tusedConfigFile, err = fsutils.ShortestRelPath(usedConfigFile, \"\")\n\t\tif err != nil {\n\t\t\tl.log.Warnf(\"Can't pretty print config file path: %v\", err)\n\t\t}\n\n\t\tl.log.Infof(\"Used config file %s\", usedConfigFile)\n\t}\n\n\tusedConfigDir, err := filepath.Abs(filepath.Dir(usedConfigFile))\n\tif err != nil {\n\t\treturn errors.New(\"can't get config directory\")\n\t}\n\n\tl.cfg.SetConfigDir(usedConfigDir)\n\n\treturn nil\n}\n\nfunc customDecoderHook() viper.DecoderConfigOption {\n\treturn viper.DecodeHook(DecodeHookFunc())\n}\n\nfunc DecodeHookFunc() mapstructure.DecodeHookFunc {\n\treturn mapstructure.ComposeDecodeHookFunc(\n\t\t// Default hooks (https://github.com/spf13/viper/blob/518241257478c557633ab36e474dfcaeb9a3c623/viper.go#L135-L138).\n\t\tmapstructure.StringToTimeDurationHookFunc(),\n\t\tmapstructure.StringToSliceHookFunc(\",\"),\n\n\t\t// Needed for forbidigo, and output.formats.\n\t\tmapstructure.TextUnmarshallerHookFunc(),\n\t)\n}\n"
  },
  {
    "path": "pkg/config/base_rule.go",
    "content": "package config\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n)\n\ntype BaseRule struct {\n\tLinters    []string `mapstructure:\"linters\"`\n\tPath       string   `mapstructure:\"path\"`\n\tPathExcept string   `mapstructure:\"path-except\"`\n\tText       string   `mapstructure:\"text\"`\n\tSource     string   `mapstructure:\"source\"`\n\n\t// For compatibility with exclude-use-default/include.\n\tInternalReference string `mapstructure:\"-\"`\n}\n\nfunc (b *BaseRule) Validate(minConditionsCount int) error {\n\tif err := validateOptionalRegex(b.Path); err != nil {\n\t\treturn fmt.Errorf(\"invalid path regex: %w\", err)\n\t}\n\n\tif err := validateOptionalRegex(b.PathExcept); err != nil {\n\t\treturn fmt.Errorf(\"invalid path-except regex: %w\", err)\n\t}\n\n\tif err := validateOptionalRegex(b.Text); err != nil {\n\t\treturn fmt.Errorf(\"invalid text regex: %w\", err)\n\t}\n\n\tif err := validateOptionalRegex(b.Source); err != nil {\n\t\treturn fmt.Errorf(\"invalid source regex: %w\", err)\n\t}\n\n\tif b.Path != \"\" && b.PathExcept != \"\" {\n\t\treturn errors.New(\"path and path-except should not be set at the same time\")\n\t}\n\n\tnonBlank := 0\n\tif len(b.Linters) > 0 {\n\t\tnonBlank++\n\t}\n\n\t// Filtering by path counts as one condition, regardless how it is done (one or both).\n\t// Otherwise, a rule with Path and PathExcept set would pass validation\n\t// whereas before the introduction of path-except that wouldn't have been precise enough.\n\tif b.Path != \"\" || b.PathExcept != \"\" {\n\t\tnonBlank++\n\t}\n\n\tif b.Text != \"\" {\n\t\tnonBlank++\n\t}\n\n\tif b.Source != \"\" {\n\t\tnonBlank++\n\t}\n\n\tif nonBlank < minConditionsCount {\n\t\treturn fmt.Errorf(\"at least %d of (text, source, path[-except], linters) should be set\", minConditionsCount)\n\t}\n\n\treturn nil\n}\n\nfunc validateOptionalRegex(value string) error {\n\tif value == \"\" {\n\t\treturn nil\n\t}\n\n\t_, err := regexp.Compile(value)\n\treturn err\n}\n"
  },
  {
    "path": "pkg/config/config.go",
    "content": "package config\n\nimport (\n\t\"cmp\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\n\thcversion \"github.com/hashicorp/go-version\"\n\t\"github.com/ldez/grignotin/goenv\"\n\t\"github.com/ldez/grignotin/gomod\"\n\t\"golang.org/x/mod/modfile\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\n// defaultGoVersion the value should be \"oldstable\" - 1.\n// If the current stable version is 1.24 then 1.23 - 1 = 1.22.\nconst defaultGoVersion = \"1.22\"\n\n// Config encapsulates the config data specified in the golangci-lint YAML config file.\ntype Config struct {\n\tcfgDir   string // Path to the directory containing golangci-lint config file.\n\tbasePath string // Path the root directory related to [Run.RelativePathMode].\n\n\tVersion string `mapstructure:\"version\"`\n\n\tRun Run `mapstructure:\"run\"`\n\n\tOutput Output `mapstructure:\"output\"`\n\n\tLinters Linters `mapstructure:\"linters\"`\n\n\tIssues   Issues   `mapstructure:\"issues\"`\n\tSeverity Severity `mapstructure:\"severity\"`\n\n\tFormatters Formatters `mapstructure:\"formatters\"`\n\n\tInternalCmdTest bool // Option is used only for testing golangci-lint command, don't use it\n\tInternalTest    bool // Option is used only for testing golangci-lint code, don't use it\n}\n\n// GetConfigDir returns the directory that contains golangci-lint config file.\nfunc (c *Config) GetConfigDir() string {\n\treturn c.cfgDir\n}\n\n// SetConfigDir sets the path to directory that contains golangci-lint config file.\nfunc (c *Config) SetConfigDir(dir string) {\n\tc.cfgDir = dir\n}\n\nfunc (c *Config) GetBasePath() string {\n\treturn c.basePath\n}\n\nfunc (c *Config) IsInternalTest() bool {\n\treturn c.InternalTest\n}\n\nfunc (c *Config) Validate() error {\n\tvalidators := []func() error{\n\t\tc.Run.Validate,\n\t\tc.Output.Validate,\n\t\tc.Linters.Validate,\n\t\tc.Formatters.Validate,\n\t\tc.Severity.Validate,\n\t}\n\n\tfor _, v := range validators {\n\t\tif err := v(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc NewDefault() *Config {\n\treturn &Config{\n\t\tLinters: Linters{\n\t\t\tSettings: defaultLintersSettings,\n\t\t},\n\t\tFormatters: Formatters{\n\t\t\tSettings: defaultFormatterSettings,\n\t\t},\n\t}\n}\n\nfunc IsGoGreaterThanOrEqual(current, limit string) bool {\n\tv1, err := hcversion.NewVersion(strings.TrimPrefix(current, \"go\"))\n\tif err != nil {\n\t\treturn false\n\t}\n\n\tl, err := hcversion.NewVersion(limit)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn v1.GreaterThanOrEqual(l)\n}\n\nfunc detectGoVersion(ctx context.Context, log logutils.Log) string {\n\treturn cmp.Or(detectGoVersionFromGoMod(ctx, log), defaultGoVersion)\n}\n\n// detectGoVersionFromGoMod tries to get Go version from go.mod.\n// It returns `toolchain` version if present,\n// else it returns `go` version if present,\n// else it returns `GOVERSION` version if present,\n// else it returns empty.\nfunc detectGoVersionFromGoMod(ctx context.Context, log logutils.Log) string {\n\tvalues, err := goenv.Get(ctx, goenv.GOMOD, goenv.GOVERSION)\n\tif err != nil {\n\t\tvalues = map[string]string{\n\t\t\tgoenv.GOMOD: detectGoModFallback(ctx),\n\t\t}\n\t}\n\n\tif values[goenv.GOMOD] == \"\" {\n\t\treturn parseGoVersion(values[goenv.GOVERSION])\n\t}\n\n\tfile, err := parseGoMod(values[goenv.GOMOD])\n\tif err != nil {\n\t\treturn parseGoVersion(values[goenv.GOVERSION])\n\t}\n\n\tif file.Module != nil {\n\t\tlog.Infof(\"Module name %q\", file.Module.Mod.Path)\n\t}\n\n\t// The toolchain exists only if 'toolchain' version > 'go' version.\n\t// If 'toolchain' version <= 'go' version, `go mod tidy` will remove 'toolchain' version from go.mod.\n\tif file.Toolchain != nil && file.Toolchain.Name != \"\" {\n\t\treturn parseGoVersion(file.Toolchain.Name)\n\t}\n\n\tif file.Go != nil && file.Go.Version != \"\" {\n\t\treturn file.Go.Version\n\t}\n\n\treturn parseGoVersion(values[goenv.GOVERSION])\n}\n\nfunc parseGoVersion(v string) string {\n\traw := strings.TrimPrefix(v, \"go\")\n\n\t// prerelease version (ex: go1.24rc1)\n\tidx := strings.IndexFunc(raw, func(r rune) bool {\n\t\treturn (r < '0' || r > '9') && r != '.'\n\t})\n\n\tif idx != -1 {\n\t\traw = raw[:idx]\n\t}\n\n\treturn raw\n}\n\nfunc parseGoMod(goMod string) (*modfile.File, error) {\n\traw, err := os.ReadFile(filepath.Clean(goMod))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"reading go.mod file: %w\", err)\n\t}\n\n\treturn modfile.Parse(\"go.mod\", raw, nil)\n}\n\nfunc detectGoModFallback(ctx context.Context) string {\n\tinfo, err := gomod.GetModuleInfo(ctx)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\n\twd, err := os.Getwd()\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\n\tslices.SortFunc(info, func(a, b gomod.ModInfo) int {\n\t\treturn cmp.Compare(len(b.Path), len(a.Path))\n\t})\n\n\tgoMod := info[0]\n\tfor _, m := range info {\n\t\tif !strings.HasPrefix(wd, m.Dir) {\n\t\t\tcontinue\n\t\t}\n\n\t\tgoMod = m\n\n\t\tbreak\n\t}\n\n\treturn goMod.GoMod\n}\n"
  },
  {
    "path": "pkg/config/config_test.go",
    "content": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestIsGoGreaterThanOrEqual(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc    string\n\t\tcurrent string\n\t\tlimit   string\n\t\tassert  assert.BoolAssertionFunc\n\t}{\n\t\t{\n\t\t\tdesc:    \"current (with minor.major) lower than limit\",\n\t\t\tcurrent: \"go1.21\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"current (with 0 patch) lower than limit\",\n\t\t\tcurrent: \"go1.21.0\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"current (current with multiple patches) lower than limit\",\n\t\t\tcurrent: \"go1.21.6\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"current lower than limit (with minor.major)\",\n\t\t\tcurrent: \"go1.22\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"current lower than limit (with 0 patch)\",\n\t\t\tcurrent: \"go1.22.0\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"current lower than limit (current with multiple patches)\",\n\t\t\tcurrent: \"go1.22.6\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"current greater than limit\",\n\t\t\tcurrent: \"go1.23.0\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"current with no prefix\",\n\t\t\tcurrent: \"1.22\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"invalid current value\",\n\t\t\tcurrent: \"go\",\n\t\t\tlimit:   \"1.22\",\n\t\t\tassert:  assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"invalid limit value\",\n\t\t\tcurrent: \"go1.22\",\n\t\t\tlimit:   \"go\",\n\t\t\tassert:  assert.False,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttest.assert(t, IsGoGreaterThanOrEqual(test.current, test.limit))\n\t\t})\n\t}\n}\n\nfunc Test_parseGoVersion(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tversion  string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"empty version\",\n\t\t\tversion:  \"\",\n\t\t\texpected: \"\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"no prefixed version\",\n\t\t\tversion:  \"1.23.0\",\n\t\t\texpected: \"1.23.0\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"semver version\",\n\t\t\tversion:  \"go1.23.0\",\n\t\t\texpected: \"1.23.0\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"family version\",\n\t\t\tversion:  \"go1.23\",\n\t\t\texpected: \"1.23\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"prerelease version\",\n\t\t\tversion:  \"go1.24rc1\",\n\t\t\texpected: \"1.24\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tv := parseGoVersion(test.version)\n\n\t\t\tassert.Equal(t, test.expected, v)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/config/formatters.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n)\n\ntype Formatters struct {\n\tEnable     []string            `mapstructure:\"enable\"`\n\tSettings   FormatterSettings   `mapstructure:\"settings\"`\n\tExclusions FormatterExclusions `mapstructure:\"exclusions\"`\n}\n\nfunc (f *Formatters) Validate() error {\n\tfor _, n := range f.Enable {\n\t\tif !slices.Contains(getAllFormatterNames(), n) {\n\t\t\treturn fmt.Errorf(\"%s is not a formatter\", n)\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype FormatterExclusions struct {\n\tGenerated  string   `mapstructure:\"generated\"`\n\tPaths      []string `mapstructure:\"paths\"`\n\tWarnUnused bool     `mapstructure:\"warn-unused\"`\n}\n"
  },
  {
    "path": "pkg/config/formatters_settings.go",
    "content": "package config\n\nvar defaultFormatterSettings = FormatterSettings{\n\tGoFmt: GoFmtSettings{\n\t\tSimplify: true,\n\t},\n\tGci: GciSettings{\n\t\tSections: []string{\"standard\", \"default\"},\n\t},\n\tGoLines: GoLinesSettings{\n\t\tMaxLen:         100,\n\t\tTabLen:         4,\n\t\tReformatTags:   true,\n\t\tChainSplitDots: true,\n\t},\n}\n\ntype FormatterSettings struct {\n\tGci       GciSettings       `mapstructure:\"gci\"`\n\tGoFmt     GoFmtSettings     `mapstructure:\"gofmt\"`\n\tGoFumpt   GoFumptSettings   `mapstructure:\"gofumpt\"`\n\tGoImports GoImportsSettings `mapstructure:\"goimports\"`\n\tGoLines   GoLinesSettings   `mapstructure:\"golines\"`\n}\n\ntype GciSettings struct {\n\tSections         []string `mapstructure:\"sections\"`\n\tNoInlineComments bool     `mapstructure:\"no-inline-comments\"`\n\tNoPrefixComments bool     `mapstructure:\"no-prefix-comments\"`\n\tCustomOrder      bool     `mapstructure:\"custom-order\"`\n\tNoLexOrder       bool     `mapstructure:\"no-lex-order\"`\n}\n\ntype GoFmtSettings struct {\n\tSimplify     bool               `mapstructure:\"simplify\"`\n\tRewriteRules []GoFmtRewriteRule `mapstructure:\"rewrite-rules\"`\n}\n\ntype GoFmtRewriteRule struct {\n\tPattern     string `mapstructure:\"pattern\"`\n\tReplacement string `mapstructure:\"replacement\"`\n}\n\ntype GoFumptSettings struct {\n\tModulePath string `mapstructure:\"module-path\"`\n\tExtraRules bool   `mapstructure:\"extra-rules\"`\n\n\tLangVersion string `mapstructure:\"-\"`\n}\n\ntype GoImportsSettings struct {\n\tLocalPrefixes []string `mapstructure:\"local-prefixes\"`\n}\n\ntype GoLinesSettings struct {\n\tMaxLen          int  `mapstructure:\"max-len\"`\n\tTabLen          int  `mapstructure:\"tab-len\"`\n\tShortenComments bool `mapstructure:\"shorten-comments\"`\n\tReformatTags    bool `mapstructure:\"reformat-tags\"`\n\tChainSplitDots  bool `mapstructure:\"chain-split-dots\"`\n}\n"
  },
  {
    "path": "pkg/config/issues.go",
    "content": "package config\n\ntype Issues struct {\n\tMaxIssuesPerLinter int  `mapstructure:\"max-issues-per-linter\"`\n\tMaxSameIssues      int  `mapstructure:\"max-same-issues\"`\n\tUniqByLine         bool `mapstructure:\"uniq-by-line\"`\n\n\tDiffFromRevision  string `mapstructure:\"new-from-rev\"`\n\tDiffFromMergeBase string `mapstructure:\"new-from-merge-base\"`\n\tDiffPatchFilePath string `mapstructure:\"new-from-patch\"`\n\tWholeFiles        bool   `mapstructure:\"whole-files\"`\n\tDiff              bool   `mapstructure:\"new\"`\n\n\tNeedFix bool `mapstructure:\"fix\"`\n}\n"
  },
  {
    "path": "pkg/config/linters.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n)\n\nconst (\n\tGroupStandard = \"standard\"\n\tGroupAll      = \"all\"\n\tGroupNone     = \"none\"\n\tGroupFast     = \"fast\"\n)\n\ntype Linters struct {\n\tDefault  string   `mapstructure:\"default\"`\n\tEnable   []string `mapstructure:\"enable\"`\n\tDisable  []string `mapstructure:\"disable\"`\n\tFastOnly bool     `mapstructure:\"fast-only\"` // Flag only option.\n\n\tSettings LintersSettings `mapstructure:\"settings\"`\n\n\tExclusions LinterExclusions `mapstructure:\"exclusions\"`\n}\n\nfunc (l *Linters) Validate() error {\n\tvalidators := []func() error{\n\t\tl.Exclusions.Validate,\n\t\tl.validateNoFormatters,\n\t}\n\n\tfor _, v := range validators {\n\t\tif err := v(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (l *Linters) validateNoFormatters() error {\n\tfor _, n := range slices.Concat(l.Enable, l.Disable) {\n\t\tif slices.Contains(getAllFormatterNames(), n) {\n\t\t\treturn fmt.Errorf(\"%s is a formatter\", n)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc getAllFormatterNames() []string {\n\treturn []string{\"gci\", \"gofmt\", \"gofumpt\", \"goimports\", \"golines\", \"swaggo\"}\n}\n"
  },
  {
    "path": "pkg/config/linters_exclusions.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n)\n\nconst (\n\tGeneratedModeLax     = \"lax\"\n\tGeneratedModeStrict  = \"strict\"\n\tGeneratedModeDisable = \"disable\"\n)\n\nconst (\n\tExclusionPresetComments             = \"comments\"\n\tExclusionPresetStdErrorHandling     = \"std-error-handling\"\n\tExclusionPresetCommonFalsePositives = \"common-false-positives\"\n\tExclusionPresetLegacy               = \"legacy\"\n)\n\nconst excludeRuleMinConditionsCount = 2\n\ntype LinterExclusions struct {\n\tGenerated   string        `mapstructure:\"generated\"`\n\tWarnUnused  bool          `mapstructure:\"warn-unused\"`\n\tPresets     []string      `mapstructure:\"presets\"`\n\tRules       []ExcludeRule `mapstructure:\"rules\"`\n\tPaths       []string      `mapstructure:\"paths\"`\n\tPathsExcept []string      `mapstructure:\"paths-except\"`\n}\n\nfunc (e *LinterExclusions) Validate() error {\n\tfor i, rule := range e.Rules {\n\t\tif err := rule.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"error in exclude rule #%d: %w\", i, err)\n\t\t}\n\t}\n\n\tallPresets := []string{\n\t\tExclusionPresetComments,\n\t\tExclusionPresetStdErrorHandling,\n\t\tExclusionPresetCommonFalsePositives,\n\t\tExclusionPresetLegacy,\n\t}\n\n\tfor _, preset := range e.Presets {\n\t\tif !slices.Contains(allPresets, preset) {\n\t\t\treturn fmt.Errorf(\"invalid preset: %s\", preset)\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype ExcludeRule struct {\n\tBaseRule `mapstructure:\",squash\"`\n}\n\nfunc (e *ExcludeRule) Validate() error {\n\treturn e.BaseRule.Validate(excludeRuleMinConditionsCount)\n}\n"
  },
  {
    "path": "pkg/config/linters_exclusions_test.go",
    "content": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestLinterExclusions_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc       string\n\t\texclusions *LinterExclusions\n\t}{\n\t\t{\n\t\t\tdesc:       \"empty configuration\",\n\t\t\texclusions: &LinterExclusions{},\n\t\t},\n\t\t{\n\t\t\tdesc: \"valid preset\",\n\t\t\texclusions: &LinterExclusions{\n\t\t\t\tPresets: []string{ExclusionPresetComments},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.exclusions.Validate()\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestLinterExclusions_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc       string\n\t\texclusions *LinterExclusions\n\t\texpected   string\n\t}{\n\t\t{\n\t\t\tdesc: \"invalid preset name\",\n\t\t\texclusions: &LinterExclusions{\n\t\t\t\tPresets: []string{\"foo\"},\n\t\t\t},\n\t\t\texpected: \"invalid preset: foo\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid rule: empty rule\",\n\t\t\texclusions: &LinterExclusions{\n\t\t\t\tRules: []ExcludeRule{{BaseRule: BaseRule{}}},\n\t\t\t},\n\t\t\texpected: \"error in exclude rule #0: at least 2 of (text, source, path[-except], linters) should be set\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.exclusions.Validate()\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/config/linters_settings.go",
    "content": "package config\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"runtime\"\n)\n\nvar defaultLintersSettings = LintersSettings{\n\tFormatterSettings: defaultFormatterSettings,\n\n\tAsasalint: AsasalintSettings{\n\t\tUseBuiltinExclusions: true,\n\t},\n\tDecorder: DecorderSettings{\n\t\tDecOrder:                  []string{\"type\", \"const\", \"var\", \"func\"},\n\t\tDisableDecNumCheck:        true,\n\t\tDisableDecOrderCheck:      true,\n\t\tDisableInitFuncFirstCheck: true,\n\t},\n\tDogsled: DogsledSettings{\n\t\tMaxBlankIdentifiers: 2,\n\t},\n\tDupl: DuplSettings{\n\t\tThreshold: 150,\n\t},\n\tEmbeddedStructFieldCheck: EmbeddedStructFieldCheckSettings{\n\t\tEmptyLine: true,\n\t},\n\tErrorLint: ErrorLintSettings{\n\t\tErrorf:      true,\n\t\tErrorfMulti: true,\n\t\tAsserts:     true,\n\t\tComparison:  true,\n\t},\n\tExhaustive: ExhaustiveSettings{\n\t\tCheck:                      []string{\"switch\"},\n\t\tDefaultSignifiesExhaustive: false,\n\t\tIgnoreEnumMembers:          \"\",\n\t\tPackageScopeOnly:           false,\n\t\tExplicitExhaustiveMap:      false,\n\t\tExplicitExhaustiveSwitch:   false,\n\t},\n\tForbidigo: ForbidigoSettings{\n\t\tExcludeGodocExamples: true,\n\t},\n\tFuncOrder: FuncOrderSettings{\n\t\tConstructor:  true,\n\t\tStructMethod: true,\n\t},\n\tFunlen: FunlenSettings{\n\t\tIgnoreComments: true,\n\t},\n\tGoChecksumType: GoChecksumTypeSettings{\n\t\tDefaultSignifiesExhaustive: true,\n\t},\n\tGocognit: GocognitSettings{\n\t\tMinComplexity: 30,\n\t},\n\tGoconst: GoConstSettings{\n\t\tMatchWithConstants:  true,\n\t\tMinStringLen:        3,\n\t\tMinOccurrencesCount: 3,\n\t\tNumberMin:           3,\n\t\tNumberMax:           3,\n\t\tIgnoreCalls:         true,\n\t},\n\tGocritic: GoCriticSettings{\n\t\tSettingsPerCheck: map[string]GoCriticCheckSettings{},\n\t},\n\tGocyclo: GoCycloSettings{\n\t\tMinComplexity: 30,\n\t},\n\tGodox: GodoxSettings{\n\t\tKeywords: []string{},\n\t},\n\tGodot: GodotSettings{\n\t\tScope:  \"declarations\",\n\t\tPeriod: true,\n\t},\n\tGosec: GoSecSettings{\n\t\tConcurrency: runtime.NumCPU(),\n\t},\n\tGosmopolitan: GosmopolitanSettings{\n\t\tAllowTimeLocal:  false,\n\t\tEscapeHatches:   []string{},\n\t\tWatchForScripts: []string{\"Han\"},\n\t},\n\tInamedparam: INamedParamSettings{\n\t\tSkipSingleParam: false,\n\t},\n\tInterfaceBloat: InterfaceBloatSettings{\n\t\tMax: 10,\n\t},\n\tLll: LllSettings{\n\t\tLineLength: 120,\n\t\tTabWidth:   1,\n\t},\n\tLoggerCheck: LoggerCheckSettings{\n\t\tKitlog:           true,\n\t\tKlog:             true,\n\t\tLogr:             true,\n\t\tSlog:             true,\n\t\tZap:              true,\n\t\tRequireStringKey: false,\n\t\tNoPrintfLike:     false,\n\t\tRules:            nil,\n\t},\n\tMaintIdx: MaintIdxSettings{\n\t\tUnder: 20,\n\t},\n\tNakedret: NakedretSettings{\n\t\tMaxFuncLines: 30,\n\t},\n\tNestif: NestifSettings{\n\t\tMinComplexity: 5,\n\t},\n\tNoLintLint: NoLintLintSettings{\n\t\tRequireExplanation: false,\n\t\tRequireSpecific:    false,\n\t\tAllowUnused:        false,\n\t},\n\tPerfSprint: PerfSprintSettings{\n\t\tIntegerFormat: true,\n\t\tIntConversion: true,\n\t\tErrorFormat:   true,\n\t\tErrError:      false,\n\t\tErrorF:        true,\n\t\tStringFormat:  true,\n\t\tSprintF1:      true,\n\t\tStrConcat:     true,\n\t\tBoolFormat:    true,\n\t\tHexFormat:     true,\n\t\tConcatLoop:    true,\n\t},\n\tPrealloc: PreallocSettings{\n\t\tSimple:     true,\n\t\tRangeLoops: true,\n\t\tForLoops:   false,\n\t},\n\tPredeclared: PredeclaredSettings{\n\t\tQualified: false,\n\t},\n\tSlogLint: SlogLintSettings{\n\t\tNoMixedArgs:    true,\n\t\tKVOnly:         false,\n\t\tAttrOnly:       false,\n\t\tNoGlobal:       \"\",\n\t\tContext:        \"\",\n\t\tStaticMsg:      false,\n\t\tNoRawKeys:      false,\n\t\tKeyNamingCase:  \"\",\n\t\tForbiddenKeys:  nil,\n\t\tArgsOnSepLines: false,\n\t},\n\tTagAlign: TagAlignSettings{\n\t\tAlign:  true,\n\t\tSort:   true,\n\t\tOrder:  nil,\n\t\tStrict: false,\n\t},\n\tTestpackage: TestpackageSettings{\n\t\tSkipRegexp:    `(export|internal)_test\\.go`,\n\t\tAllowPackages: []string{\"main\"},\n\t},\n\tUnqueryvet: UnqueryvetSettings{\n\t\tCheckSQLBuilders:     true,\n\t\tCheckAliasedWildcard: true,\n\t\tCheckStringConcat:    true,\n\t\tCheckFormatStrings:   true,\n\t\tCheckStringBuilder:   true,\n\t\tCheckSubqueries:      true,\n\t\tSQLBuilders: UnqueryvetSQLBuildersSettings{\n\t\t\tSquirrel:  true,\n\t\t\tGORM:      true,\n\t\t\tSQLx:      true,\n\t\t\tEnt:       true,\n\t\t\tPGX:       true,\n\t\t\tBun:       true,\n\t\t\tSQLBoiler: true,\n\t\t\tJet:       true,\n\t\t},\n\t\tCheckN1:           false,\n\t\tCheckSQLInjection: false,\n\t\tCheckTxLeak:       false,\n\t},\n\tUnused: UnusedSettings{\n\t\tFieldWritesAreUses:     true,\n\t\tPostStatementsAreReads: false,\n\t\tExportedFieldsAreUsed:  true,\n\t\tParametersAreUsed:      true,\n\t\tLocalVariablesAreUsed:  true,\n\t\tGeneratedIsUsed:        true,\n\t},\n\tUseStdlibVars: UseStdlibVarsSettings{\n\t\tHTTPMethod:     true,\n\t\tHTTPStatusCode: true,\n\t},\n\tUseTesting: UseTestingSettings{\n\t\tContextBackground: false,\n\t\tContextTodo:       false,\n\t\tOSChdir:           true,\n\t\tOSMkdirTemp:       true,\n\t\tOSSetenv:          true,\n\t\tOSTempDir:         false,\n\t\tOSCreateTemp:      true,\n\t},\n\tVarnamelen: VarnamelenSettings{\n\t\tMaxDistance:   5,\n\t\tMinNameLength: 3,\n\t},\n\tWSL: WSLv4Settings{\n\t\tStrictAppend:                     true,\n\t\tAllowAssignAndCallCuddle:         true,\n\t\tAllowAssignAndAnythingCuddle:     false,\n\t\tAllowMultiLineAssignCuddle:       true,\n\t\tForceCaseTrailingWhitespaceLimit: 0,\n\t\tAllowTrailingComment:             false,\n\t\tAllowSeparatedLeadingComment:     false,\n\t\tAllowCuddleDeclaration:           false,\n\t\tAllowCuddleWithCalls:             []string{\"Lock\", \"RLock\"},\n\t\tAllowCuddleWithRHS:               []string{\"Unlock\", \"RUnlock\"},\n\t\tAllowCuddleUsedInBlock:           false,\n\t\tForceCuddleErrCheckAndAssign:     false,\n\t\tErrorVariableNames:               []string{\"err\"},\n\t\tForceExclusiveShortDeclarations:  false,\n\t},\n\tWSLv5: WSLv5Settings{\n\t\tAllowFirstInBlock: true,\n\t\tAllowWholeBlock:   false,\n\t\tBranchMaxLines:    2,\n\t\tCaseMaxLines:      0,\n\t\tDefault:           \"default\",\n\t\tEnable:            nil,\n\t\tDisable:           nil,\n\t},\n}\n\ntype LintersSettings struct {\n\tFormatterSettings `mapstructure:\"-\"`\n\n\tAsasalint                AsasalintSettings                `mapstructure:\"asasalint\"`\n\tBiDiChk                  BiDiChkSettings                  `mapstructure:\"bidichk\"`\n\tCopyLoopVar              CopyLoopVarSettings              `mapstructure:\"copyloopvar\"`\n\tCyclop                   CyclopSettings                   `mapstructure:\"cyclop\"`\n\tDecorder                 DecorderSettings                 `mapstructure:\"decorder\"`\n\tDepguard                 DepGuardSettings                 `mapstructure:\"depguard\"`\n\tDogsled                  DogsledSettings                  `mapstructure:\"dogsled\"`\n\tDupl                     DuplSettings                     `mapstructure:\"dupl\"`\n\tDupWord                  DupWordSettings                  `mapstructure:\"dupword\"`\n\tEmbeddedStructFieldCheck EmbeddedStructFieldCheckSettings `mapstructure:\"embeddedstructfieldcheck\"`\n\tErrcheck                 ErrcheckSettings                 `mapstructure:\"errcheck\"`\n\tErrChkJSON               ErrChkJSONSettings               `mapstructure:\"errchkjson\"`\n\tErrorLint                ErrorLintSettings                `mapstructure:\"errorlint\"`\n\tExhaustive               ExhaustiveSettings               `mapstructure:\"exhaustive\"`\n\tExhaustruct              ExhaustructSettings              `mapstructure:\"exhaustruct\"`\n\tFatcontext               FatcontextSettings               `mapstructure:\"fatcontext\"`\n\tForbidigo                ForbidigoSettings                `mapstructure:\"forbidigo\"`\n\tFuncOrder                FuncOrderSettings                `mapstructure:\"funcorder\"`\n\tFunlen                   FunlenSettings                   `mapstructure:\"funlen\"`\n\tGinkgoLinter             GinkgoLinterSettings             `mapstructure:\"ginkgolinter\"`\n\tGocognit                 GocognitSettings                 `mapstructure:\"gocognit\"`\n\tGoChecksumType           GoChecksumTypeSettings           `mapstructure:\"gochecksumtype\"`\n\tGoconst                  GoConstSettings                  `mapstructure:\"goconst\"`\n\tGocritic                 GoCriticSettings                 `mapstructure:\"gocritic\"`\n\tGocyclo                  GoCycloSettings                  `mapstructure:\"gocyclo\"`\n\tGodoclint                GodoclintSettings                `mapstructure:\"godoclint\"`\n\tGodot                    GodotSettings                    `mapstructure:\"godot\"`\n\tGodox                    GodoxSettings                    `mapstructure:\"godox\"`\n\tGoheader                 GoHeaderSettings                 `mapstructure:\"goheader\"`\n\tGoModDirectives          GoModDirectivesSettings          `mapstructure:\"gomoddirectives\"`\n\tGomodguard               GoModGuardSettings               `mapstructure:\"gomodguard\"`\n\tGosec                    GoSecSettings                    `mapstructure:\"gosec\"`\n\tGosmopolitan             GosmopolitanSettings             `mapstructure:\"gosmopolitan\"`\n\tUnqueryvet               UnqueryvetSettings               `mapstructure:\"unqueryvet\"`\n\tGovet                    GovetSettings                    `mapstructure:\"govet\"`\n\tGrouper                  GrouperSettings                  `mapstructure:\"grouper\"`\n\tIface                    IfaceSettings                    `mapstructure:\"iface\"`\n\tImportAs                 ImportAsSettings                 `mapstructure:\"importas\"`\n\tInamedparam              INamedParamSettings              `mapstructure:\"inamedparam\"`\n\tIneffassign              IneffassignSettings              `mapstructure:\"ineffassign\"`\n\tInterfaceBloat           InterfaceBloatSettings           `mapstructure:\"interfacebloat\"`\n\tIotaMixing               IotaMixingSettings               `mapstructure:\"iotamixing\"`\n\tIreturn                  IreturnSettings                  `mapstructure:\"ireturn\"`\n\tLll                      LllSettings                      `mapstructure:\"lll\"`\n\tLoggerCheck              LoggerCheckSettings              `mapstructure:\"loggercheck\"`\n\tMaintIdx                 MaintIdxSettings                 `mapstructure:\"maintidx\"`\n\tMakezero                 MakezeroSettings                 `mapstructure:\"makezero\"`\n\tMisspell                 MisspellSettings                 `mapstructure:\"misspell\"`\n\tMnd                      MndSettings                      `mapstructure:\"mnd\"`\n\tModernize                ModernizeSettings                `mapstructure:\"modernize\"`\n\tMustTag                  MustTagSettings                  `mapstructure:\"musttag\"`\n\tNakedret                 NakedretSettings                 `mapstructure:\"nakedret\"`\n\tNestif                   NestifSettings                   `mapstructure:\"nestif\"`\n\tNilNil                   NilNilSettings                   `mapstructure:\"nilnil\"`\n\tNlreturn                 NlreturnSettings                 `mapstructure:\"nlreturn\"`\n\tNoLintLint               NoLintLintSettings               `mapstructure:\"nolintlint\"`\n\tNoNamedReturns           NoNamedReturnsSettings           `mapstructure:\"nonamedreturns\"`\n\tParallelTest             ParallelTestSettings             `mapstructure:\"paralleltest\"`\n\tPerfSprint               PerfSprintSettings               `mapstructure:\"perfsprint\"`\n\tPrealloc                 PreallocSettings                 `mapstructure:\"prealloc\"`\n\tPredeclared              PredeclaredSettings              `mapstructure:\"predeclared\"`\n\tPromlinter               PromlinterSettings               `mapstructure:\"promlinter\"`\n\tProtoGetter              ProtoGetterSettings              `mapstructure:\"protogetter\"`\n\tReassign                 ReassignSettings                 `mapstructure:\"reassign\"`\n\tRecvcheck                RecvcheckSettings                `mapstructure:\"recvcheck\"`\n\tRevive                   ReviveSettings                   `mapstructure:\"revive\"`\n\tRowsErrCheck             RowsErrCheckSettings             `mapstructure:\"rowserrcheck\"`\n\tSlogLint                 SlogLintSettings                 `mapstructure:\"sloglint\"`\n\tSpancheck                SpancheckSettings                `mapstructure:\"spancheck\"`\n\tStaticcheck              StaticCheckSettings              `mapstructure:\"staticcheck\"`\n\tTagAlign                 TagAlignSettings                 `mapstructure:\"tagalign\"`\n\tTagliatelle              TagliatelleSettings              `mapstructure:\"tagliatelle\"`\n\tTestifylint              TestifylintSettings              `mapstructure:\"testifylint\"`\n\tTestpackage              TestpackageSettings              `mapstructure:\"testpackage\"`\n\tThelper                  ThelperSettings                  `mapstructure:\"thelper\"`\n\tUnconvert                UnconvertSettings                `mapstructure:\"unconvert\"`\n\tUnparam                  UnparamSettings                  `mapstructure:\"unparam\"`\n\tUnused                   UnusedSettings                   `mapstructure:\"unused\"`\n\tUseStdlibVars            UseStdlibVarsSettings            `mapstructure:\"usestdlibvars\"`\n\tUseTesting               UseTestingSettings               `mapstructure:\"usetesting\"`\n\tVarnamelen               VarnamelenSettings               `mapstructure:\"varnamelen\"`\n\tWhitespace               WhitespaceSettings               `mapstructure:\"whitespace\"`\n\tWrapcheck                WrapcheckSettings                `mapstructure:\"wrapcheck\"`\n\tWSL                      WSLv4Settings                    `mapstructure:\"wsl\"` // Deprecated: use WSLv5 instead.\n\tWSLv5                    WSLv5Settings                    `mapstructure:\"wsl_v5\"`\n\n\tCustom map[string]CustomLinterSettings `mapstructure:\"custom\"`\n}\n\nfunc (s *LintersSettings) Validate() error {\n\tif err := s.Govet.Validate(); err != nil {\n\t\treturn err\n\t}\n\n\tfor name, settings := range s.Custom {\n\t\tif err := settings.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"custom linter %q: %w\", name, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype AsasalintSettings struct {\n\tExclude              []string `mapstructure:\"exclude\"`\n\tUseBuiltinExclusions bool     `mapstructure:\"use-builtin-exclusions\"`\n}\n\ntype BiDiChkSettings struct {\n\tLeftToRightEmbedding     bool `mapstructure:\"left-to-right-embedding\"`\n\tRightToLeftEmbedding     bool `mapstructure:\"right-to-left-embedding\"`\n\tPopDirectionalFormatting bool `mapstructure:\"pop-directional-formatting\"`\n\tLeftToRightOverride      bool `mapstructure:\"left-to-right-override\"`\n\tRightToLeftOverride      bool `mapstructure:\"right-to-left-override\"`\n\tLeftToRightIsolate       bool `mapstructure:\"left-to-right-isolate\"`\n\tRightToLeftIsolate       bool `mapstructure:\"right-to-left-isolate\"`\n\tFirstStrongIsolate       bool `mapstructure:\"first-strong-isolate\"`\n\tPopDirectionalIsolate    bool `mapstructure:\"pop-directional-isolate\"`\n}\n\ntype CopyLoopVarSettings struct {\n\tCheckAlias bool `mapstructure:\"check-alias\"`\n}\n\ntype CyclopSettings struct {\n\tMaxComplexity  int     `mapstructure:\"max-complexity\"`\n\tPackageAverage float64 `mapstructure:\"package-average\"`\n}\n\ntype DepGuardSettings struct {\n\tRules map[string]*DepGuardList `mapstructure:\"rules\"`\n}\n\ntype DepGuardList struct {\n\tListMode string         `mapstructure:\"list-mode\"`\n\tFiles    []string       `mapstructure:\"files\"`\n\tAllow    []string       `mapstructure:\"allow\"`\n\tDeny     []DepGuardDeny `mapstructure:\"deny\"`\n}\n\ntype DepGuardDeny struct {\n\tPkg  string `mapstructure:\"pkg\"`\n\tDesc string `mapstructure:\"desc\"`\n}\n\ntype DecorderSettings struct {\n\tDecOrder                  []string `mapstructure:\"dec-order\"`\n\tIgnoreUnderscoreVars      bool     `mapstructure:\"ignore-underscore-vars\"`\n\tDisableDecNumCheck        bool     `mapstructure:\"disable-dec-num-check\"`\n\tDisableTypeDecNumCheck    bool     `mapstructure:\"disable-type-dec-num-check\"`\n\tDisableConstDecNumCheck   bool     `mapstructure:\"disable-const-dec-num-check\"`\n\tDisableVarDecNumCheck     bool     `mapstructure:\"disable-var-dec-num-check\"`\n\tDisableDecOrderCheck      bool     `mapstructure:\"disable-dec-order-check\"`\n\tDisableInitFuncFirstCheck bool     `mapstructure:\"disable-init-func-first-check\"`\n}\n\ntype DogsledSettings struct {\n\tMaxBlankIdentifiers int `mapstructure:\"max-blank-identifiers\"`\n}\n\ntype DuplSettings struct {\n\tThreshold int `mapstructure:\"threshold\"`\n}\n\ntype DupWordSettings struct {\n\tKeywords     []string `mapstructure:\"keywords\"`\n\tIgnore       []string `mapstructure:\"ignore\"`\n\tCommentsOnly bool     `mapstructure:\"comments-only\"`\n}\n\ntype EmbeddedStructFieldCheckSettings struct {\n\tForbidMutex bool `mapstructure:\"forbid-mutex\"`\n\tEmptyLine   bool `mapstructure:\"empty-line\"`\n}\n\ntype ErrcheckSettings struct {\n\tDisableDefaultExclusions bool     `mapstructure:\"disable-default-exclusions\"`\n\tCheckTypeAssertions      bool     `mapstructure:\"check-type-assertions\"`\n\tCheckAssignToBlank       bool     `mapstructure:\"check-blank\"`\n\tExcludeFunctions         []string `mapstructure:\"exclude-functions\"`\n\tVerbose                  bool     `mapstructure:\"verbose\"`\n}\n\ntype ErrChkJSONSettings struct {\n\tCheckErrorFreeEncoding bool `mapstructure:\"check-error-free-encoding\"`\n\tReportNoExported       bool `mapstructure:\"report-no-exported\"`\n}\n\ntype ErrorLintSettings struct {\n\tErrorf                bool                 `mapstructure:\"errorf\"`\n\tErrorfMulti           bool                 `mapstructure:\"errorf-multi\"`\n\tAsserts               bool                 `mapstructure:\"asserts\"`\n\tComparison            bool                 `mapstructure:\"comparison\"`\n\tAllowedErrors         []ErrorLintAllowPair `mapstructure:\"allowed-errors\"`\n\tAllowedErrorsWildcard []ErrorLintAllowPair `mapstructure:\"allowed-errors-wildcard\"`\n}\n\ntype ErrorLintAllowPair struct {\n\tErr string `mapstructure:\"err\"`\n\tFun string `mapstructure:\"fun\"`\n}\n\ntype ExhaustiveSettings struct {\n\tCheck                      []string `mapstructure:\"check\"`\n\tDefaultSignifiesExhaustive bool     `mapstructure:\"default-signifies-exhaustive\"`\n\tIgnoreEnumMembers          string   `mapstructure:\"ignore-enum-members\"`\n\tIgnoreEnumTypes            string   `mapstructure:\"ignore-enum-types\"`\n\tPackageScopeOnly           bool     `mapstructure:\"package-scope-only\"`\n\tExplicitExhaustiveMap      bool     `mapstructure:\"explicit-exhaustive-map\"`\n\tExplicitExhaustiveSwitch   bool     `mapstructure:\"explicit-exhaustive-switch\"`\n\tDefaultCaseRequired        bool     `mapstructure:\"default-case-required\"`\n}\n\ntype ExhaustructSettings struct {\n\tInclude                []string `mapstructure:\"include\"`\n\tExclude                []string `mapstructure:\"exclude\"`\n\tAllowEmpty             bool     `mapstructure:\"allow-empty\"`\n\tAllowEmptyRx           []string `mapstructure:\"allow-empty-rx\"`\n\tAllowEmptyReturns      bool     `mapstructure:\"allow-empty-returns\"`\n\tAllowEmptyDeclarations bool     `mapstructure:\"allow-empty-declarations\"`\n}\n\ntype FatcontextSettings struct {\n\tCheckStructPointers bool `mapstructure:\"check-struct-pointers\"`\n}\n\ntype ForbidigoSettings struct {\n\tForbid               []ForbidigoPattern `mapstructure:\"forbid\"`\n\tExcludeGodocExamples bool               `mapstructure:\"exclude-godoc-examples\"`\n\tAnalyzeTypes         bool               `mapstructure:\"analyze-types\"`\n}\n\ntype ForbidigoPattern struct {\n\tPattern string `yaml:\"p\" mapstructure:\"pattern\"`\n\tPackage string `yaml:\"pkg,omitempty\" mapstructure:\"pkg,omitempty\"`\n\tMsg     string `yaml:\"msg,omitempty\" mapstructure:\"msg,omitempty\"`\n}\n\ntype FuncOrderSettings struct {\n\tConstructor  bool `mapstructure:\"constructor,omitempty\"`\n\tStructMethod bool `mapstructure:\"struct-method,omitempty\"`\n\tAlphabetical bool `mapstructure:\"alphabetical,omitempty\"`\n}\n\ntype FunlenSettings struct {\n\tLines          int  `mapstructure:\"lines\"`\n\tStatements     int  `mapstructure:\"statements\"`\n\tIgnoreComments bool `mapstructure:\"ignore-comments\"`\n}\n\ntype GinkgoLinterSettings struct {\n\tSuppressLenAssertion       bool `mapstructure:\"suppress-len-assertion\"`\n\tSuppressNilAssertion       bool `mapstructure:\"suppress-nil-assertion\"`\n\tSuppressErrAssertion       bool `mapstructure:\"suppress-err-assertion\"`\n\tSuppressCompareAssertion   bool `mapstructure:\"suppress-compare-assertion\"`\n\tSuppressAsyncAssertion     bool `mapstructure:\"suppress-async-assertion\"`\n\tSuppressTypeCompareWarning bool `mapstructure:\"suppress-type-compare-assertion\"`\n\tForbidFocusContainer       bool `mapstructure:\"forbid-focus-container\"`\n\tAllowHaveLenZero           bool `mapstructure:\"allow-havelen-zero\"`\n\tForceExpectTo              bool `mapstructure:\"force-expect-to\"`\n\tValidateAsyncIntervals     bool `mapstructure:\"validate-async-intervals\"`\n\tForbidSpecPollution        bool `mapstructure:\"forbid-spec-pollution\"`\n\tForceSucceedForFuncs       bool `mapstructure:\"force-succeed\"`\n\tForceAssertionDescription  bool `mapstructure:\"force-assertion-description\"`\n\tForeToNot                  bool `mapstructure:\"force-tonot\"`\n}\n\ntype GoChecksumTypeSettings struct {\n\tDefaultSignifiesExhaustive bool `mapstructure:\"default-signifies-exhaustive\"`\n\tIncludeSharedInterfaces    bool `mapstructure:\"include-shared-interfaces\"`\n}\n\ntype GocognitSettings struct {\n\tMinComplexity int `mapstructure:\"min-complexity\"`\n}\n\ntype GoConstSettings struct {\n\tIgnoreStringValues   []string `mapstructure:\"ignore-string-values\"`\n\tMatchWithConstants   bool     `mapstructure:\"match-constant\"`\n\tMinStringLen         int      `mapstructure:\"min-len\"`\n\tMinOccurrencesCount  int      `mapstructure:\"min-occurrences\"`\n\tParseNumbers         bool     `mapstructure:\"numbers\"`\n\tNumberMin            int      `mapstructure:\"min\"`\n\tNumberMax            int      `mapstructure:\"max\"`\n\tIgnoreCalls          bool     `mapstructure:\"ignore-calls\"`\n\tFindDuplicates       bool     `mapstructure:\"find-duplicates\"`\n\tEvalConstExpressions bool     `mapstructure:\"eval-const-expressions\"`\n\n\t// Deprecated: use IgnoreStringValues instead.\n\tIgnoreStrings string `mapstructure:\"ignore-strings\"`\n}\n\ntype GoCriticSettings struct {\n\tGo               string                           `mapstructure:\"-\"`\n\tDisableAll       bool                             `mapstructure:\"disable-all\"`\n\tEnabledChecks    []string                         `mapstructure:\"enabled-checks\"`\n\tEnableAll        bool                             `mapstructure:\"enable-all\"`\n\tDisabledChecks   []string                         `mapstructure:\"disabled-checks\"`\n\tEnabledTags      []string                         `mapstructure:\"enabled-tags\"`\n\tDisabledTags     []string                         `mapstructure:\"disabled-tags\"`\n\tSettingsPerCheck map[string]GoCriticCheckSettings `mapstructure:\"settings\"`\n}\n\ntype GoCriticCheckSettings map[string]any\n\ntype GoCycloSettings struct {\n\tMinComplexity int `mapstructure:\"min-complexity\"`\n}\n\ntype GodoclintSettings struct {\n\tDefault *string  `mapstructure:\"default\"`\n\tEnable  []string `mapstructure:\"enable\"`\n\tDisable []string `mapstructure:\"disable\"`\n\tOptions struct {\n\t\tMaxLen struct {\n\t\t\tLength *uint `mapstructure:\"length\"`\n\t\t} `mapstructure:\"max-len\"`\n\t\tRequireDoc struct {\n\t\t\tIgnoreExported   *bool `mapstructure:\"ignore-exported\"`\n\t\t\tIgnoreUnexported *bool `mapstructure:\"ignore-unexported\"`\n\t\t} `mapstructure:\"require-doc\"`\n\t\tStartWithName struct {\n\t\t\tIncludeUnexported *bool `mapstructure:\"include-unexported\"`\n\t\t} `mapstructure:\"start-with-name\"`\n\t} `mapstructure:\"options\"`\n}\n\ntype GodotSettings struct {\n\tScope   string   `mapstructure:\"scope\"`\n\tExclude []string `mapstructure:\"exclude\"`\n\tCapital bool     `mapstructure:\"capital\"`\n\tPeriod  bool     `mapstructure:\"period\"`\n}\n\ntype GodoxSettings struct {\n\tKeywords []string `mapstructure:\"keywords\"`\n}\n\ntype GoHeaderSettings struct {\n\tValues       map[string]map[string]string `mapstructure:\"values\"`\n\tTemplate     string                       `mapstructure:\"template\"`\n\tTemplatePath string                       `mapstructure:\"template-path\"`\n}\n\ntype GoModDirectivesSettings struct {\n\tReplaceAllowList          []string `mapstructure:\"replace-allow-list\"`\n\tReplaceLocal              bool     `mapstructure:\"replace-local\"`\n\tExcludeForbidden          bool     `mapstructure:\"exclude-forbidden\"`\n\tRetractAllowNoExplanation bool     `mapstructure:\"retract-allow-no-explanation\"`\n\tToolchainForbidden        bool     `mapstructure:\"toolchain-forbidden\"`\n\tToolchainPattern          string   `mapstructure:\"toolchain-pattern\"`\n\tToolForbidden             bool     `mapstructure:\"tool-forbidden\"`\n\tGoDebugForbidden          bool     `mapstructure:\"go-debug-forbidden\"`\n\tGoVersionPattern          string   `mapstructure:\"go-version-pattern\"`\n\tCheckModulePath           bool     `mapstructure:\"check-module-path\"`\n}\n\ntype GoModGuardSettings struct {\n\tAllowed GoModGuardAllowed `mapstructure:\"allowed\"`\n\tBlocked GoModGuardBlocked `mapstructure:\"blocked\"`\n}\n\ntype GoModGuardAllowed struct {\n\tModules []string `mapstructure:\"modules\"`\n\tDomains []string `mapstructure:\"domains\"`\n}\n\ntype GoModGuardBlocked struct {\n\tModules                []map[string]GoModGuardModule  `mapstructure:\"modules\"`\n\tVersions               []map[string]GoModGuardVersion `mapstructure:\"versions\"`\n\tLocalReplaceDirectives bool                           `mapstructure:\"local-replace-directives\"`\n}\n\ntype GoModGuardModule struct {\n\tRecommendations []string `mapstructure:\"recommendations\"`\n\tReason          string   `mapstructure:\"reason\"`\n}\n\ntype GoModGuardVersion struct {\n\tVersion string `mapstructure:\"version\"`\n\tReason  string `mapstructure:\"reason\"`\n}\n\ntype GoSecSettings struct {\n\tIncludes    []string       `mapstructure:\"includes\"`\n\tExcludes    []string       `mapstructure:\"excludes\"`\n\tSeverity    string         `mapstructure:\"severity\"`\n\tConfidence  string         `mapstructure:\"confidence\"`\n\tConfig      map[string]any `mapstructure:\"config\"`\n\tConcurrency int            `mapstructure:\"concurrency\"`\n}\n\ntype GosmopolitanSettings struct {\n\tAllowTimeLocal  bool     `mapstructure:\"allow-time-local\"`\n\tEscapeHatches   []string `mapstructure:\"escape-hatches\"`\n\tWatchForScripts []string `mapstructure:\"watch-for-scripts\"`\n}\n\ntype GovetSettings struct {\n\tGo string `mapstructure:\"-\"`\n\n\tEnable     []string `mapstructure:\"enable\"`\n\tDisable    []string `mapstructure:\"disable\"`\n\tEnableAll  bool     `mapstructure:\"enable-all\"`\n\tDisableAll bool     `mapstructure:\"disable-all\"`\n\n\tSettings map[string]map[string]any `mapstructure:\"settings\"`\n}\n\nfunc (cfg *GovetSettings) Validate() error {\n\tif cfg.EnableAll && cfg.DisableAll {\n\t\treturn errors.New(\"govet: enable-all and disable-all can't be combined\")\n\t}\n\tif cfg.EnableAll && len(cfg.Enable) != 0 {\n\t\treturn errors.New(\"govet: enable-all and enable can't be combined\")\n\t}\n\tif cfg.DisableAll && len(cfg.Disable) != 0 {\n\t\treturn errors.New(\"govet: disable-all and disable can't be combined\")\n\t}\n\treturn nil\n}\n\ntype GrouperSettings struct {\n\tConstRequireSingleConst   bool `mapstructure:\"const-require-single-const\"`\n\tConstRequireGrouping      bool `mapstructure:\"const-require-grouping\"`\n\tImportRequireSingleImport bool `mapstructure:\"import-require-single-import\"`\n\tImportRequireGrouping     bool `mapstructure:\"import-require-grouping\"`\n\tTypeRequireSingleType     bool `mapstructure:\"type-require-single-type\"`\n\tTypeRequireGrouping       bool `mapstructure:\"type-require-grouping\"`\n\tVarRequireSingleVar       bool `mapstructure:\"var-require-single-var\"`\n\tVarRequireGrouping        bool `mapstructure:\"var-require-grouping\"`\n}\n\ntype IfaceSettings struct {\n\tEnable   []string                  `mapstructure:\"enable\"`\n\tSettings map[string]map[string]any `mapstructure:\"settings\"`\n}\n\ntype ImportAsSettings struct {\n\tAlias          []ImportAsAlias `mapstructure:\"alias\"`\n\tNoUnaliased    bool            `mapstructure:\"no-unaliased\"`\n\tNoExtraAliases bool            `mapstructure:\"no-extra-aliases\"`\n}\n\ntype ImportAsAlias struct {\n\tPkg   string `mapstructure:\"pkg\"`\n\tAlias string `mapstructure:\"alias\"`\n}\n\ntype INamedParamSettings struct {\n\tSkipSingleParam bool `mapstructure:\"skip-single-param\"`\n}\n\ntype IneffassignSettings struct {\n\tCheckEscapingErrors bool `mapstructure:\"check-escaping-errors\"`\n}\n\ntype InterfaceBloatSettings struct {\n\tMax int `mapstructure:\"max\"`\n}\n\ntype IotaMixingSettings struct {\n\tReportIndividual bool `mapstructure:\"report-individual\"`\n}\n\ntype IreturnSettings struct {\n\tAllow  []string `mapstructure:\"allow\"`\n\tReject []string `mapstructure:\"reject\"`\n}\n\ntype LllSettings struct {\n\tLineLength int `mapstructure:\"line-length\"`\n\tTabWidth   int `mapstructure:\"tab-width\"`\n}\n\ntype LoggerCheckSettings struct {\n\tKitlog           bool     `mapstructure:\"kitlog\"`\n\tKlog             bool     `mapstructure:\"klog\"`\n\tLogr             bool     `mapstructure:\"logr\"`\n\tSlog             bool     `mapstructure:\"slog\"`\n\tZap              bool     `mapstructure:\"zap\"`\n\tRequireStringKey bool     `mapstructure:\"require-string-key\"`\n\tNoPrintfLike     bool     `mapstructure:\"no-printf-like\"`\n\tRules            []string `mapstructure:\"rules\"`\n}\n\ntype MaintIdxSettings struct {\n\tUnder int `mapstructure:\"under\"`\n}\n\ntype MakezeroSettings struct {\n\tAlways bool `mapstructure:\"always\"`\n}\n\ntype MisspellSettings struct {\n\tMode        string               `mapstructure:\"mode\"`\n\tLocale      string               `mapstructure:\"locale\"`\n\tExtraWords  []MisspellExtraWords `mapstructure:\"extra-words\"`\n\tIgnoreRules []string             `mapstructure:\"ignore-rules\"`\n}\n\ntype MisspellExtraWords struct {\n\tTypo       string `mapstructure:\"typo\"`\n\tCorrection string `mapstructure:\"correction\"`\n}\n\ntype MustTagSettings struct {\n\tFunctions []MustTagFunction `mapstructure:\"functions\"`\n}\n\ntype MustTagFunction struct {\n\tName   string `mapstructure:\"name\"`\n\tTag    string `mapstructure:\"tag\"`\n\tArgPos int    `mapstructure:\"arg-pos\"`\n}\n\ntype NakedretSettings struct {\n\tMaxFuncLines uint `mapstructure:\"max-func-lines\"`\n}\n\ntype NestifSettings struct {\n\tMinComplexity int `mapstructure:\"min-complexity\"`\n}\n\ntype NilNilSettings struct {\n\tOnlyTwo        *bool    `mapstructure:\"only-two\"`\n\tDetectOpposite bool     `mapstructure:\"detect-opposite\"`\n\tCheckedTypes   []string `mapstructure:\"checked-types\"`\n}\n\ntype NlreturnSettings struct {\n\tBlockSize int `mapstructure:\"block-size\"`\n}\n\ntype MndSettings struct {\n\tChecks           []string `mapstructure:\"checks\"`\n\tIgnoredNumbers   []string `mapstructure:\"ignored-numbers\"`\n\tIgnoredFiles     []string `mapstructure:\"ignored-files\"`\n\tIgnoredFunctions []string `mapstructure:\"ignored-functions\"`\n}\n\ntype ModernizeSettings struct {\n\tDisable []string `mapstructure:\"disable\"`\n}\n\ntype NoLintLintSettings struct {\n\tRequireExplanation bool     `mapstructure:\"require-explanation\"`\n\tRequireSpecific    bool     `mapstructure:\"require-specific\"`\n\tAllowNoExplanation []string `mapstructure:\"allow-no-explanation\"`\n\tAllowUnused        bool     `mapstructure:\"allow-unused\"`\n}\n\ntype NoNamedReturnsSettings struct {\n\tReportErrorInDefer bool `mapstructure:\"report-error-in-defer\"`\n}\n\ntype ParallelTestSettings struct {\n\tGo                    string `mapstructure:\"-\"`\n\tIgnoreMissing         bool   `mapstructure:\"ignore-missing\"`\n\tIgnoreMissingSubtests bool   `mapstructure:\"ignore-missing-subtests\"`\n}\n\ntype PerfSprintSettings struct {\n\tIntegerFormat bool `mapstructure:\"integer-format\"`\n\tIntConversion bool `mapstructure:\"int-conversion\"`\n\n\tErrorFormat bool `mapstructure:\"error-format\"`\n\tErrError    bool `mapstructure:\"err-error\"`\n\tErrorF      bool `mapstructure:\"errorf\"`\n\n\tStringFormat bool `mapstructure:\"string-format\"`\n\tSprintF1     bool `mapstructure:\"sprintf1\"`\n\tStrConcat    bool `mapstructure:\"strconcat\"`\n\n\tBoolFormat bool `mapstructure:\"bool-format\"`\n\tHexFormat  bool `mapstructure:\"hex-format\"`\n\n\tConcatLoop   bool `mapstructure:\"concat-loop\"`\n\tLoopOtherOps bool `mapstructure:\"loop-other-ops\"`\n}\n\ntype PreallocSettings struct {\n\tSimple     bool `mapstructure:\"simple\"`\n\tRangeLoops bool `mapstructure:\"range-loops\"`\n\tForLoops   bool `mapstructure:\"for-loops\"`\n}\n\ntype PredeclaredSettings struct {\n\tIgnore    []string `mapstructure:\"ignore\"`\n\tQualified bool     `mapstructure:\"qualified-name\"`\n}\n\ntype PromlinterSettings struct {\n\tStrict          bool     `mapstructure:\"strict\"`\n\tDisabledLinters []string `mapstructure:\"disabled-linters\"`\n}\n\ntype ProtoGetterSettings struct {\n\tSkipGeneratedBy         []string `mapstructure:\"skip-generated-by\"`\n\tSkipFiles               []string `mapstructure:\"skip-files\"`\n\tSkipAnyGenerated        bool     `mapstructure:\"skip-any-generated\"`\n\tReplaceFirstArgInAppend bool     `mapstructure:\"replace-first-arg-in-append\"`\n}\n\ntype ReassignSettings struct {\n\tPatterns []string `mapstructure:\"patterns\"`\n}\n\ntype RecvcheckSettings struct {\n\tDisableBuiltin bool     `mapstructure:\"disable-builtin\"`\n\tExclusions     []string `mapstructure:\"exclusions\"`\n}\n\ntype ReviveSettings struct {\n\tGo                 string            `mapstructure:\"-\"`\n\tMaxOpenFiles       int               `mapstructure:\"max-open-files\"`\n\tConfidence         float64           `mapstructure:\"confidence\"`\n\tSeverity           string            `mapstructure:\"severity\"`\n\tEnableAllRules     bool              `mapstructure:\"enable-all-rules\"`\n\tEnableDefaultRules bool              `mapstructure:\"enable-default-rules\"`\n\tRules              []ReviveRule      `mapstructure:\"rules\"`\n\tErrorCode          int               `mapstructure:\"error-code\"`\n\tWarningCode        int               `mapstructure:\"warning-code\"`\n\tDirectives         []ReviveDirective `mapstructure:\"directives\"`\n}\n\ntype ReviveRule struct {\n\tName      string   `mapstructure:\"name\"`\n\tArguments []any    `mapstructure:\"arguments\"`\n\tSeverity  string   `mapstructure:\"severity\"`\n\tDisabled  bool     `mapstructure:\"disabled\"`\n\tExclude   []string `mapstructure:\"exclude\"`\n}\n\ntype ReviveDirective struct {\n\tName     string `mapstructure:\"name\"`\n\tSeverity string `mapstructure:\"severity\"`\n}\n\ntype RowsErrCheckSettings struct {\n\tPackages []string `mapstructure:\"packages\"`\n}\n\ntype SlogLintSettings struct {\n\tNoMixedArgs    bool     `mapstructure:\"no-mixed-args\"`\n\tKVOnly         bool     `mapstructure:\"kv-only\"`\n\tAttrOnly       bool     `mapstructure:\"attr-only\"`\n\tNoGlobal       string   `mapstructure:\"no-global\"`\n\tContext        string   `mapstructure:\"context\"`\n\tStaticMsg      bool     `mapstructure:\"static-msg\"`\n\tMsgStyle       string   `mapstructure:\"msg-style\"`\n\tNoRawKeys      bool     `mapstructure:\"no-raw-keys\"`\n\tKeyNamingCase  string   `mapstructure:\"key-naming-case\"`\n\tForbiddenKeys  []string `mapstructure:\"forbidden-keys\"`\n\tArgsOnSepLines bool     `mapstructure:\"args-on-sep-lines\"`\n}\n\ntype SpancheckSettings struct {\n\tChecks                   []string `mapstructure:\"checks\"`\n\tIgnoreCheckSignatures    []string `mapstructure:\"ignore-check-signatures\"`\n\tExtraStartSpanSignatures []string `mapstructure:\"extra-start-span-signatures\"`\n}\n\ntype StaticCheckSettings struct {\n\tChecks                  []string `mapstructure:\"checks\"`\n\tInitialisms             []string `mapstructure:\"initialisms\"`                // only for stylecheck\n\tDotImportWhitelist      []string `mapstructure:\"dot-import-whitelist\"`       // only for stylecheck\n\tHTTPStatusCodeWhitelist []string `mapstructure:\"http-status-code-whitelist\"` // only for stylecheck\n}\n\nfunc (s *StaticCheckSettings) HasConfiguration() bool {\n\treturn s.Initialisms == nil || s.HTTPStatusCodeWhitelist == nil || s.DotImportWhitelist == nil || s.Checks == nil\n}\n\ntype TagAlignSettings struct {\n\tAlign  bool     `mapstructure:\"align\"`\n\tSort   bool     `mapstructure:\"sort\"`\n\tOrder  []string `mapstructure:\"order\"`\n\tStrict bool     `mapstructure:\"strict\"`\n}\n\ntype TagliatelleSettings struct {\n\tCase TagliatelleCase `mapstructure:\"case\"`\n}\n\ntype TagliatelleCase struct {\n\tTagliatelleBase `mapstructure:\",squash\"`\n\tOverrides       []TagliatelleOverrides `mapstructure:\"overrides\"`\n}\n\ntype TagliatelleOverrides struct {\n\tTagliatelleBase `mapstructure:\",squash\"`\n\tPackage         string `mapstructure:\"pkg\"`\n\tIgnore          bool   `mapstructure:\"ignore\"`\n}\n\ntype TagliatelleBase struct {\n\tRules         map[string]string                  `mapstructure:\"rules\"`\n\tExtendedRules map[string]TagliatelleExtendedRule `mapstructure:\"extended-rules\"`\n\tUseFieldName  bool                               `mapstructure:\"use-field-name\"`\n\tIgnoredFields []string                           `mapstructure:\"ignored-fields\"`\n}\n\ntype TagliatelleExtendedRule struct {\n\tCase                string          `mapstructure:\"case\"`\n\tExtraInitialisms    bool            `mapstructure:\"extra-initialisms\"`\n\tInitialismOverrides map[string]bool `mapstructure:\"initialism-overrides\"`\n}\n\ntype TestifylintSettings struct {\n\tEnableAll        bool     `mapstructure:\"enable-all\"`\n\tDisableAll       bool     `mapstructure:\"disable-all\"`\n\tEnabledCheckers  []string `mapstructure:\"enable\"`\n\tDisabledCheckers []string `mapstructure:\"disable\"`\n\n\tBoolCompare          TestifylintBoolCompare          `mapstructure:\"bool-compare\"`\n\tExpectedActual       TestifylintExpectedActual       `mapstructure:\"expected-actual\"`\n\tFormatter            TestifylintFormatter            `mapstructure:\"formatter\"`\n\tGoRequire            TestifylintGoRequire            `mapstructure:\"go-require\"`\n\tRequireError         TestifylintRequireError         `mapstructure:\"require-error\"`\n\tSuiteExtraAssertCall TestifylintSuiteExtraAssertCall `mapstructure:\"suite-extra-assert-call\"`\n}\n\ntype TestifylintBoolCompare struct {\n\tIgnoreCustomTypes bool `mapstructure:\"ignore-custom-types\"`\n}\n\ntype TestifylintExpectedActual struct {\n\tExpVarPattern string `mapstructure:\"pattern\"`\n}\n\ntype TestifylintFormatter struct {\n\tCheckFormatString *bool `mapstructure:\"check-format-string\"`\n\tRequireFFuncs     bool  `mapstructure:\"require-f-funcs\"`\n\tRequireStringMsg  bool  `mapstructure:\"require-string-msg\"`\n}\n\ntype TestifylintGoRequire struct {\n\tIgnoreHTTPHandlers bool `mapstructure:\"ignore-http-handlers\"`\n}\n\ntype TestifylintRequireError struct {\n\tFnPattern string `mapstructure:\"fn-pattern\"`\n}\n\ntype TestifylintSuiteExtraAssertCall struct {\n\tMode string `mapstructure:\"mode\"`\n}\n\ntype TestpackageSettings struct {\n\tSkipRegexp    string   `mapstructure:\"skip-regexp\"`\n\tAllowPackages []string `mapstructure:\"allow-packages\"`\n}\n\ntype ThelperSettings struct {\n\tTest      ThelperOptions `mapstructure:\"test\"`\n\tFuzz      ThelperOptions `mapstructure:\"fuzz\"`\n\tBenchmark ThelperOptions `mapstructure:\"benchmark\"`\n\tTB        ThelperOptions `mapstructure:\"tb\"`\n}\n\ntype ThelperOptions struct {\n\tFirst *bool `mapstructure:\"first\"`\n\tName  *bool `mapstructure:\"name\"`\n\tBegin *bool `mapstructure:\"begin\"`\n}\n\ntype UseStdlibVarsSettings struct {\n\tHTTPMethod         bool `mapstructure:\"http-method\"`\n\tHTTPStatusCode     bool `mapstructure:\"http-status-code\"`\n\tTimeWeekday        bool `mapstructure:\"time-weekday\"`\n\tTimeMonth          bool `mapstructure:\"time-month\"`\n\tTimeLayout         bool `mapstructure:\"time-layout\"`\n\tCryptoHash         bool `mapstructure:\"crypto-hash\"`\n\tDefaultRPCPath     bool `mapstructure:\"default-rpc-path\"`\n\tSQLIsolationLevel  bool `mapstructure:\"sql-isolation-level\"`\n\tTLSSignatureScheme bool `mapstructure:\"tls-signature-scheme\"`\n\tConstantKind       bool `mapstructure:\"constant-kind\"`\n\tTimeDateMonth      bool `mapstructure:\"time-date-month\"`\n}\n\ntype UseTestingSettings struct {\n\tContextBackground bool `mapstructure:\"context-background\"`\n\tContextTodo       bool `mapstructure:\"context-todo\"`\n\tOSChdir           bool `mapstructure:\"os-chdir\"`\n\tOSMkdirTemp       bool `mapstructure:\"os-mkdir-temp\"`\n\tOSSetenv          bool `mapstructure:\"os-setenv\"`\n\tOSTempDir         bool `mapstructure:\"os-temp-dir\"`\n\tOSCreateTemp      bool `mapstructure:\"os-create-temp\"`\n}\n\ntype UnconvertSettings struct {\n\tFastMath bool `mapstructure:\"fast-math\"`\n\tSafe     bool `mapstructure:\"safe\"`\n}\n\ntype UnparamSettings struct {\n\tCheckExported bool `mapstructure:\"check-exported\"`\n}\n\ntype UnqueryvetSettings struct {\n\tCheckSQLBuilders     bool                          `mapstructure:\"check-sql-builders\"`\n\tAllowedPatterns      []string                      `mapstructure:\"allowed-patterns\"`\n\tIgnoredFunctions     []string                      `mapstructure:\"ignored-functions\"`\n\tCheckAliasedWildcard bool                          `mapstructure:\"check-aliased-wildcard\"`\n\tCheckStringConcat    bool                          `mapstructure:\"check-string-concat\"`\n\tCheckFormatStrings   bool                          `mapstructure:\"check-format-strings\"`\n\tCheckStringBuilder   bool                          `mapstructure:\"check-string-builder\"`\n\tCheckSubqueries      bool                          `mapstructure:\"check-subqueries\"`\n\tCheckN1              bool                          `mapstructure:\"check-n1\"`\n\tCheckSQLInjection    bool                          `mapstructure:\"check-sql-injection\"`\n\tCheckTxLeak          bool                          `mapstructure:\"check-tx-leaks\"`\n\tSQLBuilders          UnqueryvetSQLBuildersSettings `mapstructure:\"sql-builders\"`\n\tAllow                []string                      `mapstructure:\"allow\"`\n\tCustomRules          []UnqueryvetCustomRule        `mapstructure:\"custom-rules\"`\n}\n\ntype UnqueryvetSQLBuildersSettings struct {\n\tSquirrel  bool `mapstructure:\"squirrel\"`\n\tGORM      bool `mapstructure:\"gorm\"`\n\tSQLx      bool `mapstructure:\"sqlx\"`\n\tEnt       bool `mapstructure:\"ent\"`\n\tPGX       bool `mapstructure:\"pgx\"`\n\tBun       bool `mapstructure:\"bun\"`\n\tSQLBoiler bool `mapstructure:\"sqlboiler\"`\n\tJet       bool `mapstructure:\"jet\"`\n}\n\ntype UnqueryvetCustomRule struct {\n\tID       string   `mapstructure:\"id\"`\n\tPattern  string   `mapstructure:\"pattern\"`\n\tPatterns []string `mapstructure:\"patterns\"`\n\tWhen     string   `mapstructure:\"when\"`\n\tMessage  string   `mapstructure:\"message\"`\n\tAction   string   `mapstructure:\"action\"`\n}\n\ntype UnusedSettings struct {\n\tFieldWritesAreUses     bool `mapstructure:\"field-writes-are-uses\"`\n\tPostStatementsAreReads bool `mapstructure:\"post-statements-are-reads\"`\n\tExportedFieldsAreUsed  bool `mapstructure:\"exported-fields-are-used\"`\n\tParametersAreUsed      bool `mapstructure:\"parameters-are-used\"`\n\tLocalVariablesAreUsed  bool `mapstructure:\"local-variables-are-used\"`\n\tGeneratedIsUsed        bool `mapstructure:\"generated-is-used\"`\n}\n\ntype VarnamelenSettings struct {\n\tMaxDistance        int      `mapstructure:\"max-distance\"`\n\tMinNameLength      int      `mapstructure:\"min-name-length\"`\n\tCheckReceiver      bool     `mapstructure:\"check-receiver\"`\n\tCheckReturn        bool     `mapstructure:\"check-return\"`\n\tCheckTypeParam     bool     `mapstructure:\"check-type-param\"`\n\tIgnoreNames        []string `mapstructure:\"ignore-names\"`\n\tIgnoreTypeAssertOk bool     `mapstructure:\"ignore-type-assert-ok\"`\n\tIgnoreMapIndexOk   bool     `mapstructure:\"ignore-map-index-ok\"`\n\tIgnoreChanRecvOk   bool     `mapstructure:\"ignore-chan-recv-ok\"`\n\tIgnoreDecls        []string `mapstructure:\"ignore-decls\"`\n}\n\ntype WhitespaceSettings struct {\n\tMultiIf   bool `mapstructure:\"multi-if\"`\n\tMultiFunc bool `mapstructure:\"multi-func\"`\n}\n\ntype WrapcheckSettings struct {\n\tExtraIgnoreSigs        []string `mapstructure:\"extra-ignore-sigs\"`\n\tIgnoreSigs             []string `mapstructure:\"ignore-sigs\"`\n\tIgnoreSigRegexps       []string `mapstructure:\"ignore-sig-regexps\"`\n\tIgnorePackageGlobs     []string `mapstructure:\"ignore-package-globs\"`\n\tIgnoreInterfaceRegexps []string `mapstructure:\"ignore-interface-regexps\"`\n\tReportInternalErrors   bool     `mapstructure:\"report-internal-errors\"`\n}\n\n// Deprecated: use WSLv5Settings instead.\ntype WSLv4Settings struct {\n\tStrictAppend                     bool     `mapstructure:\"strict-append\"`\n\tAllowAssignAndCallCuddle         bool     `mapstructure:\"allow-assign-and-call\"`\n\tAllowAssignAndAnythingCuddle     bool     `mapstructure:\"allow-assign-and-anything\"`\n\tAllowMultiLineAssignCuddle       bool     `mapstructure:\"allow-multiline-assign\"`\n\tForceCaseTrailingWhitespaceLimit int      `mapstructure:\"force-case-trailing-whitespace\"`\n\tAllowTrailingComment             bool     `mapstructure:\"allow-trailing-comment\"`\n\tAllowSeparatedLeadingComment     bool     `mapstructure:\"allow-separated-leading-comment\"`\n\tAllowCuddleDeclaration           bool     `mapstructure:\"allow-cuddle-declarations\"`\n\tAllowCuddleWithCalls             []string `mapstructure:\"allow-cuddle-with-calls\"`\n\tAllowCuddleWithRHS               []string `mapstructure:\"allow-cuddle-with-rhs\"`\n\tAllowCuddleUsedInBlock           bool     `mapstructure:\"allow-cuddle-used-in-block\"`\n\tForceCuddleErrCheckAndAssign     bool     `mapstructure:\"force-err-cuddling\"`\n\tErrorVariableNames               []string `mapstructure:\"error-variable-names\"`\n\tForceExclusiveShortDeclarations  bool     `mapstructure:\"force-short-decl-cuddling\"`\n}\n\ntype WSLv5Settings struct {\n\tAllowFirstInBlock bool     `mapstructure:\"allow-first-in-block\"`\n\tAllowWholeBlock   bool     `mapstructure:\"allow-whole-block\"`\n\tBranchMaxLines    int      `mapstructure:\"branch-max-lines\"`\n\tCaseMaxLines      int      `mapstructure:\"case-max-lines\"`\n\tDefault           string   `mapstructure:\"default\"`\n\tEnable            []string `mapstructure:\"enable\"`\n\tDisable           []string `mapstructure:\"disable\"`\n}\n\n// CustomLinterSettings encapsulates the meta-data of a private linter.\ntype CustomLinterSettings struct {\n\t// Type plugin type.\n\t// It can be `goplugin` or `module`.\n\tType string `mapstructure:\"type\"`\n\n\t// Path to a plugin *.so file that implements the private linter.\n\t// Only for Go plugin system.\n\tPath string `mapstructure:\"path\"`\n\n\t// Description describes the purpose of the private linter.\n\tDescription string `mapstructure:\"description\"`\n\t// OriginalURL The URL containing the source code for the private linter.\n\tOriginalURL string `mapstructure:\"original-url\"`\n\n\t// Settings plugin settings only work with linterdb.PluginConstructor symbol.\n\tSettings any `mapstructure:\"settings\"`\n}\n\nfunc (s *CustomLinterSettings) Validate() error {\n\tif s.Type == \"module\" {\n\t\tif s.Path != \"\" {\n\t\t\treturn errors.New(\"path not supported with module type\")\n\t\t}\n\n\t\treturn nil\n\t}\n\n\tif s.Path == \"\" {\n\t\treturn errors.New(\"path is required\")\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/config/linters_settings_test.go",
    "content": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestLintersSettings_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *LintersSettings\n\t}{\n\t\t{\n\t\t\tdesc: \"custom linter\",\n\t\t\tsettings: &LintersSettings{\n\t\t\t\tCustom: map[string]CustomLinterSettings{\n\t\t\t\t\t\"example\": {\n\t\t\t\t\t\tType: \"module\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"govet\",\n\t\t\tsettings: &LintersSettings{\n\t\t\t\tGovet: GovetSettings{\n\t\t\t\t\tEnable:     []string{\"a\"},\n\t\t\t\t\tDisableAll: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\t\t\tassert.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestLintersSettings_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *LintersSettings\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"custom linter error\",\n\t\t\tsettings: &LintersSettings{\n\t\t\t\tCustom: map[string]CustomLinterSettings{\n\t\t\t\t\t\"example\": {\n\t\t\t\t\t\tType: \"module\",\n\t\t\t\t\t\tPath: \"example\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: `custom linter \"example\": path not supported with module type`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"govet error\",\n\t\t\tsettings: &LintersSettings{\n\t\t\t\tGovet: GovetSettings{\n\t\t\t\t\tEnableAll:  true,\n\t\t\t\t\tDisableAll: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"govet: enable-all and disable-all can't be combined\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\n\t\t\tassert.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n\nfunc TestCustomLinterSettings_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *CustomLinterSettings\n\t}{\n\t\t{\n\t\t\tdesc: \"only path\",\n\t\t\tsettings: &CustomLinterSettings{\n\t\t\t\tPath: \"example\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"path and type goplugin\",\n\t\t\tsettings: &CustomLinterSettings{\n\t\t\t\tType: \"goplugin\",\n\t\t\t\tPath: \"example\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"type module\",\n\t\t\tsettings: &CustomLinterSettings{\n\t\t\t\tType: \"module\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\t\t\tassert.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestCustomLinterSettings_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *CustomLinterSettings\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"missing path\",\n\t\t\tsettings: &CustomLinterSettings{},\n\t\t\texpected: \"path is required\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"module and path\",\n\t\t\tsettings: &CustomLinterSettings{\n\t\t\t\tType: \"module\",\n\t\t\t\tPath: \"example\",\n\t\t\t},\n\t\t\texpected: \"path not supported with module type\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\n\t\t\tassert.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n\nfunc TestGovetSettings_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *GovetSettings\n\t}{\n\t\t{\n\t\t\tdesc:     \"empty\",\n\t\t\tsettings: &GovetSettings{},\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable-all and enable\",\n\t\t\tsettings: &GovetSettings{\n\t\t\t\tEnable:     []string{\"a\"},\n\t\t\t\tDisableAll: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"enable-all and disable\",\n\t\t\tsettings: &GovetSettings{\n\t\t\t\tDisable:   []string{\"a\"},\n\t\t\t\tEnableAll: true,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\t\t\tassert.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestGovetSettings_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *GovetSettings\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"enable-all and disable-all\",\n\t\t\tsettings: &GovetSettings{\n\t\t\t\tEnableAll:  true,\n\t\t\t\tDisableAll: true,\n\t\t\t},\n\t\t\texpected: \"govet: enable-all and disable-all can't be combined\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"enable-all and enable\",\n\t\t\tsettings: &GovetSettings{\n\t\t\t\tEnableAll: true,\n\t\t\t\tEnable:    []string{\"a\"},\n\t\t\t},\n\t\t\texpected: \"govet: enable-all and enable can't be combined\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable-all and disable\",\n\t\t\tsettings: &GovetSettings{\n\t\t\t\tDisableAll: true,\n\t\t\t\tDisable:    []string{\"a\"},\n\t\t\t},\n\t\t\texpected: \"govet: disable-all and disable can't be combined\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\n\t\t\tassert.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/config/loader.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"slices\"\n\n\t\"github.com/spf13/pflag\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nvar errConfigDisabled = errors.New(\"config is disabled by --no-config\")\n\nconst (\n\tmodeLinters    = \"linters\"\n\tmodeFormatters = \"formatters\"\n)\n\ntype LoaderOptions struct {\n\tConfig   string // Flag only. The path to the golangci config file, as specified with the --config argument.\n\tNoConfig bool   // Flag only.\n}\n\ntype LoadOptions struct {\n\tCheckDeprecation bool\n\tValidation       bool\n}\n\ntype Loader struct {\n\t*BaseLoader\n\n\tfs *pflag.FlagSet\n\n\tcfg *Config\n\n\tmode string\n}\n\nfunc NewLintersLoader(log logutils.Log, v *viper.Viper, fs *pflag.FlagSet, opts LoaderOptions, cfg *Config, args []string) *Loader {\n\tloader := newLoader(log, v, fs, opts, cfg, args)\n\tloader.mode = modeLinters\n\n\treturn loader\n}\n\nfunc NewFormattersLoader(log logutils.Log, v *viper.Viper, fs *pflag.FlagSet, opts LoaderOptions, cfg *Config, args []string) *Loader {\n\tloader := newLoader(log, v, fs, opts, cfg, args)\n\tloader.mode = modeFormatters\n\n\treturn loader\n}\n\nfunc newLoader(log logutils.Log, v *viper.Viper, fs *pflag.FlagSet, opts LoaderOptions, cfg *Config, args []string) *Loader {\n\treturn &Loader{\n\t\tBaseLoader: NewBaseLoader(log, v, opts, cfg, args),\n\t\tfs:         fs,\n\t\tcfg:        cfg,\n\t}\n}\n\nfunc (l *Loader) Load(opts LoadOptions) error {\n\terr := l.BaseLoader.Load()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif l.mode == modeLinters {\n\t\tl.applyStringSliceHack()\n\t}\n\n\tif l.cfg.Linters.Exclusions.Generated == \"\" {\n\t\tl.cfg.Linters.Exclusions.Generated = GeneratedModeStrict\n\t}\n\n\terr = l.checkConfigurationVersion()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !l.cfg.InternalCmdTest {\n\t\tfor _, n := range slices.Concat(l.cfg.Linters.Enable, l.cfg.Linters.Disable) {\n\t\t\tif n == \"typecheck\" {\n\t\t\t\treturn fmt.Errorf(\"%s is not a linter, it cannot be enabled or disabled\", n)\n\t\t\t}\n\t\t}\n\t}\n\n\tl.handleFormatters()\n\n\tif opts.CheckDeprecation {\n\t\terr = l.handleDeprecation()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tl.handleFormatterDeprecations()\n\t}\n\n\tl.handleGoVersion()\n\n\terr = goutil.CheckGoVersion(l.cfg.Run.Go)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tl.cfg.basePath, err = fsutils.GetBasePath(context.Background(), l.cfg.Run.RelativePathMode, l.cfg.cfgDir)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get base path: %w\", err)\n\t}\n\n\terr = l.handleEnableOnlyOption()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif opts.Validation {\n\t\terr = l.cfg.Validate()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Hack to append values from StringSlice flags.\n// Viper always overrides StringSlice values.\n// https://github.com/spf13/viper/issues/1448\n// So StringSlice flags are not bind to Viper like that their values are obtain via Cobra Flags.\nfunc (l *Loader) applyStringSliceHack() {\n\tif l.fs == nil {\n\t\treturn\n\t}\n\n\tl.appendStringSlice(\"enable\", &l.cfg.Linters.Enable)\n\tl.appendStringSlice(\"disable\", &l.cfg.Linters.Disable)\n\tl.appendStringSlice(\"build-tags\", &l.cfg.Run.BuildTags)\n}\n\nfunc (l *Loader) appendStringSlice(name string, current *[]string) {\n\tif l.fs.Changed(name) {\n\t\tval, _ := l.fs.GetStringSlice(name)\n\t\t*current = append(*current, val...)\n\t}\n}\n\nfunc (l *Loader) checkConfigurationVersion() error {\n\tif l.cfg.GetConfigDir() != \"\" && l.cfg.Version != \"2\" {\n\t\treturn fmt.Errorf(\"unsupported version of the configuration: %q \"+\n\t\t\t\"See https://golangci-lint.run/docs/product/migration-guide for migration instructions\", l.cfg.Version)\n\t}\n\n\treturn nil\n}\n\nfunc (l *Loader) handleGoVersion() {\n\tif l.cfg.Run.Go == \"\" {\n\t\tl.cfg.Run.Go = detectGoVersion(context.Background(), l.log)\n\t}\n\n\tl.cfg.Linters.Settings.Govet.Go = l.cfg.Run.Go\n\n\tl.cfg.Linters.Settings.ParallelTest.Go = l.cfg.Run.Go\n\n\tl.cfg.Linters.Settings.GoFumpt.LangVersion = l.cfg.Run.Go\n\tl.cfg.Formatters.Settings.GoFumpt.LangVersion = l.cfg.Run.Go\n\n\ttrimmedGoVersion := goutil.TrimGoVersion(l.cfg.Run.Go)\n\n\tl.cfg.Linters.Settings.Revive.Go = trimmedGoVersion\n\n\tl.cfg.Linters.Settings.Gocritic.Go = trimmedGoVersion\n\n\tos.Setenv(\"GOSECGOVERSION\", l.cfg.Run.Go)\n}\n\nfunc (l *Loader) handleDeprecation() error {\n\tif l.cfg.InternalTest || l.cfg.InternalCmdTest || os.Getenv(logutils.EnvTestRun) == \"1\" {\n\t\treturn nil\n\t}\n\n\tl.handleLinterOptionDeprecations()\n\n\treturn nil\n}\n\nfunc (l *Loader) handleLinterOptionDeprecations() {\n\t// Deprecated since v2.1.0.\n\tif l.cfg.Linters.Settings.Goconst.IgnoreStrings != \"\" {\n\t\tl.log.Warnf(\"The configuration option `linters.settings.goconst.ignore-strings` is deprecated, \" +\n\t\t\t\"please use `linters.settings.goconst.ignore-string-values`.\")\n\n\t\tl.cfg.Linters.Settings.Goconst.IgnoreStringValues = append(l.cfg.Linters.Settings.Goconst.IgnoreStringValues,\n\t\t\tl.cfg.Linters.Settings.Goconst.IgnoreStrings)\n\t}\n}\n\nfunc (l *Loader) handleEnableOnlyOption() error {\n\tlookup := l.fs.Lookup(\"enable-only\")\n\tif lookup == nil {\n\t\treturn nil\n\t}\n\n\tonly, err := l.fs.GetStringSlice(\"enable-only\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif len(only) > 0 {\n\t\tl.cfg.Linters = Linters{\n\t\t\tDefault:    GroupNone,\n\t\t\tEnable:     only,\n\t\t\tSettings:   l.cfg.Linters.Settings,\n\t\t\tExclusions: l.cfg.Linters.Exclusions,\n\t\t}\n\n\t\tl.cfg.Formatters = Formatters{}\n\t}\n\n\treturn nil\n}\n\nfunc (l *Loader) handleFormatters() {\n\tl.handleFormatterOverrides()\n\tl.handleFormatterExclusions()\n}\n\n// Overrides linter settings with formatter settings if the formatter is enabled.\nfunc (l *Loader) handleFormatterOverrides() {\n\tif slices.Contains(l.cfg.Formatters.Enable, \"gofmt\") {\n\t\tl.cfg.Linters.Settings.GoFmt = l.cfg.Formatters.Settings.GoFmt\n\t}\n\n\tif slices.Contains(l.cfg.Formatters.Enable, \"gofumpt\") {\n\t\tl.cfg.Linters.Settings.GoFumpt = l.cfg.Formatters.Settings.GoFumpt\n\t}\n\n\tif slices.Contains(l.cfg.Formatters.Enable, \"goimports\") {\n\t\tl.cfg.Linters.Settings.GoImports = l.cfg.Formatters.Settings.GoImports\n\t}\n\n\tif slices.Contains(l.cfg.Formatters.Enable, \"gci\") {\n\t\tl.cfg.Linters.Settings.Gci = l.cfg.Formatters.Settings.Gci\n\t}\n\n\tif slices.Contains(l.cfg.Formatters.Enable, \"golines\") {\n\t\tl.cfg.Linters.Settings.GoLines = l.cfg.Formatters.Settings.GoLines\n\t}\n}\n\n// Add formatter exclusions to linters exclusions.\nfunc (l *Loader) handleFormatterExclusions() {\n\tif len(l.cfg.Formatters.Enable) == 0 {\n\t\treturn\n\t}\n\n\tfor _, path := range l.cfg.Formatters.Exclusions.Paths {\n\t\tl.cfg.Linters.Exclusions.Rules = append(l.cfg.Linters.Exclusions.Rules, ExcludeRule{\n\t\t\tBaseRule: BaseRule{\n\t\t\t\tLinters: l.cfg.Formatters.Enable,\n\t\t\t\tPath:    path,\n\t\t\t},\n\t\t})\n\t}\n}\n\nfunc (*Loader) handleFormatterDeprecations() {\n\t// The function is empty but deprecations will happen in the future.\n}\n"
  },
  {
    "path": "pkg/config/output.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n)\n\ntype Output struct {\n\tFormats    Formats  `mapstructure:\"formats\"`\n\tSortOrder  []string `mapstructure:\"sort-order\"`\n\tShowStats  bool     `mapstructure:\"show-stats\"`\n\tPathPrefix string   `mapstructure:\"path-prefix\"`\n\tPathMode   string   `mapstructure:\"path-mode\"`\n}\n\nfunc (o *Output) Validate() error {\n\tvalidators := []func() error{\n\t\to.validateSortOrder,\n\t\to.validatePathMode,\n\t}\n\n\tfor _, v := range validators {\n\t\tif err := v(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (o *Output) validateSortOrder() error {\n\tvalidOrders := []string{\"linter\", \"file\", \"severity\"}\n\n\tall := strings.Join(o.SortOrder, \" \")\n\n\tfor _, order := range o.SortOrder {\n\t\tif strings.Count(all, order) > 1 {\n\t\t\treturn fmt.Errorf(\"the sort-order name %q is repeated several times\", order)\n\t\t}\n\n\t\tif !slices.Contains(validOrders, order) {\n\t\t\treturn fmt.Errorf(\"unsupported sort-order name %q\", order)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (o *Output) validatePathMode() error {\n\tswitch o.PathMode {\n\tcase \"\", fsutils.OutputPathModeAbsolute:\n\t\t// Valid\n\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported output path mode %q\", o.PathMode)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/config/output_formats.go",
    "content": "package config\n\ntype Formats struct {\n\tText        Text         `mapstructure:\"text\"`\n\tJSON        SimpleFormat `mapstructure:\"json\"`\n\tTab         Tab          `mapstructure:\"tab\"`\n\tHTML        SimpleFormat `mapstructure:\"html\"`\n\tCheckstyle  SimpleFormat `mapstructure:\"checkstyle\"`\n\tCodeClimate SimpleFormat `mapstructure:\"code-climate\"`\n\tJUnitXML    JUnitXML     `mapstructure:\"junit-xml\"`\n\tTeamCity    SimpleFormat `mapstructure:\"teamcity\"`\n\tSarif       SimpleFormat `mapstructure:\"sarif\"`\n}\n\nfunc (f *Formats) IsEmpty() bool {\n\tformats := []SimpleFormat{\n\t\tf.Text.SimpleFormat,\n\t\tf.JSON,\n\t\tf.Tab.SimpleFormat,\n\t\tf.HTML,\n\t\tf.Checkstyle,\n\t\tf.CodeClimate,\n\t\tf.JUnitXML.SimpleFormat,\n\t\tf.TeamCity,\n\t\tf.Sarif,\n\t}\n\n\tfor _, format := range formats {\n\t\tif format.Path != \"\" {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\ntype SimpleFormat struct {\n\tPath string `mapstructure:\"path\"`\n}\n\ntype Text struct {\n\tSimpleFormat    `mapstructure:\",squash\"`\n\tPrintLinterName bool `mapstructure:\"print-linter-name\"`\n\tPrintIssuedLine bool `mapstructure:\"print-issued-lines\"`\n\tColors          bool `mapstructure:\"colors\"`\n}\n\ntype Tab struct {\n\tSimpleFormat    `mapstructure:\",squash\"`\n\tPrintLinterName bool `mapstructure:\"print-linter-name\"`\n\tColors          bool `mapstructure:\"colors\"`\n}\n\ntype JUnitXML struct {\n\tSimpleFormat `mapstructure:\",squash\"`\n\tExtended     bool `mapstructure:\"extended\"`\n}\n"
  },
  {
    "path": "pkg/config/output_test.go",
    "content": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n)\n\nfunc TestOutput_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *Output\n\t}{\n\t\t{\n\t\t\tdesc: \"SortOrder: file\",\n\t\t\tsettings: &Output{\n\t\t\t\tSortOrder: []string{\"file\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"SortOrder: linter\",\n\t\t\tsettings: &Output{\n\t\t\t\tSortOrder: []string{\"linter\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"SortOrder: severity\",\n\t\t\tsettings: &Output{\n\t\t\t\tSortOrder: []string{\"severity\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"SortOrder: multiple\",\n\t\t\tsettings: &Output{\n\t\t\t\tSortOrder: []string{\"file\", \"linter\", \"severity\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"PathMode: empty\",\n\t\t\tsettings: &Output{\n\t\t\t\tPathMode: \"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"PathMode: absolute\",\n\t\t\tsettings: &Output{\n\t\t\t\tPathMode: fsutils.OutputPathModeAbsolute,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestOutput_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *Output\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"SortOrder: invalid\",\n\t\t\tsettings: &Output{\n\t\t\t\tSortOrder: []string{\"a\"},\n\t\t\t},\n\t\t\texpected: `unsupported sort-order name \"a\"`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"SortOrder: duplicate\",\n\t\t\tsettings: &Output{\n\t\t\t\tSortOrder: []string{\"file\", \"linter\", \"severity\", \"linter\"},\n\t\t\t},\n\t\t\texpected: `the sort-order name \"linter\" is repeated several times`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"PathMode: invalid\",\n\t\t\tsettings: &Output{\n\t\t\t\tPathMode: \"example\",\n\t\t\t},\n\t\t\texpected: `unsupported output path mode \"example\"`,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/config/placeholders.go",
    "content": "package config\n\nimport \"strings\"\n\nconst (\n\t// placeholderBasePath used inside linters to evaluate relative paths.\n\tplaceholderBasePath = \"${base-path}\"\n\n\t// placeholderConfigPath used inside linters to paths relative to configuration.\n\tplaceholderConfigPath = \"${config-path}\"\n)\n\nfunc NewPlaceholderReplacer(cfg *Config) *strings.Replacer {\n\treturn strings.NewReplacer(\n\t\tplaceholderBasePath, cfg.GetBasePath(),\n\t\tplaceholderConfigPath, cfg.GetConfigDir(),\n\t)\n}\n"
  },
  {
    "path": "pkg/config/run.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n)\n\n// Run encapsulates the config options for running the linter analysis.\ntype Run struct {\n\tTimeout time.Duration `mapstructure:\"timeout\"`\n\n\tConcurrency int `mapstructure:\"concurrency\"`\n\n\tGo string `mapstructure:\"go\"`\n\n\tRelativePathMode string `mapstructure:\"relative-path-mode\"`\n\n\tBuildTags           []string `mapstructure:\"build-tags\"`\n\tModulesDownloadMode string   `mapstructure:\"modules-download-mode\"`\n\tEnableBuildVCS      bool     `mapstructure:\"enable-build-vcs\"`\n\n\tExitCodeIfIssuesFound int  `mapstructure:\"issues-exit-code\"`\n\tAnalyzeTests          bool `mapstructure:\"tests\"`\n\n\tAllowParallelRunners bool `mapstructure:\"allow-parallel-runners\"`\n\tAllowSerialRunners   bool `mapstructure:\"allow-serial-runners\"`\n}\n\nfunc (r *Run) Validate() error {\n\t// go help modules\n\tallowedModes := []string{\"mod\", \"readonly\", \"vendor\"}\n\n\tif r.ModulesDownloadMode != \"\" && !slices.Contains(allowedModes, r.ModulesDownloadMode) {\n\t\treturn fmt.Errorf(\"invalid modules download path %s, only (%s) allowed\", r.ModulesDownloadMode, strings.Join(allowedModes, \"|\"))\n\t}\n\n\tpathRelativeToModes := fsutils.AllRelativePathModes()\n\n\tif r.RelativePathMode != \"\" && !slices.Contains(pathRelativeToModes, r.RelativePathMode) {\n\t\treturn fmt.Errorf(\"invalid relative path mode %s, only (%s) allowed\", r.RelativePathMode, strings.Join(pathRelativeToModes, \"|\"))\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/config/run_test.go",
    "content": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestRun_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *Run\n\t}{\n\t\t{\n\t\t\tdesc: \"modules-download-mode: mod\",\n\t\t\tsettings: &Run{\n\t\t\t\tModulesDownloadMode: \"mod\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"modules-download-mode: readonly\",\n\t\t\tsettings: &Run{\n\t\t\t\tModulesDownloadMode: \"readonly\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"modules-download-mode: vendor\",\n\t\t\tsettings: &Run{\n\t\t\t\tModulesDownloadMode: \"vendor\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"modules-download-mode: empty\",\n\t\t\tsettings: &Run{\n\t\t\t\tModulesDownloadMode: \"\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestRun_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *Run\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"modules-download-mode: invalid\",\n\t\t\tsettings: &Run{\n\t\t\t\tModulesDownloadMode: \"invalid\",\n\t\t\t},\n\t\t\texpected: \"invalid modules download path invalid, only (mod|readonly|vendor) allowed\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.settings.Validate()\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/config/severity.go",
    "content": "package config\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nconst severityRuleMinConditionsCount = 1\n\ntype Severity struct {\n\tDefault string         `mapstructure:\"default\"`\n\tRules   []SeverityRule `mapstructure:\"rules\"`\n}\n\nfunc (s *Severity) Validate() error {\n\tif len(s.Rules) > 0 && s.Default == \"\" {\n\t\treturn errors.New(\"can't set severity rule option: no default severity defined\")\n\t}\n\n\tfor i, rule := range s.Rules {\n\t\tif err := rule.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"error in severity rule #%d: %w\", i, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype SeverityRule struct {\n\tBaseRule `mapstructure:\",squash\"`\n\tSeverity string `mapstructure:\"severity\"`\n}\n\nfunc (s *SeverityRule) Validate() error {\n\tif s.Severity == \"\" {\n\t\treturn errors.New(\"severity should be set\")\n\t}\n\n\treturn s.BaseRule.Validate(severityRuleMinConditionsCount)\n}\n"
  },
  {
    "path": "pkg/config/severity_test.go",
    "content": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestSeverity_Validate(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tseverity *Severity\n\t}{\n\t\t{\n\t\t\tdesc: \"default with rules\",\n\t\t\tseverity: &Severity{\n\t\t\t\tDefault: \"high\",\n\t\t\t\tRules: []SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"low\",\n\t\t\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\t\t\tPath: \"test\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"default without rules\",\n\t\t\tseverity: &Severity{\n\t\t\t\tDefault: \"high\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"same severity between default and rule\",\n\t\t\tseverity: &Severity{\n\t\t\t\tDefault: \"high\",\n\t\t\t\tRules: []SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"high\",\n\t\t\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\t\t\tPath: \"test\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.severity.Validate()\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestSeverity_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tseverity *Severity\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"missing default severity\",\n\t\t\tseverity: &Severity{\n\t\t\t\tDefault: \"\",\n\t\t\t\tRules: []SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"low\",\n\t\t\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\t\t\tPath: \"test\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"can't set severity rule option: no default severity defined\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"missing rule severity\",\n\t\t\tseverity: &Severity{\n\t\t\t\tDefault: \"high\",\n\t\t\t\tRules: []SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\t\t\tPath: \"test\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"error in severity rule #0: severity should be set\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.severity.Validate()\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n\nfunc TestSeverityRule_Validate(t *testing.T) {\n\trule := &SeverityRule{\n\t\tSeverity: \"low\",\n\t\tBaseRule: BaseRule{\n\t\t\tPath: \"test\",\n\t\t},\n\t}\n\n\terr := rule.Validate()\n\trequire.NoError(t, err)\n}\n\nfunc TestSeverityRule_Validate_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\trule     *SeverityRule\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"missing severity\",\n\t\t\trule: &SeverityRule{\n\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\tPath: \"test\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"severity should be set\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"empty rule\",\n\t\t\trule: &SeverityRule{\n\t\t\t\tSeverity: \"low\",\n\t\t\t},\n\t\t\texpected: \"at least 1 of (text, source, path[-except], linters) should be set\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid path rule\",\n\t\t\trule: &SeverityRule{\n\t\t\t\tSeverity: \"low\",\n\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\tPath: \"**test\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"invalid path regex: error parsing regexp: missing argument to repetition operator: `*`\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid path-except rule\",\n\t\t\trule: &SeverityRule{\n\t\t\t\tSeverity: \"low\",\n\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\tPathExcept: \"**test\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"invalid path-except regex: error parsing regexp: missing argument to repetition operator: `*`\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid text rule\",\n\t\t\trule: &SeverityRule{\n\t\t\t\tSeverity: \"low\",\n\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\tText: \"**test\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"invalid text regex: error parsing regexp: missing argument to repetition operator: `*`\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid source rule\",\n\t\t\trule: &SeverityRule{\n\t\t\t\tSeverity: \"low\",\n\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\tSource: \"**test\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"invalid source regex: error parsing regexp: missing argument to repetition operator: `*`\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"path and path-expect\",\n\t\t\trule: &SeverityRule{\n\t\t\t\tSeverity: \"low\",\n\t\t\t\tBaseRule: BaseRule{\n\t\t\t\t\tPath:       \"test\",\n\t\t\t\t\tPathExcept: \"test\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"path and path-except should not be set at the same time\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := test.rule.Validate()\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/exitcodes/exitcodes.go",
    "content": "package exitcodes\n\nconst (\n\tSuccess = iota\n\tIssuesFound\n\tWarningInTest\n\tFailure\n\tTimeout\n\tNoGoFiles\n\tNoConfigFileDetected\n\tErrorWasLogged\n)\n\ntype ExitError struct {\n\tMessage string\n\tCode    int\n}\n\nfunc (e ExitError) Error() string {\n\treturn e.Message\n}\n\nvar (\n\tErrNoGoFiles = &ExitError{\n\t\tMessage: \"no go files to analyze\",\n\t\tCode:    NoGoFiles,\n\t}\n\tErrFailure = &ExitError{\n\t\tMessage: \"failed to analyze\",\n\t\tCode:    Failure,\n\t}\n)\n"
  },
  {
    "path": "pkg/fsutils/basepath.go",
    "content": "package fsutils\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"context\"\n\t\"fmt\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\n\t\"github.com/ldez/grignotin/goenv\"\n)\n\n// Relative path modes.\nconst (\n\tRelativePathModeGoMod   = \"gomod\"\n\tRelativePathModeGitRoot = \"gitroot\"\n\tRelativePathModeCfg     = \"cfg\"\n\tRelativePathModeWd      = \"wd\"\n)\n\n// OutputPathModeAbsolute path mode used to show absolute paths in output reports (user-facing).\nconst OutputPathModeAbsolute = \"abs\"\n\nfunc AllRelativePathModes() []string {\n\treturn []string{RelativePathModeGoMod, RelativePathModeGitRoot, RelativePathModeCfg, RelativePathModeWd}\n}\n\nfunc GetBasePath(ctx context.Context, mode, cfgDir string) (string, error) {\n\tmode = cmp.Or(mode, RelativePathModeCfg)\n\n\tswitch mode {\n\tcase RelativePathModeCfg:\n\t\tif cfgDir == \"\" {\n\t\t\treturn GetBasePath(ctx, RelativePathModeWd, cfgDir)\n\t\t}\n\n\t\treturn cfgDir, nil\n\n\tcase RelativePathModeGoMod:\n\t\tgoMod, err := goenv.GetOne(ctx, goenv.GOMOD)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"get go.mod path: %w\", err)\n\t\t}\n\n\t\treturn filepath.Dir(goMod), nil\n\n\tcase RelativePathModeGitRoot:\n\t\troot, err := gitRoot(ctx)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"get git root: %w\", err)\n\t\t}\n\n\t\treturn root, nil\n\n\tcase RelativePathModeWd:\n\t\twd, err := Getwd()\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"get wd: %w\", err)\n\t\t}\n\n\t\treturn wd, nil\n\n\tdefault:\n\t\treturn \"\", fmt.Errorf(\"unknown relative path mode: %s\", mode)\n\t}\n}\n\nfunc gitRoot(ctx context.Context) (string, error) {\n\tcmd := exec.CommandContext(ctx, \"git\", \"rev-parse\", \"--show-toplevel\")\n\tout, err := cmd.Output()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(bytes.TrimSpace(out)), nil\n}\n"
  },
  {
    "path": "pkg/fsutils/filecache.go",
    "content": "package fsutils\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype FileCache struct {\n\tfiles sync.Map\n}\n\nfunc NewFileCache() *FileCache {\n\treturn &FileCache{}\n}\n\nfunc (fc *FileCache) GetFileBytes(filePath string) ([]byte, error) {\n\tcachedBytes, ok := fc.files.Load(filePath)\n\tif ok {\n\t\treturn cachedBytes.([]byte), nil\n\t}\n\n\tfileBytes, err := os.ReadFile(filePath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't read file %s: %w\", filePath, err)\n\t}\n\n\tfc.files.Store(filePath, fileBytes)\n\treturn fileBytes, nil\n}\n\nfunc PrettifyBytesCount(n int64) string {\n\tconst (\n\t\tMultiplexer = 1024\n\t\tKiB         = 1 * Multiplexer\n\t\tMiB         = KiB * Multiplexer\n\t\tGiB         = MiB * Multiplexer\n\t)\n\n\tif n >= GiB {\n\t\treturn fmt.Sprintf(\"%.1fGiB\", float64(n)/GiB)\n\t}\n\tif n >= MiB {\n\t\treturn fmt.Sprintf(\"%.1fMiB\", float64(n)/MiB)\n\t}\n\tif n >= KiB {\n\t\treturn fmt.Sprintf(\"%.1fKiB\", float64(n)/KiB)\n\t}\n\treturn fmt.Sprintf(\"%dB\", n)\n}\n\nfunc (fc *FileCache) PrintStats(log logutils.Log) {\n\tvar size int64\n\tvar mapLen int\n\tfc.files.Range(func(_, fileBytes any) bool {\n\t\tmapLen++\n\t\tsize += int64(len(fileBytes.([]byte)))\n\n\t\treturn true\n\t})\n\n\tlog.Infof(\"File cache stats: %d entries of total size %s\", mapLen, PrettifyBytesCount(size))\n}\n"
  },
  {
    "path": "pkg/fsutils/fsutils.go",
    "content": "package fsutils\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n)\n\nfunc IsDir(filename string) bool {\n\tfi, err := os.Stat(filename)\n\treturn err == nil && fi.IsDir()\n}\n\nvar (\n\tcachedWd      string\n\tcachedWdError error\n\tgetWdOnce     sync.Once\n\tuseCache      = true\n)\n\nfunc UseWdCache(use bool) {\n\tuseCache = use\n}\n\nfunc Getwd() (string, error) {\n\tif !useCache { // for tests\n\t\treturn os.Getwd()\n\t}\n\n\tgetWdOnce.Do(func() {\n\t\tcachedWd, cachedWdError = os.Getwd()\n\t\tif cachedWdError != nil {\n\t\t\treturn\n\t\t}\n\n\t\tevaluatedWd, err := EvalSymlinks(cachedWd)\n\t\tif err != nil {\n\t\t\tcachedWd, cachedWdError = \"\", fmt.Errorf(\"can't eval symlinks on wd %s: %w\", cachedWd, err)\n\t\t\treturn\n\t\t}\n\n\t\tcachedWd = evaluatedWd\n\t})\n\n\treturn cachedWd, cachedWdError\n}\n\nvar evalSymlinkCache sync.Map\n\ntype evalSymlinkRes struct {\n\tpath string\n\terr  error\n}\n\nfunc EvalSymlinks(path string) (string, error) {\n\tr, ok := evalSymlinkCache.Load(path)\n\tif ok {\n\t\ter := r.(evalSymlinkRes)\n\t\treturn er.path, er.err\n\t}\n\n\tvar er evalSymlinkRes\n\ter.path, er.err = evalSymlinks(path)\n\tevalSymlinkCache.Store(path, er)\n\n\treturn er.path, er.err\n}\n\nfunc ShortestRelPath(path, wd string) (string, error) {\n\tif wd == \"\" { // get it if user don't have cached working dir\n\t\tvar err error\n\t\twd, err = Getwd()\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"can't get working directory: %w\", err)\n\t\t}\n\t}\n\n\tevaluatedPath, err := EvalSymlinks(path)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"can't eval symlinks for path %s: %w\", path, err)\n\t}\n\tpath = evaluatedPath\n\n\t// make path absolute and then relative to be able to fix this case:\n\t// we are in `/test` dir, we want to normalize `../test`, and have file `file.go` in this dir;\n\t// it must have normalized path `file.go`, not `../test/file.go`,\n\tvar absPath string\n\tif filepath.IsAbs(path) {\n\t\tabsPath = path\n\t} else {\n\t\tabsPath = filepath.Join(wd, path)\n\t}\n\n\trelPath, err := filepath.Rel(wd, absPath)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"can't get relative path for path %s and root %s: %w\",\n\t\t\tabsPath, wd, err)\n\t}\n\n\treturn relPath, nil\n}\n"
  },
  {
    "path": "pkg/fsutils/fsutils_test.go",
    "content": "package fsutils\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestShortestRelPath(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tpath     string\n\t\twd       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"based on parent path\",\n\t\t\tpath:     \"fsutils_test.go\",\n\t\t\twd:       filepath.Join(\"..\", \"fsutils\"),\n\t\t\texpected: \"fsutils_test.go\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"based on current working directory\",\n\t\t\tpath:     \"fsutils_test.go\",\n\t\t\twd:       \"\",\n\t\t\texpected: \"fsutils_test.go\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\trel, err := ShortestRelPath(\"fsutils_test.go\", filepath.Join(\"..\", \"fsutils\"))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, rel)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/fsutils/fsutils_unix.go",
    "content": "//go:build !windows\n\npackage fsutils\n\nimport \"path/filepath\"\n\nfunc evalSymlinks(path string) (string, error) {\n\treturn filepath.EvalSymlinks(path)\n}\n"
  },
  {
    "path": "pkg/fsutils/fsutils_windows.go",
    "content": "//go:build windows\n\npackage fsutils\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"syscall\"\n)\n\n// This is a workaround for the behavior of [filepath.EvalSymlinks],\n// which fails with [syscall.ENOTDIR] if the specified path contains a junction on Windows.\n// Junctions can occur, for example, when a volume is mounted as a subdirectory inside another drive.\n// This can usually happen when using the Dev Drives feature and replacing existing directories.\n// See: https://github.com/golang/go/issues/40180\n//\n// Since [syscall.ENOTDIR] is only returned when calling [filepath.EvalSymlinks] on Windows\n// if part of the presented path is a junction and nothing before was a symlink,\n// we simply treat this as NOT symlink,\n// because a symlink over the junction makes no sense at all.\nfunc evalSymlinks(path string) (string, error) {\n\tresolved, err := filepath.EvalSymlinks(path)\n\tif err == nil {\n\t\treturn resolved, nil\n\t}\n\n\tif !errors.Is(err, syscall.ENOTDIR) {\n\t\treturn \"\", err\n\t}\n\n\t_, err = os.Stat(path)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// If exists, we make the path absolute, to be sure...\n\treturn filepath.Abs(path)\n}\n"
  },
  {
    "path": "pkg/fsutils/linecache.go",
    "content": "package fsutils\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"sync\"\n)\n\ntype fileLinesCache [][]byte\n\ntype LineCache struct {\n\tfiles     sync.Map\n\tfileCache *FileCache\n}\n\nfunc NewLineCache(fc *FileCache) *LineCache {\n\treturn &LineCache{\n\t\tfileCache: fc,\n\t}\n}\n\n// GetLine returns the index1-th (1-based index) line from the file on filePath\nfunc (lc *LineCache) GetLine(filePath string, index1 int) (string, error) {\n\tif index1 == 0 { // some linters, e.g. gosec can do it: it really means first line\n\t\tindex1 = 1\n\t}\n\n\tconst index1To0Offset = -1\n\trawLine, err := lc.getRawLine(filePath, index1+index1To0Offset)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(bytes.Trim(rawLine, \"\\r\")), nil\n}\n\nfunc (lc *LineCache) getRawLine(filePath string, index0 int) ([]byte, error) {\n\tfc, err := lc.getFileCache(filePath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get file %s lines cache: %w\", filePath, err)\n\t}\n\n\tif index0 < 0 {\n\t\treturn nil, fmt.Errorf(\"invalid file line index0 < 0: %d\", index0)\n\t}\n\n\tif index0 >= len(fc) {\n\t\treturn nil, fmt.Errorf(\"invalid file line index0 (%d) >= len(fc) (%d)\", index0, len(fc))\n\t}\n\n\treturn fc[index0], nil\n}\n\nfunc (lc *LineCache) getFileCache(filePath string) (fileLinesCache, error) {\n\tloadedFc, ok := lc.files.Load(filePath)\n\tif ok {\n\t\treturn loadedFc.(fileLinesCache), nil\n\t}\n\n\tfileBytes, err := lc.fileCache.GetFileBytes(filePath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't get file %s bytes from cache: %w\", filePath, err)\n\t}\n\n\tfc := bytes.Split(fileBytes, []byte(\"\\n\"))\n\tlc.files.Store(filePath, fileLinesCache(fc))\n\treturn fc, nil\n}\n"
  },
  {
    "path": "pkg/fsutils/path_unix.go",
    "content": "//go:build !windows\n\npackage fsutils\n\n// NormalizePathInRegex it's a noop function on Unix.\nfunc NormalizePathInRegex(path string) string {\n\treturn path\n}\n"
  },
  {
    "path": "pkg/fsutils/path_windows.go",
    "content": "//go:build windows\n\npackage fsutils\n\nimport (\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nvar separatorToReplace = regexp.QuoteMeta(string(filepath.Separator))\n\n// NormalizePathInRegex normalizes path in regular expressions.\n// noop on Unix.\n// This replacing should be safe because \"/\" are disallowed in Windows\n// https://docs.microsoft.com/windows/win32/fileio/naming-a-file\nfunc NormalizePathInRegex(path string) string {\n\t// remove redundant character escape \"\\/\" https://github.com/golangci/golangci-lint/issues/3277\n\tclean := regexp.MustCompile(`\\\\+/`).\n\t\tReplaceAllStringFunc(path, func(s string) string {\n\t\t\tif strings.Count(s, \"\\\\\")%2 == 0 {\n\t\t\t\treturn s\n\t\t\t}\n\t\t\treturn s[1:]\n\t\t})\n\n\treturn strings.ReplaceAll(clean, \"/\", separatorToReplace)\n}\n"
  },
  {
    "path": "pkg/goanalysis/issue.go",
    "content": "package goanalysis\n\nimport (\n\t\"go/token\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype Issue struct {\n\t*result.Issue\n\tPass *analysis.Pass\n}\n\nfunc NewIssue(issue *result.Issue, pass *analysis.Pass) *Issue {\n\treturn &Issue{\n\t\tIssue: issue,\n\t\tPass:  pass,\n\t}\n}\n\ntype EncodingIssue struct {\n\tFromLinter           string\n\tText                 string\n\tSeverity             string\n\tPos                  token.Position\n\tLineRange            *result.Range\n\tSuggestedFixes       []analysis.SuggestedFix\n\tExpectNoLint         bool\n\tExpectedNoLintLinter string\n}\n"
  },
  {
    "path": "pkg/goanalysis/linter.go",
    "content": "package goanalysis\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype LoadMode int\n\nfunc (loadMode LoadMode) String() string {\n\tswitch loadMode {\n\tcase LoadModeNone:\n\t\treturn \"none\"\n\tcase LoadModeSyntax:\n\t\treturn \"syntax\"\n\tcase LoadModeTypesInfo:\n\t\treturn \"types info\"\n\tcase LoadModeWholeProgram:\n\t\treturn \"whole program\"\n\t}\n\tpanic(fmt.Sprintf(\"unknown load mode %d\", loadMode))\n}\n\nconst (\n\tLoadModeNone LoadMode = iota\n\tLoadModeSyntax\n\tLoadModeTypesInfo\n\tLoadModeWholeProgram\n)\n\ntype Linter struct {\n\tname, desc              string\n\tanalyzers               []*analysis.Analyzer\n\tcfg                     map[string]map[string]any\n\tissuesReporter          func(*linter.Context) []*Issue\n\tcontextSetter           func(*linter.Context)\n\tloadMode                LoadMode\n\tneedUseOriginalPackages bool\n}\n\nfunc NewLinter(name, desc string, analyzers []*analysis.Analyzer, cfg map[string]map[string]any) *Linter {\n\treturn &Linter{name: name, desc: desc, analyzers: analyzers, cfg: cfg}\n}\n\nfunc NewLinterFromAnalyzer(analyzer *analysis.Analyzer) *Linter {\n\treturn NewLinter(analyzer.Name, analyzer.Doc, []*analysis.Analyzer{analyzer}, nil)\n}\n\nfunc (lnt *Linter) Run(_ context.Context, lintCtx *linter.Context) ([]*result.Issue, error) {\n\tif err := lnt.preRun(lintCtx); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn runAnalyzers(lnt, lintCtx)\n}\n\nfunc (lnt *Linter) UseOriginalPackages() {\n\tlnt.needUseOriginalPackages = true\n}\n\nfunc (lnt *Linter) LoadMode() LoadMode {\n\treturn lnt.loadMode\n}\n\nfunc (lnt *Linter) WithDesc(desc string) *Linter {\n\tlnt.desc = desc\n\n\treturn lnt\n}\n\nfunc (lnt *Linter) WithVersion(v int) *Linter {\n\tif v == 0 {\n\t\treturn lnt\n\t}\n\n\tfor _, analyzer := range lnt.analyzers {\n\t\tif lnt.name != analyzer.Name {\n\t\t\tcontinue\n\t\t}\n\n\t\t// The analyzer name should be the same as the linter name to avoid displaying the name inside the reports.\n\t\tanalyzer.Name = fmt.Sprintf(\"%s_v%d\", analyzer.Name, v)\n\t}\n\n\tlnt.name = fmt.Sprintf(\"%s_v%d\", lnt.name, v)\n\n\treturn lnt\n}\n\nfunc (lnt *Linter) WithConfig(cfg map[string]any) *Linter {\n\tif len(cfg) == 0 {\n\t\treturn lnt\n\t}\n\n\tlnt.cfg = map[string]map[string]any{\n\t\tlnt.name: cfg,\n\t}\n\n\treturn lnt\n}\n\nfunc (lnt *Linter) WithLoadMode(loadMode LoadMode) *Linter {\n\tlnt.loadMode = loadMode\n\treturn lnt\n}\n\nfunc (lnt *Linter) WithIssuesReporter(r func(*linter.Context) []*Issue) *Linter {\n\tlnt.issuesReporter = r\n\treturn lnt\n}\n\nfunc (lnt *Linter) WithContextSetter(cs func(*linter.Context)) *Linter {\n\tlnt.contextSetter = cs\n\treturn lnt\n}\n\nfunc (lnt *Linter) Name() string {\n\treturn lnt.name\n}\n\nfunc (lnt *Linter) Desc() string {\n\treturn lnt.desc\n}\n\nfunc (lnt *Linter) allAnalyzerNames() []string {\n\tvar ret []string\n\tfor _, a := range lnt.analyzers {\n\t\tret = append(ret, a.Name)\n\t}\n\treturn ret\n}\n\nfunc (*Linter) configureAnalyzer(a *analysis.Analyzer, cfg map[string]any) error {\n\tfor k, v := range cfg {\n\t\tf := a.Flags.Lookup(k)\n\t\tif f == nil {\n\t\t\tvalidFlagNames := allFlagNames(&a.Flags)\n\t\t\tif len(validFlagNames) == 0 {\n\t\t\t\treturn errors.New(\"analyzer doesn't have settings\")\n\t\t\t}\n\n\t\t\treturn fmt.Errorf(\"analyzer doesn't have setting %q, valid settings: %v\",\n\t\t\t\tk, validFlagNames)\n\t\t}\n\n\t\tif err := f.Value.Set(valueToString(v)); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to set analyzer setting %q with value %q: %w\", k, v, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (lnt *Linter) configure() error {\n\tanalyzersMap := map[string]*analysis.Analyzer{}\n\tfor _, a := range lnt.analyzers {\n\t\tanalyzersMap[a.Name] = a\n\t}\n\n\tfor analyzerName, analyzerSettings := range lnt.cfg {\n\t\ta := analyzersMap[analyzerName]\n\t\tif a == nil {\n\t\t\treturn fmt.Errorf(\"settings key %q must be valid analyzer name, valid analyzers: %v\",\n\t\t\t\tanalyzerName, lnt.allAnalyzerNames())\n\t\t}\n\n\t\tif err := lnt.configureAnalyzer(a, analyzerSettings); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to configure analyzer %s: %w\", analyzerName, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (lnt *Linter) preRun(lintCtx *linter.Context) error {\n\tif err := analysis.Validate(lnt.analyzers); err != nil {\n\t\treturn fmt.Errorf(\"failed to validate analyzers: %w\", err)\n\t}\n\n\tif err := lnt.configure(); err != nil {\n\t\treturn fmt.Errorf(\"failed to configure analyzers: %w\", err)\n\t}\n\n\tif lnt.contextSetter != nil {\n\t\tlnt.contextSetter(lintCtx)\n\t}\n\n\treturn nil\n}\n\nfunc (lnt *Linter) getName() string {\n\treturn lnt.name\n}\n\nfunc (lnt *Linter) getLinterNameForDiagnostic(*Diagnostic) string {\n\treturn lnt.name\n}\n\nfunc (lnt *Linter) getAnalyzers() []*analysis.Analyzer {\n\treturn lnt.analyzers\n}\n\nfunc (lnt *Linter) useOriginalPackages() bool {\n\treturn lnt.needUseOriginalPackages\n}\n\nfunc (lnt *Linter) reportIssues(lintCtx *linter.Context) []*Issue {\n\tif lnt.issuesReporter != nil {\n\t\treturn lnt.issuesReporter(lintCtx)\n\t}\n\treturn nil\n}\n\nfunc (lnt *Linter) getLoadMode() LoadMode {\n\treturn lnt.loadMode\n}\n\nfunc allFlagNames(fs *flag.FlagSet) []string {\n\tvar ret []string\n\tfs.VisitAll(func(f *flag.Flag) {\n\t\tret = append(ret, f.Name)\n\t})\n\treturn ret\n}\n\nfunc valueToString(v any) string {\n\tif ss, ok := v.([]string); ok {\n\t\treturn strings.Join(ss, \",\")\n\t}\n\n\tif is, ok := v.([]any); ok {\n\t\tvar ss []string\n\t\tfor _, i := range is {\n\t\t\tss = append(ss, fmt.Sprint(i))\n\t\t}\n\n\t\treturn valueToString(ss)\n\t}\n\n\treturn fmt.Sprint(v)\n}\n\nfunc DummyRun(_ *analysis.Pass) (any, error) {\n\treturn nil, nil\n}\n"
  },
  {
    "path": "pkg/goanalysis/load/guard.go",
    "content": "package load\n\nimport (\n\t\"sync\"\n\n\t\"golang.org/x/tools/go/packages\"\n)\n\ntype Guard struct {\n\tloadMutexes map[*packages.Package]*sync.Mutex\n\tmutex       sync.Mutex\n}\n\nfunc NewGuard() *Guard {\n\treturn &Guard{\n\t\tloadMutexes: map[*packages.Package]*sync.Mutex{},\n\t}\n}\n\nfunc (g *Guard) AddMutexForPkg(pkg *packages.Package) {\n\tg.loadMutexes[pkg] = &sync.Mutex{}\n}\n\nfunc (g *Guard) MutexForPkg(pkg *packages.Package) *sync.Mutex {\n\treturn g.loadMutexes[pkg]\n}\n\nfunc (g *Guard) Mutex() *sync.Mutex {\n\treturn &g.mutex\n}\n"
  },
  {
    "path": "pkg/goanalysis/metalinter.go",
    "content": "package goanalysis\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype MetaLinter struct {\n\tlinters              []*Linter\n\tanalyzerToLinterName map[*analysis.Analyzer]string\n}\n\nfunc NewMetaLinter(linters []*Linter) *MetaLinter {\n\tml := &MetaLinter{linters: linters}\n\tml.analyzerToLinterName = ml.getAnalyzerToLinterNameMapping()\n\treturn ml\n}\n\nfunc (ml MetaLinter) Run(_ context.Context, lintCtx *linter.Context) ([]*result.Issue, error) {\n\tfor _, l := range ml.linters {\n\t\tif err := l.preRun(lintCtx); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to pre-run %s: %w\", l.Name(), err)\n\t\t}\n\t}\n\n\treturn runAnalyzers(ml, lintCtx)\n}\n\nfunc (MetaLinter) Name() string {\n\treturn \"goanalysis_metalinter\"\n}\n\nfunc (MetaLinter) Desc() string {\n\treturn \"\"\n}\n\nfunc (ml MetaLinter) getLoadMode() LoadMode {\n\tloadMode := LoadModeNone\n\tfor _, l := range ml.linters {\n\t\tif l.loadMode > loadMode {\n\t\t\tloadMode = l.loadMode\n\t\t}\n\t}\n\treturn loadMode\n}\n\nfunc (ml MetaLinter) getAnalyzers() []*analysis.Analyzer {\n\tvar allAnalyzers []*analysis.Analyzer\n\tfor _, l := range ml.linters {\n\t\tallAnalyzers = append(allAnalyzers, l.analyzers...)\n\t}\n\treturn allAnalyzers\n}\n\nfunc (MetaLinter) getName() string {\n\treturn \"metalinter\"\n}\n\nfunc (MetaLinter) useOriginalPackages() bool {\n\treturn false // `unused` can't be run by this metalinter\n}\n\nfunc (ml MetaLinter) reportIssues(lintCtx *linter.Context) []*Issue {\n\tvar ret []*Issue\n\tfor _, lnt := range ml.linters {\n\t\tif lnt.issuesReporter != nil {\n\t\t\tret = append(ret, lnt.issuesReporter(lintCtx)...)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (ml MetaLinter) getLinterNameForDiagnostic(diag *Diagnostic) string {\n\treturn ml.analyzerToLinterName[diag.Analyzer]\n}\n\nfunc (ml MetaLinter) getAnalyzerToLinterNameMapping() map[*analysis.Analyzer]string {\n\tanalyzerToLinterName := map[*analysis.Analyzer]string{}\n\tfor _, l := range ml.linters {\n\t\tfor _, a := range l.analyzers {\n\t\t\tanalyzerToLinterName[a] = l.Name()\n\t\t}\n\t}\n\treturn analyzerToLinterName\n}\n"
  },
  {
    "path": "pkg/goanalysis/pkgerrors/errors.go",
    "content": "package pkgerrors\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype IllTypedError struct {\n\tPkg *packages.Package\n}\n\nfunc (e *IllTypedError) Error() string {\n\treturn fmt.Sprintf(\"IllTypedError: errors in package: %v\", e.Pkg.Errors)\n}\n\nfunc BuildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]*result.Issue, error) {\n\tvar issues []*result.Issue\n\n\tuniqReportedIssues := map[string]bool{}\n\n\tvar other error\n\n\tfor _, err := range errs {\n\t\tvar ill *IllTypedError\n\t\tif !errors.As(err, &ill) {\n\t\t\tif other == nil {\n\t\t\t\tother = err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, err := range extractErrors(ill.Pkg) {\n\t\t\tissue, perr := parseError(err)\n\t\t\tif perr != nil { // failed to parse\n\t\t\t\tif uniqReportedIssues[err.Msg] {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tuniqReportedIssues[err.Msg] = true\n\t\t\t\tlintCtx.Log.Errorf(\"typechecking error: %s\", err.Msg)\n\t\t\t} else {\n\t\t\t\tkey := fmt.Sprintf(\"%s.%d.%d.%s\", issue.FilePath(), issue.Line(), issue.Column(), issue.Text)\n\t\t\t\tif uniqReportedIssues[key] {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tuniqReportedIssues[key] = true\n\n\t\t\t\tissue.Pkg = ill.Pkg // to save to cache later\n\t\t\t\tissues = append(issues, issue)\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(issues) == 0 && other != nil {\n\t\treturn nil, other\n\t}\n\n\treturn issues, nil\n}\n"
  },
  {
    "path": "pkg/goanalysis/pkgerrors/extract.go",
    "content": "package pkgerrors\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/packages\"\n)\n\n// reFile matches a line who starts with path and position.\n// ex: `/example/main.go:11:17: foobar`\nvar reFile = regexp.MustCompile(`^.+\\.go:\\d+:\\d+: .+`)\n\nfunc extractErrors(pkg *packages.Package) []packages.Error {\n\terrors := extractErrorsImpl(pkg, map[*packages.Package]bool{})\n\tif len(errors) == 0 {\n\t\treturn errors\n\t}\n\n\tskippedErrors := map[string]packages.Error{}\n\tseenErrors := map[string]bool{}\n\n\tvar uniqErrors []packages.Error\n\tfor _, err := range errors {\n\t\tmsg := stackCrusher(err.Error())\n\t\tif seenErrors[msg] {\n\t\t\tcontinue\n\t\t}\n\n\t\t// This `if` is important to avoid duplicate errors.\n\t\t// The goal is to keep the most relevant error.\n\t\tif msg != err.Error() {\n\t\t\tprev, alreadySkip := skippedErrors[msg]\n\t\t\tif !alreadySkip {\n\t\t\t\tskippedErrors[msg] = err\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif len(err.Error()) < len(prev.Error()) {\n\t\t\t\tskippedErrors[msg] = err\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\tdelete(skippedErrors, msg)\n\n\t\tseenErrors[msg] = true\n\n\t\tuniqErrors = append(uniqErrors, err)\n\t}\n\n\t// In some cases, the error stack doesn't contain the tip error.\n\t// We must keep at least one of the original errors that contain the specific message.\n\tfor skippedError := range maps.Values(skippedErrors) {\n\t\tuniqErrors = append(uniqErrors, skippedError)\n\t}\n\n\tif len(pkg.GoFiles) != 0 {\n\t\t// errors were extracted from deps and have at least one file in package\n\t\tfor i := range uniqErrors {\n\t\t\tif _, parseErr := parseErrorPosition(uniqErrors[i].Pos); parseErr == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// change pos to local file to properly process it by processors (properly read line etc.)\n\t\t\tuniqErrors[i].Msg = fmt.Sprintf(\"%s: %s\", uniqErrors[i].Pos, uniqErrors[i].Msg)\n\t\t\tuniqErrors[i].Pos = fmt.Sprintf(\"%s:1\", pkg.GoFiles[0])\n\t\t}\n\n\t\t// some errors like \"code in directory  expects import\" don't have Pos, set it here\n\t\tfor i := range uniqErrors {\n\t\t\terr := &uniqErrors[i]\n\t\t\tif err.Pos == \"\" {\n\t\t\t\terr.Pos = fmt.Sprintf(\"%s:1\", pkg.GoFiles[0])\n\t\t\t}\n\t\t}\n\t}\n\n\treturn uniqErrors\n}\n\nfunc extractErrorsImpl(pkg *packages.Package, seenPackages map[*packages.Package]bool) []packages.Error {\n\tif seenPackages[pkg] {\n\t\treturn nil\n\t}\n\tseenPackages[pkg] = true\n\n\tif !pkg.IllTyped { // otherwise, it may take hours to traverse all deps many times\n\t\treturn nil\n\t}\n\n\tif len(pkg.Errors) > 0 {\n\t\treturn pkg.Errors\n\t}\n\n\tvar errors []packages.Error\n\tfor _, iPkg := range pkg.Imports {\n\t\tiPkgErrors := extractErrorsImpl(iPkg, seenPackages)\n\t\tif iPkgErrors != nil {\n\t\t\terrors = append(errors, iPkgErrors...)\n\t\t}\n\t}\n\n\treturn errors\n}\n\nfunc stackCrusher(msg string) string {\n\tindex := strings.Index(msg, \"(\")\n\tlastIndex := strings.LastIndex(msg, \")\")\n\n\tif index == -1 || index == len(msg)-1 || lastIndex == -1 || lastIndex != len(msg)-1 {\n\t\treturn msg\n\t}\n\n\tfrag := msg[index+1 : lastIndex]\n\n\tif !reFile.MatchString(frag) {\n\t\treturn msg\n\t}\n\n\treturn stackCrusher(frag)\n}\n"
  },
  {
    "path": "pkg/goanalysis/pkgerrors/extract_test.go",
    "content": "package pkgerrors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"golang.org/x/tools/go/packages\"\n)\n\nfunc Test_extractErrors(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc string\n\t\tpkg  *packages.Package\n\n\t\texpected []packages.Error\n\t}{\n\t\t{\n\t\t\tdesc: \"package with errors\",\n\t\t\tpkg: &packages.Package{\n\t\t\t\tIllTyped: true,\n\t\t\t\tErrors: []packages.Error{\n\t\t\t\t\t{Pos: \"/home/ldez/sources/golangci/sandbox/main.go:6:11\", Msg: \"test\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []packages.Error{\n\t\t\t\t{Pos: \"/home/ldez/sources/golangci/sandbox/main.go:6:11\", Msg: \"test\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"full error stack deduplication\",\n\t\t\tpkg: &packages.Package{\n\t\t\t\tIllTyped: true,\n\t\t\t\tImports: map[string]*packages.Package{\n\t\t\t\t\t\"test\": {\n\t\t\t\t\t\tIllTyped: true,\n\t\t\t\t\t\tErrors: []packages.Error{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPos:  \"/home/ldez/sources/golangci/sandbox/main.go:6:11\",\n\t\t\t\t\t\t\t\tMsg:  `/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2: /home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2: could not import github.com/golangci/golangci-lint/pkg/lint/lintersdb (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go:13:2: could not import github.com/golangci/golangci-lint/pkg/golinters (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName))`,\n\t\t\t\t\t\t\t\tKind: 3,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPos:  \"/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2\",\n\t\t\t\t\t\t\t\tMsg:  `could not import github.com/golangci/golangci-lint/pkg/lint/lintersdb (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go:13:2: could not import github.com/golangci/golangci-lint/pkg/golinters (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName))`,\n\t\t\t\t\t\t\t\tKind: 3,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPos:  \"/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go:13:2\",\n\t\t\t\t\t\t\t\tMsg:  `could not import github.com/golangci/golangci-lint/pkg/golinters (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName)`,\n\t\t\t\t\t\t\t\tKind: 3,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPos:  \"/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9\",\n\t\t\t\t\t\t\t\tMsg:  `undeclared name: linterName`,\n\t\t\t\t\t\t\t\tKind: 3,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []packages.Error{{\n\t\t\t\tPos:  \"/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9\",\n\t\t\t\tMsg:  \"undeclared name: linterName\",\n\t\t\t\tKind: 3,\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdesc: \"package with import errors but with only one error and without tip error\",\n\t\t\tpkg: &packages.Package{\n\t\t\t\tIllTyped: true,\n\t\t\t\tImports: map[string]*packages.Package{\n\t\t\t\t\t\"test\": {\n\t\t\t\t\t\tIllTyped: true,\n\t\t\t\t\t\tErrors: []packages.Error{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPos:  \"/home/ldez/sources/golangci/sandbox/main.go:6:11\",\n\t\t\t\t\t\t\t\tMsg:  \"could not import github.com/example/foo (main.go:6:2: missing go.sum entry for module providing package github.com/example/foo (imported by github.com/golangci/sandbox); to add:\\n\\tgo get github.com/golangci/sandbox)\",\n\t\t\t\t\t\t\t\tKind: 3,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []packages.Error{{\n\t\t\t\tPos:  \"/home/ldez/sources/golangci/sandbox/main.go:6:11\",\n\t\t\t\tMsg:  \"could not import github.com/example/foo (main.go:6:2: missing go.sum entry for module providing package github.com/example/foo (imported by github.com/golangci/sandbox); to add:\\n\\tgo get github.com/golangci/sandbox)\",\n\t\t\t\tKind: 3,\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdesc: \"package with import errors but without tip error\",\n\t\t\tpkg: &packages.Package{\n\t\t\t\tIllTyped: true,\n\t\t\t\tImports: map[string]*packages.Package{\n\t\t\t\t\t\"test\": {\n\t\t\t\t\t\tIllTyped: true,\n\t\t\t\t\t\tErrors: []packages.Error{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPos:  \"/home/ldez/sources/golangci/sandbox/main.go:6:1\",\n\t\t\t\t\t\t\t\tMsg:  \"foo (/home/ldez/sources/golangci/sandbox/main.go:6:11: could not import github.com/example/foo (main.go:6:2: missing go.sum entry for module providing package github.com/example/foo (imported by github.com/golangci/sandbox); to add:\\n\\tgo get github.com/golangci/sandbox))\",\n\t\t\t\t\t\t\t\tKind: 3,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPos:  \"/home/ldez/sources/golangci/sandbox/main.go:6:11\",\n\t\t\t\t\t\t\t\tMsg:  \"could not import github.com/example/foo (main.go:6:2: missing go.sum entry for module providing package github.com/example/foo (imported by github.com/golangci/sandbox); to add:\\n\\tgo get github.com/golangci/sandbox)\",\n\t\t\t\t\t\t\t\tKind: 3,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []packages.Error{{\n\t\t\t\tPos:  \"/home/ldez/sources/golangci/sandbox/main.go:6:11\",\n\t\t\t\tMsg:  \"could not import github.com/example/foo (main.go:6:2: missing go.sum entry for module providing package github.com/example/foo (imported by github.com/golangci/sandbox); to add:\\n\\tgo get github.com/golangci/sandbox)\",\n\t\t\t\tKind: 3,\n\t\t\t}},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terrors := extractErrors(test.pkg)\n\n\t\t\tassert.Equal(t, test.expected, errors)\n\t\t})\n\t}\n}\n\nfunc Test_stackCrusher(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tstack    string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"large stack\",\n\t\t\tstack:    `/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2: /home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2: could not import github.com/golangci/golangci-lint/pkg/lint/lintersdb (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go:13:2: could not import github.com/golangci/golangci-lint/pkg/golinters (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName))`,\n\t\t\texpected: \"/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"no stack\",\n\t\t\tstack:    `/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:45:3: undeclared name: linterName`,\n\t\t\texpected: \"/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:45:3: undeclared name: linterName\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"no stack but message with parenthesis\",\n\t\t\tstack:    `/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:20:32: cannot use mu (variable of type sync.Mutex) as goanalysis.Issue value in argument to append`,\n\t\t\texpected: \"/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:20:32: cannot use mu (variable of type sync.Mutex) as goanalysis.Issue value in argument to append\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"stack with message with parenthesis at the end\",\n\t\t\tstack:    `/home/username/childapp/interfaces/IPanel.go:4:2: could not import github.com/gotk3/gotk3/gtk (/home/username/childapp/vendor/github.com/gotk3/gotk3/gtk/aboutdialog.go:5:8: could not import C (cgo preprocessing failed))`,\n\t\t\texpected: \"/home/username/childapp/vendor/github.com/gotk3/gotk3/gtk/aboutdialog.go:5:8: could not import C (cgo preprocessing failed)\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"no stack but message with parenthesis at the end\",\n\t\t\tstack:    `/home/ldez/sources/go/src/github.com/golangci/sandbox/main.go:11:17: ui.test undefined (type App has no field or method test)`,\n\t\t\texpected: \"/home/ldez/sources/go/src/github.com/golangci/sandbox/main.go:11:17: ui.test undefined (type App has no field or method test)\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tactual := stackCrusher(test.stack)\n\n\t\t\tassert.Equal(t, test.expected, actual)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/goanalysis/pkgerrors/parse.go",
    "content": "package pkgerrors\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"go/token\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc parseError(srcErr packages.Error) (*result.Issue, error) {\n\tpos, err := parseErrorPosition(srcErr.Pos)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &result.Issue{\n\t\tPos:        *pos,\n\t\tText:       srcErr.Msg,\n\t\tFromLinter: \"typecheck\",\n\t}, nil\n}\n\nfunc parseErrorPosition(pos string) (*token.Position, error) {\n\t// file:line(<optional>:column)\n\tparts := strings.Split(pos, \":\")\n\tif len(parts) == 1 {\n\t\treturn nil, errors.New(\"no colons\")\n\t}\n\n\tfile := parts[0]\n\tline, err := strconv.Atoi(parts[1])\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't parse line number %q: %w\", parts[1], err)\n\t}\n\n\tvar column int\n\tif len(parts) == 3 { // got column\n\t\tcolumn, err = strconv.Atoi(parts[2])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to parse column from %q: %w\", parts[2], err)\n\t\t}\n\t}\n\n\treturn &token.Position{\n\t\tFilename: file,\n\t\tLine:     line,\n\t\tColumn:   column,\n\t}, nil\n}\n"
  },
  {
    "path": "pkg/goanalysis/pkgerrors/parse_test.go",
    "content": "package pkgerrors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"golang.org/x/tools/go/packages\"\n)\n\nfunc Test_parseError(t *testing.T) {\n\tcases := []struct {\n\t\tin, out string\n\t\tgood    bool\n\t}{\n\t\t{\"f.go:1:2\", \"\", true},\n\t\t{\"f.go:1\", \"\", true},\n\t\t{\"f.go\", \"\", false},\n\t\t{\"f.go: 1\", \"\", false},\n\t}\n\n\tfor _, c := range cases {\n\t\ti, _ := parseError(packages.Error{\n\t\t\tPos: c.in,\n\t\t\tMsg: \"msg\",\n\t\t})\n\t\tif !c.good {\n\t\t\tassert.Nil(t, i)\n\t\t\tcontinue\n\t\t}\n\n\t\tassert.NotNil(t, i)\n\n\t\tpos := fmt.Sprintf(\"%s:%d\", i.FilePath(), i.Line())\n\t\tif i.Pos.Column != 0 {\n\t\t\tpos += fmt.Sprintf(\":%d\", i.Pos.Column)\n\t\t}\n\t\tout := pos\n\t\texpOut := c.out\n\t\tif expOut == \"\" {\n\t\t\texpOut = c.in\n\t\t}\n\t\tassert.Equal(t, expOut, out)\n\n\t\tassert.Equal(t, \"typecheck\", i.FromLinter)\n\t\tassert.Equal(t, \"msg\", i.Text)\n\t}\n}\n"
  },
  {
    "path": "pkg/goanalysis/position.go",
    "content": "package goanalysis\n\nimport (\n\t\"go/ast\"\n\t\"go/token\"\n\t\"path/filepath\"\n\n\t\"golang.org/x/tools/go/analysis\"\n)\n\nfunc GetGoFilePosition(pass *analysis.Pass, f *ast.File) (token.Position, bool) {\n\tposition := GetFilePositionFor(pass.Fset, f.Pos())\n\n\tif filepath.Ext(position.Filename) == \".go\" {\n\t\treturn position, true\n\t}\n\n\treturn position, false\n}\n\nfunc GetFilePositionFor(fset *token.FileSet, p token.Pos) token.Position {\n\tpos := fset.PositionFor(p, true)\n\n\text := filepath.Ext(pos.Filename)\n\tif ext != \".go\" {\n\t\t// position has been adjusted to a non-go file, revert to original file\n\t\treturn fset.PositionFor(p, false)\n\t}\n\n\treturn pos\n}\n\nfunc EndOfLinePos(f *token.File, line int) token.Pos {\n\tvar end token.Pos\n\n\tif line >= f.LineCount() {\n\t\t// missing newline at the end of the file\n\t\tend = f.Pos(f.Size())\n\t} else {\n\t\tend = f.LineStart(line+1) - token.Pos(1)\n\t}\n\n\treturn end\n}\n\n// AdjustPos is a hack to get the right line to display.\n// It should not be used outside some specific cases.\nfunc AdjustPos(line, nonAdjLine, adjLine int) int {\n\treturn line + nonAdjLine - adjLine\n}\n"
  },
  {
    "path": "pkg/goanalysis/runner.go",
    "content": "// Package goanalysis defines the implementation of the checker commands.\n// The same code drives the multi-analysis driver, the single-analysis\n// driver that is conventionally provided for convenience along with\n// each analysis package, and the test driver.\npackage goanalysis\n\nimport (\n\t\"context\"\n\t\"encoding/gob\"\n\t\"fmt\"\n\t\"go/token\"\n\t\"maps\"\n\t\"runtime\"\n\t\"slices\"\n\t\"sync\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/cache\"\n\t\"github.com/golangci/golangci-lint/v2/internal/errorutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/load\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/timeutils\"\n)\n\nvar (\n\tdebugf = logutils.Debug(logutils.DebugKeyGoAnalysis)\n\n\tanalyzeDebugf     = logutils.Debug(logutils.DebugKeyGoAnalysisAnalyze)\n\tisMemoryDebug     = logutils.HaveDebugTag(logutils.DebugKeyGoAnalysisMemory)\n\tissuesCacheDebugf = logutils.Debug(logutils.DebugKeyGoAnalysisIssuesCache)\n\n\tfactsDebugf        = logutils.Debug(logutils.DebugKeyGoAnalysisFacts)\n\tfactsCacheDebugf   = logutils.Debug(logutils.DebugKeyGoAnalysisFactsCache)\n\tfactsInheritDebugf = logutils.Debug(logutils.DebugKeyGoAnalysisFactsInherit)\n\tfactsExportDebugf  = logutils.Debug(logutils.DebugKeyGoAnalysisFacts)\n\tisFactsExportDebug = logutils.HaveDebugTag(logutils.DebugKeyGoAnalysisFactsExport)\n)\n\ntype Diagnostic struct {\n\tanalysis.Diagnostic\n\tAnalyzer *analysis.Analyzer\n\tPosition token.Position\n\tPkg      *packages.Package\n\tFile     *token.File\n}\n\ntype runner struct {\n\tlog            logutils.Log\n\tprefix         string // ensure unique analyzer names\n\tpkgCache       *cache.Cache\n\tloadGuard      *load.Guard\n\tloadMode       LoadMode\n\tpassToPkg      map[*analysis.Pass]*packages.Package\n\tpassToPkgGuard sync.Mutex\n\tsw             *timeutils.Stopwatch\n}\n\nfunc newRunner(prefix string, logger logutils.Log, pkgCache *cache.Cache, loadGuard *load.Guard,\n\tloadMode LoadMode, sw *timeutils.Stopwatch,\n) *runner {\n\treturn &runner{\n\t\tprefix:    prefix,\n\t\tlog:       logger,\n\t\tpkgCache:  pkgCache,\n\t\tloadGuard: loadGuard,\n\t\tloadMode:  loadMode,\n\t\tpassToPkg: map[*analysis.Pass]*packages.Package{},\n\t\tsw:        sw,\n\t}\n}\n\n// Run loads the packages specified by args using go/packages,\n// then applies the specified analyzers to them.\n// Analysis flags must already have been set.\n// It provides most of the logic for the main functions of both the\n// singlechecker and the multi-analysis commands.\n// It returns the appropriate exit code.\nfunc (r *runner) run(analyzers []*analysis.Analyzer, initialPackages []*packages.Package) ([]*Diagnostic,\n\t[]error, map[*analysis.Pass]*packages.Package,\n) {\n\tdebugf(\"Analyzing %d packages on load mode %s\", len(initialPackages), r.loadMode)\n\n\troots := r.analyze(initialPackages, analyzers)\n\n\tdiags, errs := extractDiagnostics(roots)\n\n\treturn diags, errs, r.passToPkg\n}\n\ntype actKey struct {\n\t*analysis.Analyzer\n\t*packages.Package\n}\n\nfunc (r *runner) markAllActions(a *analysis.Analyzer, pkg *packages.Package, markedActions map[actKey]struct{}) {\n\tk := actKey{a, pkg}\n\tif _, ok := markedActions[k]; ok {\n\t\treturn\n\t}\n\n\tfor _, req := range a.Requires {\n\t\tr.markAllActions(req, pkg, markedActions)\n\t}\n\n\tif len(a.FactTypes) != 0 {\n\t\tfor path := range pkg.Imports {\n\t\t\tr.markAllActions(a, pkg.Imports[path], markedActions)\n\t\t}\n\t}\n\n\tmarkedActions[k] = struct{}{}\n}\n\nfunc (r *runner) makeAction(a *analysis.Analyzer, pkg *packages.Package,\n\tinitialPkgs map[*packages.Package]bool, actions map[actKey]*action, actAlloc *actionAllocator,\n) *action {\n\tk := actKey{a, pkg}\n\tact, ok := actions[k]\n\tif ok {\n\t\treturn act\n\t}\n\n\tact = actAlloc.alloc()\n\tact.Analyzer = a\n\tact.Package = pkg\n\tact.runner = r\n\tact.isInitialPkg = initialPkgs[pkg]\n\tact.needAnalyzeSource = initialPkgs[pkg]\n\tact.analysisDoneCh = make(chan struct{})\n\n\tdepsCount := len(a.Requires)\n\tif len(a.FactTypes) > 0 {\n\t\tdepsCount += len(pkg.Imports)\n\t}\n\tact.Deps = make([]*action, 0, depsCount)\n\n\t// Add a dependency on each required analyzers.\n\tfor _, req := range a.Requires {\n\t\tact.Deps = append(act.Deps, r.makeAction(req, pkg, initialPkgs, actions, actAlloc))\n\t}\n\n\tr.buildActionFactDeps(act, a, pkg, initialPkgs, actions, actAlloc)\n\n\tactions[k] = act\n\n\treturn act\n}\n\nfunc (r *runner) buildActionFactDeps(act *action, a *analysis.Analyzer, pkg *packages.Package,\n\tinitialPkgs map[*packages.Package]bool, actions map[actKey]*action, actAlloc *actionAllocator,\n) {\n\t// An analysis that consumes/produces facts\n\t// must run on the package's dependencies too.\n\tif len(a.FactTypes) == 0 {\n\t\treturn\n\t}\n\n\tact.objectFacts = make(map[objectFactKey]analysis.Fact)\n\tact.packageFacts = make(map[packageFactKey]analysis.Fact)\n\n\tpaths := slices.Sorted(maps.Keys(pkg.Imports)) // for determinism\n\n\tfor _, path := range paths {\n\t\tdep := r.makeAction(a, pkg.Imports[path], initialPkgs, actions, actAlloc)\n\t\tact.Deps = append(act.Deps, dep)\n\t}\n\n\t// Need to register fact types for pkgcache proper gob encoding.\n\tfor _, f := range a.FactTypes {\n\t\tgob.Register(f)\n\t}\n}\n\nfunc (r *runner) prepareAnalysis(pkgs []*packages.Package,\n\tanalyzers []*analysis.Analyzer,\n) (initialPkgs map[*packages.Package]bool, allActions, roots []*action) {\n\t// Construct the action graph.\n\n\t// Each graph node (action) is one unit of analysis.\n\t// Edges express package-to-package (vertical) dependencies,\n\t// and analysis-to-analysis (horizontal) dependencies.\n\n\t// This place is memory-intensive: e.g. Istio project has 120k total actions.\n\t// Therefore, optimize it carefully.\n\tmarkedActions := make(map[actKey]struct{}, len(analyzers)*len(pkgs))\n\tfor _, a := range analyzers {\n\t\tfor _, pkg := range pkgs {\n\t\t\tr.markAllActions(a, pkg, markedActions)\n\t\t}\n\t}\n\ttotalActionsCount := len(markedActions)\n\n\tactions := make(map[actKey]*action, totalActionsCount)\n\tactAlloc := newActionAllocator(totalActionsCount)\n\n\tinitialPkgs = make(map[*packages.Package]bool, len(pkgs))\n\tfor _, pkg := range pkgs {\n\t\tinitialPkgs[pkg] = true\n\t}\n\n\t// Build nodes for initial packages.\n\troots = make([]*action, 0, len(pkgs)*len(analyzers))\n\tfor _, a := range analyzers {\n\t\tfor _, pkg := range pkgs {\n\t\t\troot := r.makeAction(a, pkg, initialPkgs, actions, actAlloc)\n\t\t\troot.IsRoot = true\n\t\t\troots = append(roots, root)\n\t\t}\n\t}\n\n\tallActions = slices.Collect(maps.Values(actions))\n\n\tdebugf(\"Built %d actions\", len(actions))\n\n\treturn initialPkgs, allActions, roots\n}\n\nfunc (r *runner) analyze(pkgs []*packages.Package, analyzers []*analysis.Analyzer) []*action {\n\tinitialPkgs, actions, rootActions := r.prepareAnalysis(pkgs, analyzers)\n\n\tactionPerPkg := map[*packages.Package][]*action{}\n\tfor _, act := range actions {\n\t\tactionPerPkg[act.Package] = append(actionPerPkg[act.Package], act)\n\t}\n\n\t// Fill Imports field.\n\tloadingPackages := map[*packages.Package]*loadingPackage{}\n\tvar dfs func(pkg *packages.Package)\n\tdfs = func(pkg *packages.Package) {\n\t\tif loadingPackages[pkg] != nil {\n\t\t\treturn\n\t\t}\n\n\t\timports := map[string]*loadingPackage{}\n\t\tfor impPath, imp := range pkg.Imports {\n\t\t\tdfs(imp)\n\t\t\timpLp := loadingPackages[imp]\n\t\t\timpLp.dependents++\n\t\t\timports[impPath] = impLp\n\t\t}\n\n\t\tloadingPackages[pkg] = &loadingPackage{\n\t\t\tpkg:        pkg,\n\t\t\timports:    imports,\n\t\t\tisInitial:  initialPkgs[pkg],\n\t\t\tlog:        r.log,\n\t\t\tactions:    actionPerPkg[pkg],\n\t\t\tloadGuard:  r.loadGuard,\n\t\t\tdependents: 1, // self dependent\n\t\t}\n\t}\n\tfor _, act := range actions {\n\t\tdfs(act.Package)\n\t}\n\n\t// Limit memory and IO usage.\n\tgomaxprocs := runtime.GOMAXPROCS(-1)\n\tdebugf(\"Analyzing at most %d packages in parallel\", gomaxprocs)\n\n\tloadSem := make(chan struct{}, gomaxprocs)\n\n\tdebugf(\"There are %d initial and %d total packages\", len(initialPkgs), len(loadingPackages))\n\n\tctx, cancel := context.WithCancel(context.Background())\n\tdefer cancel()\n\n\tvar wg sync.WaitGroup\n\n\tfor _, lp := range loadingPackages {\n\t\tif lp.isInitial {\n\t\t\twg.Go(func() {\n\t\t\t\tlp.analyzeRecursive(ctx, cancel, r.loadMode, loadSem)\n\t\t\t})\n\t\t}\n\t}\n\n\twg.Wait()\n\n\treturn rootActions\n}\n\nfunc extractDiagnostics(roots []*action) (retDiags []*Diagnostic, retErrors []error) {\n\textracted := make(map[*action]bool)\n\tvar extract func(*action)\n\tvar visitAll func(actions []*action)\n\tvisitAll = func(actions []*action) {\n\t\tfor _, act := range actions {\n\t\t\tif !extracted[act] {\n\t\t\t\textracted[act] = true\n\t\t\t\tvisitAll(act.Deps)\n\t\t\t\textract(act)\n\t\t\t}\n\t\t}\n\t}\n\n\t// De-duplicate diagnostics by position (not token.Pos) to\n\t// avoid double-reporting in source files that belong to\n\t// multiple packages, such as foo and foo.test.\n\ttype key struct {\n\t\ttoken.Position\n\t\t*analysis.Analyzer\n\t\tmessage string\n\t}\n\tseen := make(map[key]bool)\n\n\textract = func(act *action) {\n\t\tif act.Err != nil {\n\t\t\tif pe, ok := act.Err.(*errorutil.PanicError); ok {\n\t\t\t\tpanic(pe)\n\t\t\t}\n\t\t\tretErrors = append(retErrors, fmt.Errorf(\"%s: %w\", act.Analyzer.Name, act.Err))\n\t\t\treturn\n\t\t}\n\n\t\tif act.IsRoot {\n\t\t\tfor _, diag := range act.Diagnostics {\n\t\t\t\t// We don't display a.Name/f.Category\n\t\t\t\t// as most users don't care.\n\n\t\t\t\tposition := GetFilePositionFor(act.Package.Fset, diag.Pos)\n\t\t\t\tfile := act.Package.Fset.File(diag.Pos)\n\n\t\t\t\tk := key{Position: position, Analyzer: act.Analyzer, message: diag.Message}\n\t\t\t\tif seen[k] {\n\t\t\t\t\tcontinue // duplicate\n\t\t\t\t}\n\t\t\t\tseen[k] = true\n\n\t\t\t\tretDiag := &Diagnostic{\n\t\t\t\t\tFile:       file,\n\t\t\t\t\tDiagnostic: diag,\n\t\t\t\t\tAnalyzer:   act.Analyzer,\n\t\t\t\t\tPosition:   position,\n\t\t\t\t\tPkg:        act.Package,\n\t\t\t\t}\n\t\t\t\tretDiags = append(retDiags, retDiag)\n\t\t\t}\n\t\t}\n\t}\n\tvisitAll(roots)\n\treturn retDiags, retErrors\n}\n"
  },
  {
    "path": "pkg/goanalysis/runner_action.go",
    "content": "package goanalysis\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"runtime/debug\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/errorutil\"\n)\n\ntype actionAllocator struct {\n\tallocatedActions []action\n\tnextFreeIndex    int\n}\n\nfunc newActionAllocator(maxCount int) *actionAllocator {\n\treturn &actionAllocator{\n\t\tallocatedActions: make([]action, maxCount),\n\t\tnextFreeIndex:    0,\n\t}\n}\n\nfunc (actAlloc *actionAllocator) alloc() *action {\n\tif actAlloc.nextFreeIndex == len(actAlloc.allocatedActions) {\n\t\tpanic(fmt.Sprintf(\"Made too many allocations of actions: %d allowed\", len(actAlloc.allocatedActions)))\n\t}\n\tact := &actAlloc.allocatedActions[actAlloc.nextFreeIndex]\n\tactAlloc.nextFreeIndex++\n\treturn act\n}\n\nfunc (act *action) waitUntilDependingAnalyzersWorked(ctx context.Context) {\n\tfor _, dep := range act.Deps {\n\t\tif dep.Package == act.Package {\n\t\t\tselect {\n\t\t\tcase <-ctx.Done():\n\t\t\t\treturn\n\t\t\tcase <-dep.analysisDoneCh:\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (act *action) analyzeSafe() {\n\tdefer func() {\n\t\tif p := recover(); p != nil {\n\t\t\tif !act.IsRoot {\n\t\t\t\t// This line allows to display \"hidden\" panic with analyzers like buildssa.\n\t\t\t\t// Some linters are dependent of sub-analyzers but when a sub-analyzer fails the linter is not aware of that,\n\t\t\t\t// this results to another panic (ex: \"interface conversion: interface {} is nil, not *buildssa.SSA\").\n\t\t\t\tact.runner.log.Errorf(\"%s: panic during analysis: %v, %s\", act.Analyzer.Name, p, string(debug.Stack()))\n\t\t\t}\n\n\t\t\tact.Err = errorutil.NewPanicError(fmt.Sprintf(\"%s: package %q (isInitialPkg: %t, needAnalyzeSource: %t): %s\",\n\t\t\t\tact.Analyzer.Name, act.Package.Name, act.isInitialPkg, act.needAnalyzeSource, p), debug.Stack())\n\t\t}\n\t}()\n\n\tact.runner.sw.TrackStage(act.Analyzer.Name, act.analyze)\n}\n\nfunc (act *action) markDepsForAnalyzingSource() {\n\t// Horizontal deps (analyzer.Requires) must be loaded from source and analyzed before analyzing\n\t// this action.\n\tfor _, dep := range act.Deps {\n\t\tif dep.Package == act.Package && !dep.needAnalyzeSource {\n\t\t\t// Analyze source only for horizontal dependencies, e.g. from \"buildssa\".\n\t\t\tdep.needAnalyzeSource = true // can't be set in parallel\n\t\t\tdep.markDepsForAnalyzingSource()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/goanalysis/runner_action_cache.go",
    "content": "package goanalysis\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/types/objectpath\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/cache\"\n)\n\ntype Fact struct {\n\tPath string // non-empty only for object facts\n\tFact analysis.Fact\n}\n\nfunc (act *action) loadCachedFacts() bool {\n\tif act.loadCachedFactsDone { // can't be set in parallel\n\t\treturn act.loadCachedFactsOk\n\t}\n\n\tres := func() bool {\n\t\tif act.isInitialPkg {\n\t\t\treturn true // load cached facts only for non-initial packages\n\t\t}\n\n\t\tif len(act.Analyzer.FactTypes) == 0 {\n\t\t\treturn true // no need to load facts\n\t\t}\n\n\t\treturn act.loadPersistedFacts()\n\t}()\n\tact.loadCachedFactsDone = true\n\tact.loadCachedFactsOk = res\n\treturn res\n}\n\nfunc (act *action) persistFactsToCache() error {\n\tanalyzer := act.Analyzer\n\tif len(analyzer.FactTypes) == 0 {\n\t\treturn nil\n\t}\n\n\t// Merge new facts into the package and persist them.\n\tvar facts []Fact\n\tfor key, fact := range act.packageFacts {\n\t\tif key.pkg != act.Package.Types {\n\t\t\t// The fact is from inherited facts from another package\n\t\t\tcontinue\n\t\t}\n\t\tfacts = append(facts, Fact{\n\t\t\tPath: \"\",\n\t\t\tFact: fact,\n\t\t})\n\t}\n\tfor key, fact := range act.objectFacts {\n\t\tobj := key.obj\n\t\tif obj.Pkg() != act.Package.Types {\n\t\t\t// The fact is from inherited facts from another package\n\t\t\tcontinue\n\t\t}\n\n\t\tpath, err := objectpath.For(obj)\n\t\tif err != nil {\n\t\t\t// The object is not globally addressable\n\t\t\tcontinue\n\t\t}\n\n\t\tfacts = append(facts, Fact{\n\t\t\tPath: string(path),\n\t\t\tFact: fact,\n\t\t})\n\t}\n\n\tfactsCacheDebugf(\"Caching %d facts for package %q and analyzer %s\", len(facts), act.Package.Name, act.Analyzer.Name)\n\n\treturn act.runner.pkgCache.Put(act.Package, cache.HashModeNeedAllDeps, factCacheKey(analyzer), facts)\n}\n\nfunc (act *action) loadPersistedFacts() bool {\n\tvar facts []Fact\n\n\terr := act.runner.pkgCache.Get(act.Package, cache.HashModeNeedAllDeps, factCacheKey(act.Analyzer), &facts)\n\tif err != nil {\n\t\tif !errors.Is(err, cache.ErrMissing) && !errors.Is(err, io.EOF) {\n\t\t\tact.runner.log.Warnf(\"Failed to get persisted facts: %s\", err)\n\t\t}\n\n\t\tfactsCacheDebugf(\"No cached facts for package %q and analyzer %s\", act.Package.Name, act.Analyzer.Name)\n\t\treturn false\n\t}\n\n\tfactsCacheDebugf(\"Loaded %d cached facts for package %q and analyzer %s\", len(facts), act.Package.Name, act.Analyzer.Name)\n\n\tfor _, f := range facts {\n\t\tif f.Path == \"\" { // this is a package fact\n\t\t\tkey := packageFactKey{pkg: act.Package.Types, typ: act.factType(f.Fact)}\n\t\t\tact.packageFacts[key] = f.Fact\n\t\t\tcontinue\n\t\t}\n\t\tobj, err := objectpath.Object(act.Package.Types, objectpath.Path(f.Path))\n\t\tif err != nil {\n\t\t\t// Be lenient about these errors.\n\t\t\t// For example, when analyzing io/ioutil from source,\n\t\t\t// we may get a fact for methods on the devNull type,\n\t\t\t// and objectpath will happily create a path for them.\n\t\t\t// However,\n\t\t\t// when we later load io/ioutil from export data,\n\t\t\t// the path no longer resolves.\n\t\t\t//\n\t\t\t// If an exported type embeds the unexported type,\n\t\t\t// then (part of) the unexported type will become part of the type information and our path will resolve again.\n\t\t\tcontinue\n\t\t}\n\t\tfactKey := objectFactKey{obj, act.factType(f.Fact)}\n\t\tact.objectFacts[factKey] = f.Fact\n\t}\n\n\treturn true\n}\n\nfunc factCacheKey(a *analysis.Analyzer) string {\n\treturn fmt.Sprintf(\"%s/facts\", a.Name)\n}\n"
  },
  {
    "path": "pkg/goanalysis/runner_action_test.go",
    "content": "package goanalysis\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"golang.org/x/tools/go/packages\"\n)\n\nfunc Test_action_markDepsForAnalyzingSource(t *testing.T) {\n\tt.Run(\"marks direct horizontal deps\", func(t *testing.T) {\n\t\tpkg := &packages.Package{PkgPath: \"pkg/a\"}\n\n\t\tdep := &action{Package: pkg}\n\t\tact := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep},\n\t\t}\n\n\t\tact.markDepsForAnalyzingSource()\n\n\t\tassert.True(t, dep.needAnalyzeSource)\n\t})\n\n\tt.Run(\"marks transitive horizontal deps\", func(t *testing.T) {\n\t\tpkg := &packages.Package{PkgPath: \"pkg/a\"}\n\n\t\t// Chain: act -> dep1 -> dep2\n\t\tdep2 := &action{Package: pkg}\n\t\tdep1 := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep2},\n\t\t}\n\t\tact := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep1},\n\t\t}\n\n\t\tact.markDepsForAnalyzingSource()\n\n\t\tassert.True(t, dep1.needAnalyzeSource)\n\t\tassert.True(t, dep2.needAnalyzeSource)\n\t})\n\n\tt.Run(\"marks deep transitive horizontal deps\", func(t *testing.T) {\n\t\tpkg := &packages.Package{PkgPath: \"pkg/a\"}\n\n\t\t// Chain: act -> dep1 -> dep2 -> dep3 (simulates nilaway -> buildssa -> ctrlflow -> inspect)\n\t\tdep3 := &action{Package: pkg}\n\t\tdep2 := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep3},\n\t\t}\n\t\tdep1 := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep2},\n\t\t}\n\t\tact := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep1},\n\t\t}\n\n\t\tact.markDepsForAnalyzingSource()\n\n\t\tassert.True(t, dep1.needAnalyzeSource)\n\t\tassert.True(t, dep2.needAnalyzeSource)\n\t\tassert.True(t, dep3.needAnalyzeSource)\n\t})\n\n\tt.Run(\"does not mark cross-package deps\", func(t *testing.T) {\n\t\tpkgA := &packages.Package{PkgPath: \"pkg/a\"}\n\t\tpkgB := &packages.Package{PkgPath: \"pkg/b\"}\n\n\t\tdep := &action{Package: pkgB}\n\t\tact := &action{\n\t\t\tPackage: pkgA,\n\t\t\tDeps:    []*action{dep},\n\t\t}\n\n\t\tact.markDepsForAnalyzingSource()\n\n\t\tassert.False(t, dep.needAnalyzeSource)\n\t})\n\n\tt.Run(\"handles cycles without infinite recursion\", func(t *testing.T) {\n\t\tpkg := &packages.Package{PkgPath: \"pkg/a\"}\n\n\t\tdep1 := &action{Package: pkg}\n\t\tdep2 := &action{Package: pkg}\n\n\t\tdep1.Deps = []*action{dep2}\n\t\tdep2.Deps = []*action{dep1}\n\n\t\tact := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep1},\n\t\t}\n\n\t\t// Should not hang or panic\n\t\tact.markDepsForAnalyzingSource()\n\n\t\tassert.True(t, dep1.needAnalyzeSource)\n\t\tassert.True(t, dep2.needAnalyzeSource)\n\t})\n\n\tt.Run(\"skips already marked deps\", func(t *testing.T) {\n\t\tpkg := &packages.Package{PkgPath: \"pkg/a\"}\n\n\t\tdep := &action{\n\t\t\tPackage:           pkg,\n\t\t\tneedAnalyzeSource: true, // already marked\n\t\t}\n\t\tact := &action{\n\t\t\tPackage: pkg,\n\t\t\tDeps:    []*action{dep},\n\t\t}\n\n\t\t// Should not recurse into already-marked dep\n\t\tact.markDepsForAnalyzingSource()\n\n\t\tassert.True(t, dep.needAnalyzeSource)\n\t})\n}\n"
  },
  {
    "path": "pkg/goanalysis/runner_checker.go",
    "content": "// Copyright 2018 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n//\n// Altered copy of https://github.com/golang/tools/blob/v0.43.0/go/analysis/checker/checker.go\n\npackage goanalysis\n\nimport (\n\t\"bytes\"\n\t\"encoding/gob\"\n\t\"errors\"\n\t\"fmt\"\n\t\"go/types\"\n\t\"os\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/x/tools/driverutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/pkgerrors\"\n)\n\n// NOTE(ldez) altered: custom fields; remove 'once' and 'duration'.\n// An action represents one unit of analysis work: the application of\n// one analysis to one package. Actions form a DAG, both within a\n// package (as different analyzers are applied, either in sequence or\n// parallel), and across packages (as dependencies are analyzed).\ntype action struct {\n\tAnalyzer    *analysis.Analyzer\n\tPackage     *packages.Package\n\tIsRoot      bool // whether this is a root node of the graph\n\tDeps        []*action\n\tResult      any   // computed result of Analyzer.run, if any (and if IsRoot)\n\tErr         error // error result of Analyzer.run\n\tDiagnostics []analysis.Diagnostic\n\tDuration    time.Duration // execution time of this step\n\n\tpass         *analysis.Pass\n\tobjectFacts  map[objectFactKey]analysis.Fact\n\tpackageFacts map[packageFactKey]analysis.Fact\n\n\t// NOTE(ldez) custom fields.\n\trunner              *runner\n\tanalysisDoneCh      chan struct{}\n\tloadCachedFactsDone bool\n\tloadCachedFactsOk   bool\n\tisInitialPkg        bool\n\tneedAnalyzeSource   bool\n}\n\n// NOTE(ldez) no alteration.\ntype objectFactKey struct {\n\tobj types.Object\n\ttyp reflect.Type\n}\n\n// NOTE(ldez) no alteration.\ntype packageFactKey struct {\n\tpkg *types.Package\n\ttyp reflect.Type\n}\n\n// NOTE(ldez) no alteration.\nfunc (act *action) String() string {\n\treturn fmt.Sprintf(\"%s@%s\", act.Analyzer, act.Package)\n}\n\n// NOTE(ldez) altered version of `func (act *action) execOnce()`.\nfunc (act *action) analyze() {\n\tdefer close(act.analysisDoneCh) // unblock actions depending on this action\n\n\tif !act.needAnalyzeSource {\n\t\treturn\n\t}\n\n\t// Record time spent in this node but not its dependencies.\n\t// In parallel mode, due to GC/scheduler contention, the\n\t// time is 5x higher than in sequential mode, even with a\n\t// semaphore limiting the number of threads here.\n\t// So use -debug=tp.\n\tt0 := time.Now()\n\tdefer func() {\n\t\tact.Duration = time.Since(t0)\n\t\tanalyzeDebugf(\"go/analysis: %s: %s: analyzed package %q in %s\", act.runner.prefix, act.Analyzer.Name, act.Package.Name, time.Since(t0))\n\t}()\n\n\t// Report an error if any dependency failures.\n\tvar depErrors error\n\tfor _, dep := range act.Deps {\n\t\tif dep.Err != nil {\n\t\t\tdepErrors = errors.Join(depErrors, errors.Unwrap(dep.Err))\n\t\t}\n\t}\n\tif depErrors != nil {\n\t\tact.Err = fmt.Errorf(\"failed prerequisites: %w\", depErrors)\n\t\treturn\n\t}\n\n\t// Plumb the output values of the dependencies\n\t// into the inputs of this action.  Also facts.\n\tinputs := make(map[*analysis.Analyzer]any)\n\tact.objectFacts = make(map[objectFactKey]analysis.Fact)\n\tact.packageFacts = make(map[packageFactKey]analysis.Fact)\n\tfor _, dep := range act.Deps {\n\t\tif dep.Package == act.Package {\n\t\t\t// Same package, different analysis (horizontal edge):\n\t\t\t// in-memory outputs of prerequisite analyzers\n\t\t\t// become inputs to this analysis pass.\n\t\t\tinputs[dep.Analyzer] = dep.Result\n\n\t\t} else if dep.Analyzer == act.Analyzer { // (always true)\n\t\t\t// Same analysis, different package (vertical edge):\n\t\t\t// serialized facts produced by prerequisite analysis\n\t\t\t// become available to this analysis pass.\n\t\t\tinheritFacts(act, dep)\n\t\t}\n\t}\n\n\t// NOTE(ldez) this is not compatible with our implementation.\n\t// Quick (nonexhaustive) check that the correct go/packages mode bits were used.\n\t// (If there were errors, all bets are off.)\n\t// if pkg := act.Package; pkg.Errors == nil {\n\t// \tif pkg.Name == \"\" || pkg.PkgPath == \"\" || pkg.Types == nil || pkg.Fset == nil || pkg.TypesSizes == nil {\n\t// \t\tpanic(fmt.Sprintf(\"packages must be loaded with packages.LoadSyntax mode: Name: %v, PkgPath: %v, Types: %v, Fset: %v, TypesSizes: %v\",\n\t// \t\t\tpkg.Name == \"\", pkg.PkgPath == \"\", pkg.Types == nil, pkg.Fset == nil, pkg.TypesSizes == nil))\n\t// \t}\n\t// }\n\n\tfactsDebugf(\"%s: Inherited facts in %s\", act, time.Since(t0))\n\n\tmodule := &analysis.Module{} // possibly empty (non nil) in go/analysis drivers.\n\tif mod := act.Package.Module; mod != nil {\n\t\tmodule = analysisModuleFromPackagesModule(mod)\n\t}\n\n\t// Run the analysis.\n\tpass := &analysis.Pass{\n\t\tAnalyzer:     act.Analyzer,\n\t\tFset:         act.Package.Fset,\n\t\tFiles:        act.Package.Syntax,\n\t\tOtherFiles:   act.Package.OtherFiles,\n\t\tIgnoredFiles: act.Package.IgnoredFiles,\n\t\tPkg:          act.Package.Types,\n\t\tTypesInfo:    act.Package.TypesInfo,\n\t\tTypesSizes:   act.Package.TypesSizes,\n\t\tTypeErrors:   act.Package.TypeErrors,\n\t\tModule:       module,\n\n\t\tResultOf:          inputs,\n\t\tReport:            func(d analysis.Diagnostic) { act.Diagnostics = append(act.Diagnostics, d) },\n\t\tImportObjectFact:  act.ObjectFact,\n\t\tExportObjectFact:  act.exportObjectFact,\n\t\tImportPackageFact: act.PackageFact,\n\t\tExportPackageFact: act.exportPackageFact,\n\t\tAllObjectFacts:    act.AllObjectFacts,\n\t\tAllPackageFacts:   act.AllPackageFacts,\n\t}\n\tpass.ReadFile = driverutil.CheckedReadFile(pass, os.ReadFile)\n\tact.pass = pass\n\n\tact.runner.passToPkgGuard.Lock()\n\tact.runner.passToPkg[pass] = act.Package\n\tact.runner.passToPkgGuard.Unlock()\n\n\tact.Result, act.Err = func() (any, error) {\n\t\t// NOTE(golangci-lint):\n\t\t// It looks like there should be !pass.Analyzer.RunDespiteErrors\n\t\t// but govet's cgocall crashes on it.\n\t\t// Govet itself contains !pass.Analyzer.RunDespiteErrors condition here,\n\t\t// but it exits before it if packages.Load have failed.\n\t\tif act.Package.IllTyped {\n\t\t\treturn nil, fmt.Errorf(\"analysis skipped: %w\", &pkgerrors.IllTypedError{Pkg: act.Package})\n\t\t}\n\n\t\tt1 := time.Now()\n\n\t\tresult, err := pass.Analyzer.Run(pass)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tanalyzedIn := time.Since(t1)\n\t\tif analyzedIn > 10*time.Millisecond {\n\t\t\tdebugf(\"%s: run analyzer in %s\", act, analyzedIn)\n\t\t}\n\n\t\t// correct result type?\n\t\tif got, want := reflect.TypeOf(result), pass.Analyzer.ResultType; got != want {\n\t\t\treturn nil, fmt.Errorf(\n\t\t\t\t\"internal error: on package %s, analyzer %s returned a result of type %v, but declared ResultType %v\",\n\t\t\t\tpass.Pkg.Path(), pass.Analyzer, got, want)\n\t\t}\n\n\t\t// resolve diagnostic URLs\n\t\tfor i := range act.Diagnostics {\n\t\t\turl, err := driverutil.ResolveURL(act.Analyzer, act.Diagnostics[i])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tact.Diagnostics[i].URL = url\n\t\t}\n\t\treturn result, nil\n\t}()\n\n\t// Help detect (disallowed) calls after Run.\n\tpass.ExportObjectFact = nil\n\tpass.ExportPackageFact = nil\n\n\terr := act.persistFactsToCache()\n\tif err != nil {\n\t\tact.runner.log.Warnf(\"Failed to persist facts to cache: %s\", err)\n\t}\n}\n\n// NOTE(ldez) altered: logger; sanityCheck.\n// inheritFacts populates act.facts with\n// those it obtains from its dependency, dep.\nfunc inheritFacts(act, dep *action) {\n\tconst sanityCheck = false\n\n\tfor key, fact := range dep.objectFacts {\n\t\t// Filter out facts related to objects\n\t\t// that are irrelevant downstream\n\t\t// (equivalently: not in the compiler export data).\n\t\tif !exportedFrom(key.obj, dep.Package.Types) {\n\t\t\tfactsInheritDebugf(\"%v: discarding %T fact from %s for %s: %s\", act, fact, dep, key.obj, fact)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Optionally serialize/deserialize fact\n\t\t// to verify that it works across address spaces.\n\t\tif sanityCheck {\n\t\t\tencodedFact, err := codeFact(fact)\n\t\t\tif err != nil {\n\t\t\t\tact.runner.log.Panicf(\"internal error: encoding of %T fact failed in %v: %v\", fact, act, err)\n\t\t\t}\n\t\t\tfact = encodedFact\n\t\t}\n\n\t\tfactsInheritDebugf(\"%v: inherited %T fact for %s: %s\", act, fact, key.obj, fact)\n\n\t\tact.objectFacts[key] = fact\n\t}\n\n\tfor key, fact := range dep.packageFacts {\n\t\t// TODO: filter out facts that belong to\n\t\t// packages not mentioned in the export data\n\t\t// to prevent side channels.\n\t\t//\n\t\t// The Pass.All{Object,Package}Facts accessors expose too much:\n\t\t// all facts, of all types, for all dependencies in the action\n\t\t// graph. Not only does the representation grow quadratically,\n\t\t// but it violates the separate compilation paradigm, allowing\n\t\t// analysis implementations to communicate with indirect\n\t\t// dependencies that are not mentioned in the export data.\n\t\t//\n\t\t// It's not clear how to fix this short of a rather expensive\n\t\t// filtering step after each action that enumerates all the\n\t\t// objects that would appear in export data, and deletes\n\t\t// facts associated with objects not in this set.\n\n\t\t// Optionally serialize/deserialize fact\n\t\t// to verify that it works across address spaces\n\t\t// and is deterministic.\n\t\tif sanityCheck {\n\t\t\tencodedFact, err := codeFact(fact)\n\t\t\tif err != nil {\n\t\t\t\tact.runner.log.Panicf(\"internal error: encoding of %T fact failed in %v\", fact, act)\n\t\t\t}\n\t\t\tfact = encodedFact\n\t\t}\n\n\t\tfactsInheritDebugf(\"%v: inherited %T fact for %s: %s\", act, fact, key.pkg.Path(), fact)\n\n\t\tact.packageFacts[key] = fact\n\t}\n}\n\n// NOTE(ldez) altered: `new` is renamed to `newFact`.\n// codeFact encodes then decodes a fact,\n// just to exercise that logic.\nfunc codeFact(fact analysis.Fact) (analysis.Fact, error) {\n\t// We encode facts one at a time.\n\t// A real modular driver would emit all facts\n\t// into one encoder to improve gob efficiency.\n\tvar buf bytes.Buffer\n\tif err := gob.NewEncoder(&buf).Encode(fact); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Encode it twice and assert that we get the same bits.\n\t// This helps detect nondeterministic Gob encoding (e.g. of maps).\n\tvar buf2 bytes.Buffer\n\tif err := gob.NewEncoder(&buf2).Encode(fact); err != nil {\n\t\treturn nil, err\n\t}\n\tif !bytes.Equal(buf.Bytes(), buf2.Bytes()) {\n\t\treturn nil, fmt.Errorf(\"encoding of %T fact is nondeterministic\", fact)\n\t}\n\n\tnewFact := reflect.New(reflect.TypeOf(fact).Elem()).Interface().(analysis.Fact)\n\tif err := gob.NewDecoder(&buf).Decode(newFact); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newFact, nil\n}\n\n// NOTE(ldez) no alteration.\n// exportedFrom reports whether obj may be visible to a package that imports pkg.\n// This includes not just the exported members of pkg, but also unexported\n// constants, types, fields, and methods, perhaps belonging to other packages,\n// that find there way into the API.\n// This is an overapproximation of the more accurate approach used by\n// gc export data, which walks the type graph, but it's much simpler.\n//\n// TODO(adonovan): do more accurate filtering by walking the type graph.\nfunc exportedFrom(obj types.Object, pkg *types.Package) bool {\n\tswitch obj := obj.(type) {\n\tcase *types.Func:\n\t\treturn obj.Exported() && obj.Pkg() == pkg ||\n\t\t\tobj.Signature().Recv() != nil\n\tcase *types.Var:\n\t\tif obj.IsField() {\n\t\t\treturn true\n\t\t}\n\t\t// we can't filter more aggressively than this because we need\n\t\t// to consider function parameters exported, but have no way\n\t\t// of telling apart function parameters from local variables.\n\t\treturn obj.Pkg() == pkg\n\tcase *types.TypeName, *types.Const:\n\t\treturn true\n\t}\n\treturn false // Nil, Builtin, Label, or PkgName\n}\n\n// NOTE(ldez) altered: logger; `act.factType`.\n// ObjectFact retrieves a fact associated with obj,\n// and returns true if one was found.\n// Given a value ptr of type *T, where *T satisfies Fact,\n// ObjectFact copies the value to *ptr.\n//\n// See documentation at ImportObjectFact field of [analysis.Pass].\nfunc (act *action) ObjectFact(obj types.Object, ptr analysis.Fact) bool {\n\tif obj == nil {\n\t\tpanic(\"nil object\")\n\t}\n\tkey := objectFactKey{obj, act.factType(ptr)}\n\tif v, ok := act.objectFacts[key]; ok {\n\t\treflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())\n\t\treturn true\n\t}\n\treturn false\n}\n\n// NOTE(ldez) altered: logger; `act.factType`.\n// exportObjectFact implements Pass.ExportObjectFact.\nfunc (act *action) exportObjectFact(obj types.Object, fact analysis.Fact) {\n\tif act.pass.ExportObjectFact == nil {\n\t\tact.runner.log.Panicf(\"%s: Pass.ExportObjectFact(%s, %T) called after Run\", act, obj, fact)\n\t}\n\n\tif obj.Pkg() != act.Package.Types {\n\t\tact.runner.log.Panicf(\"internal error: in analysis %s of package %s: Fact.Set(%s, %T): can't set facts on objects belonging another package\",\n\t\t\tact.Analyzer, act.Package, obj, fact)\n\t}\n\n\tkey := objectFactKey{obj, act.factType(fact)}\n\tact.objectFacts[key] = fact // clobber any existing entry\n\tif isFactsExportDebug {\n\t\tobjstr := types.ObjectString(obj, (*types.Package).Name)\n\n\t\tfactsExportDebugf(\"%s: object %s has fact %s\\n\",\n\t\t\tact.Package.Fset.Position(obj.Pos()), objstr, fact)\n\t}\n}\n\n// NOTE(ldez) no alteration.\n// AllObjectFacts returns a new slice containing all object facts of\n// the analysis's FactTypes in unspecified order.\n//\n// See documentation at AllObjectFacts field of [analysis.Pass].\nfunc (act *action) AllObjectFacts() []analysis.ObjectFact {\n\tfacts := make([]analysis.ObjectFact, 0, len(act.objectFacts))\n\tfor k, fact := range act.objectFacts {\n\t\tfacts = append(facts, analysis.ObjectFact{Object: k.obj, Fact: fact})\n\t}\n\treturn facts\n}\n\n// NOTE(ldez) altered: `act.factType`.\n// PackageFact retrieves a fact associated with package pkg,\n// which must be this package or one of its dependencies.\n//\n// See documentation at ImportObjectFact field of [analysis.Pass].\nfunc (act *action) PackageFact(pkg *types.Package, ptr analysis.Fact) bool {\n\tif pkg == nil {\n\t\tpanic(\"nil package\")\n\t}\n\tkey := packageFactKey{pkg, act.factType(ptr)}\n\tif v, ok := act.packageFacts[key]; ok {\n\t\treflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())\n\t\treturn true\n\t}\n\treturn false\n}\n\n// NOTE(ldez) altered: logger; `act.factType`.\n// exportPackageFact implements Pass.ExportPackageFact.\nfunc (act *action) exportPackageFact(fact analysis.Fact) {\n\tif act.pass.ExportPackageFact == nil {\n\t\tact.runner.log.Panicf(\"%s: Pass.ExportPackageFact(%T) called after Run\", act, fact)\n\t}\n\n\tkey := packageFactKey{act.pass.Pkg, act.factType(fact)}\n\tact.packageFacts[key] = fact // clobber any existing entry\n\n\tfactsDebugf(\"%s: package %s has fact %s\\n\",\n\t\tact.Package.Fset.Position(act.pass.Files[0].Pos()), act.pass.Pkg.Path(), fact)\n}\n\n// NOTE(ldez) altered: add receiver to handle logs.\nfunc (act *action) factType(fact analysis.Fact) reflect.Type {\n\tt := reflect.TypeOf(fact)\n\tif t.Kind() != reflect.Pointer {\n\t\tact.runner.log.Fatalf(\"invalid Fact type: got %T, want pointer\", fact)\n\t}\n\treturn t\n}\n\n// NOTE(ldez) no alteration.\n// AllPackageFacts returns a new slice containing all package\n// facts of the analysis's FactTypes in unspecified order.\n//\n// See documentation at AllPackageFacts field of [analysis.Pass].\nfunc (act *action) AllPackageFacts() []analysis.PackageFact {\n\tfacts := make([]analysis.PackageFact, 0, len(act.packageFacts))\n\tfor k, fact := range act.packageFacts {\n\t\tfacts = append(facts, analysis.PackageFact{Package: k.pkg, Fact: fact})\n\t}\n\treturn facts\n}\n\n// NOTE(ldez) no alteration.\nfunc analysisModuleFromPackagesModule(mod *packages.Module) *analysis.Module {\n\tif mod == nil {\n\t\treturn nil\n\t}\n\n\tvar modErr *analysis.ModuleError\n\tif mod.Error != nil {\n\t\tmodErr = &analysis.ModuleError{\n\t\t\tErr: mod.Error.Err,\n\t\t}\n\t}\n\n\treturn &analysis.Module{\n\t\tPath:      mod.Path,\n\t\tVersion:   mod.Version,\n\t\tReplace:   analysisModuleFromPackagesModule(mod.Replace),\n\t\tTime:      mod.Time,\n\t\tMain:      mod.Main,\n\t\tIndirect:  mod.Indirect,\n\t\tDir:       mod.Dir,\n\t\tGoMod:     mod.GoMod,\n\t\tGoVersion: mod.GoVersion,\n\t\tError:     modErr,\n\t}\n}\n"
  },
  {
    "path": "pkg/goanalysis/runner_loadingpackage.go",
    "content": "package goanalysis\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/build\"\n\t\"go/parser\"\n\t\"go/scanner\"\n\t\"go/types\"\n\t\"os\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"golang.org/x/sync/errgroup\"\n\t\"golang.org/x/tools/go/gcexportdata\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/load\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nconst unsafePkgName = \"unsafe\"\n\n// https://github.com/golang/go/blob/go1.23.8/src/internal/types/errors/codes.go#L1484\nconst tooNew = 151\n\ntype loadingPackage struct {\n\tpkg         *packages.Package\n\timports     map[string]*loadingPackage\n\tisInitial   bool\n\tlog         logutils.Log\n\tactions     []*action // all actions with this package\n\tloadGuard   *load.Guard\n\tdependents  int32 // number of depending on it packages\n\tanalyzeOnce sync.Once\n\tdecUseMutex sync.Mutex\n}\n\nfunc (lp *loadingPackage) analyzeRecursive(ctx context.Context, cancel context.CancelFunc, loadMode LoadMode, loadSem chan struct{}) {\n\tlp.analyzeOnce.Do(func() {\n\t\t// Load the direct dependencies, in parallel.\n\t\tvar wg sync.WaitGroup\n\n\t\tfor _, imp := range lp.imports {\n\t\t\twg.Go(func() {\n\t\t\t\timp.analyzeRecursive(ctx, cancel, loadMode, loadSem)\n\t\t\t})\n\t\t}\n\n\t\twg.Wait()\n\n\t\tlp.analyze(ctx, cancel, loadMode, loadSem)\n\t})\n}\n\nfunc (lp *loadingPackage) analyze(ctx context.Context, cancel context.CancelFunc, loadMode LoadMode, loadSem chan struct{}) {\n\tselect {\n\tcase <-ctx.Done():\n\t\treturn\n\tcase loadSem <- struct{}{}:\n\t\tdefer func() {\n\t\t\t<-loadSem\n\t\t}()\n\t}\n\n\t// Save memory on unused more fields.\n\tdefer lp.decUse(loadMode < LoadModeWholeProgram)\n\n\tif err := lp.loadWithFacts(loadMode); err != nil {\n\t\t// Note: this error is ignored when there is no facts loading (e.g. with 98% of linters).\n\t\t// But this is not a problem because the errors are added to the package.Errors.\n\t\t// You through an error, try to add it to actions, but there is no action annnddd it's gone!\n\t\twerr := fmt.Errorf(\"failed to load package %s: %w\", lp.pkg.Name, err)\n\n\t\t// Don't need to write error to errCh, it will be extracted and reported on another layer.\n\t\t// Unblock depending on actions and propagate error.\n\t\tfor _, act := range lp.actions {\n\t\t\tclose(act.analysisDoneCh)\n\n\t\t\tact.Err = werr\n\t\t}\n\n\t\tif len(lp.actions) == 0 {\n\t\t\tlp.log.Warnf(\"no action but there is an error: %v\", err)\n\t\t}\n\n\t\treturn\n\t}\n\n\tactsWg, ctxGroup := errgroup.WithContext(ctx)\n\n\tfor _, act := range lp.actions {\n\t\tactsWg.Go(func() error {\n\t\t\tact.waitUntilDependingAnalyzersWorked(ctxGroup)\n\n\t\t\tselect {\n\t\t\tcase <-ctxGroup.Done():\n\t\t\t\treturn nil\n\t\t\tdefault:\n\t\t\t}\n\n\t\t\tact.analyzeSafe()\n\n\t\t\treturn act.Err\n\t\t})\n\t}\n\n\terr := actsWg.Wait()\n\tif err != nil {\n\t\tcancel()\n\t}\n}\n\nfunc (lp *loadingPackage) loadFromSource(loadMode LoadMode) error {\n\tpkg := lp.pkg\n\n\t// Many packages have few files, much fewer than there\n\t// are CPU cores. Additionally, parsing each individual file is\n\t// very fast. A naive parallel implementation of this loop won't\n\t// be faster, and tends to be slower due to extra scheduling,\n\t// bookkeeping and potentially false sharing of cache lines.\n\tpkg.Syntax = make([]*ast.File, 0, len(pkg.CompiledGoFiles))\n\tfor _, file := range pkg.CompiledGoFiles {\n\t\tf, err := parser.ParseFile(pkg.Fset, file, nil, parser.ParseComments)\n\t\tif err != nil {\n\t\t\tpkg.Errors = append(pkg.Errors, lp.convertError(err)...)\n\t\t\tcontinue\n\t\t}\n\t\tpkg.Syntax = append(pkg.Syntax, f)\n\t}\n\tif len(pkg.Errors) != 0 {\n\t\tpkg.IllTyped = true\n\t\treturn nil\n\t}\n\n\tif loadMode == LoadModeSyntax {\n\t\treturn nil\n\t}\n\n\t// Call NewPackage directly with explicit name.\n\t// This avoids skew between golist and go/types when the files'\n\t// package declarations are inconsistent.\n\t// Subtle: we populate all Types fields with an empty Package\n\t// before loading export data so that export data processing\n\t// never has to create a types.Package for an indirect dependency,\n\t// which would then require that such created packages be explicitly\n\t// inserted back into the Import graph as a final step after export data loading.\n\tpkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)\n\n\tpkg.IllTyped = true\n\n\tpkg.TypesInfo = &types.Info{\n\t\tTypes:        make(map[ast.Expr]types.TypeAndValue),\n\t\tInstances:    make(map[*ast.Ident]types.Instance),\n\t\tDefs:         make(map[*ast.Ident]types.Object),\n\t\tUses:         make(map[*ast.Ident]types.Object),\n\t\tImplicits:    make(map[ast.Node]types.Object),\n\t\tSelections:   make(map[*ast.SelectorExpr]*types.Selection),\n\t\tScopes:       make(map[ast.Node]*types.Scope),\n\t\tFileVersions: make(map[*ast.File]string),\n\t}\n\n\timporter := func(path string) (*types.Package, error) {\n\t\tif path == unsafePkgName {\n\t\t\treturn types.Unsafe, nil\n\t\t}\n\t\tif path == \"C\" {\n\t\t\t// go/packages doesn't tell us that cgo preprocessing\n\t\t\t// failed. When we subsequently try to parse the package,\n\t\t\t// we'll encounter the raw C import.\n\t\t\treturn nil, errors.New(\"cgo preprocessing failed\")\n\t\t}\n\t\timp := pkg.Imports[path]\n\t\tif imp == nil {\n\t\t\treturn nil, nil\n\t\t}\n\t\tif len(imp.Errors) > 0 {\n\t\t\treturn nil, imp.Errors[0]\n\t\t}\n\t\treturn imp.Types, nil\n\t}\n\n\tvar goVersion string\n\tif pkg.Module != nil && pkg.Module.GoVersion != \"\" {\n\t\tgoVersion = \"go\" + strings.TrimPrefix(pkg.Module.GoVersion, \"go\")\n\t} else {\n\t\tvar err error\n\t\tgoVersion, err = goutil.CleanRuntimeVersion()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\ttc := &types.Config{\n\t\tImporter: importerFunc(importer),\n\t\tError: func(err error) {\n\t\t\tpkg.Errors = append(pkg.Errors, lp.convertError(err)...)\n\t\t},\n\t\tGoVersion: goVersion,\n\t\tSizes:     types.SizesFor(build.Default.Compiler, build.Default.GOARCH),\n\t}\n\n\t_ = types.NewChecker(tc, pkg.Fset, pkg.Types, pkg.TypesInfo).Files(pkg.Syntax)\n\t// Don't handle error here: errors are adding by tc.Error function.\n\n\tillTyped := len(pkg.Errors) != 0\n\tif !illTyped {\n\t\tfor _, imp := range lp.imports {\n\t\t\tif imp.pkg.IllTyped {\n\t\t\t\tillTyped = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tpkg.IllTyped = illTyped\n\treturn nil\n}\n\nfunc (lp *loadingPackage) loadFromExportData() error {\n\tpkg := lp.pkg\n\n\t// Call NewPackage directly with explicit name.\n\t// This avoids skew between golist and go/types when the files'\n\t// package declarations are inconsistent.\n\t// Subtle: we populate all Types fields with an empty Package\n\t// before loading export data so that export data processing\n\t// never has to create a types.Package for an indirect dependency,\n\t// which would then require that such created packages be explicitly\n\t// inserted back into the Import graph as a final step after export data loading.\n\tpkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)\n\n\tpkg.IllTyped = true\n\tfor path, pkg := range pkg.Imports {\n\t\tif pkg.Types == nil {\n\t\t\treturn fmt.Errorf(\"dependency %q hasn't been loaded yet\", path)\n\t\t}\n\t}\n\n\tif pkg.ExportFile == \"\" {\n\t\treturn fmt.Errorf(\"no export data for %q\", pkg.ID)\n\t}\n\n\tf, err := os.Open(pkg.ExportFile)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\n\tr, err := gcexportdata.NewReader(f)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tview := make(map[string]*types.Package)  // view seen by gcexportdata\n\tseen := make(map[*packages.Package]bool) // all visited packages\n\tvar visit func(pkgs map[string]*packages.Package)\n\tvisit = func(pkgs map[string]*packages.Package) {\n\t\tfor _, pkg := range pkgs {\n\t\t\tif !seen[pkg] {\n\t\t\t\tseen[pkg] = true\n\t\t\t\tview[pkg.PkgPath] = pkg.Types\n\t\t\t\tvisit(pkg.Imports)\n\t\t\t}\n\t\t}\n\t}\n\tvisit(pkg.Imports)\n\ttpkg, err := gcexportdata.Read(r, pkg.Fset, view, pkg.PkgPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tpkg.Types = tpkg\n\tpkg.IllTyped = false\n\treturn nil\n}\n\nfunc (lp *loadingPackage) loadWithFacts(loadMode LoadMode) error {\n\tpkg := lp.pkg\n\n\tif pkg.PkgPath == unsafePkgName {\n\t\t// Fill in the blanks to avoid surprises.\n\t\tpkg.Syntax = []*ast.File{}\n\t\tif loadMode >= LoadModeTypesInfo {\n\t\t\tpkg.Types = types.Unsafe\n\t\t\tpkg.TypesInfo = new(types.Info)\n\t\t}\n\t\treturn nil\n\t}\n\n\tif pkg.TypesInfo != nil {\n\t\t// Already loaded package, e.g. because another not go/analysis linter required types for deps.\n\t\t// Try load cached facts for it.\n\n\t\tfor _, act := range lp.actions {\n\t\t\tif !act.loadCachedFacts() {\n\t\t\t\t// Cached facts loading failed: analyze later the action from source.\n\t\t\t\tact.needAnalyzeSource = true\n\t\t\t\tfactsCacheDebugf(\"Loading of facts for already loaded %s failed, analyze it from source later\", act)\n\t\t\t\tact.markDepsForAnalyzingSource()\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tif lp.isInitial {\n\t\t// No need to load cached facts: the package will be analyzed from source\n\t\t// because it's the initial.\n\t\treturn lp.loadFromSource(loadMode)\n\t}\n\n\treturn lp.loadImportedPackageWithFacts(loadMode)\n}\n\nfunc (lp *loadingPackage) loadImportedPackageWithFacts(loadMode LoadMode) error {\n\tpkg := lp.pkg\n\n\t// Load package from export data\n\tif loadMode >= LoadModeTypesInfo {\n\t\tif err := lp.loadFromExportData(); err != nil {\n\t\t\t// We asked Go to give us up-to-date export data, yet\n\t\t\t// we can't load it. There must be something wrong.\n\t\t\t//\n\t\t\t// Attempt loading from source. This should fail (because\n\t\t\t// otherwise there would be export data); we just want to\n\t\t\t// get the compile errors. If loading from source succeeds\n\t\t\t// we discard the result, anyway. Otherwise, we'll fail\n\t\t\t// when trying to reload from export data later.\n\n\t\t\t// Otherwise, it panics because uses already existing (from exported data) types.\n\t\t\tpkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)\n\t\t\tif srcErr := lp.loadFromSource(loadMode); srcErr != nil {\n\t\t\t\treturn srcErr\n\t\t\t}\n\n\t\t\t// Make sure this package can't be imported successfully\n\t\t\tpkg.Errors = append(pkg.Errors, packages.Error{\n\t\t\t\tPos:  \"-\",\n\t\t\t\tMsg:  fmt.Sprintf(\"could not load export data: %s\", err),\n\t\t\t\tKind: packages.ParseError,\n\t\t\t})\n\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tneedLoadFromSource := false\n\tfor _, act := range lp.actions {\n\t\tif act.loadCachedFacts() {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Cached facts loading failed: analyze later the action from source.\n\t\tfactsCacheDebugf(\"Loading of facts for %s failed, analyze it from source later\", act)\n\t\tact.needAnalyzeSource = true // can't be set in parallel\n\t\tneedLoadFromSource = true\n\n\t\tact.markDepsForAnalyzingSource()\n\t}\n\n\tif needLoadFromSource {\n\t\t// Cached facts loading failed: analyze later the action from source. To perform\n\t\t// the analysis we need to load the package from source code.\n\n\t\t// Otherwise, it panics because uses already existing (from exported data) types.\n\t\tif loadMode >= LoadModeTypesInfo {\n\t\t\tpkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)\n\t\t}\n\t\treturn lp.loadFromSource(loadMode)\n\t}\n\n\treturn nil\n}\n\nfunc (lp *loadingPackage) decUse(canClearTypes bool) {\n\tlp.decUseMutex.Lock()\n\tdefer lp.decUseMutex.Unlock()\n\n\tfor _, act := range lp.actions {\n\t\tpass := act.pass\n\t\tif pass == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tpass.Files = nil\n\t\tpass.TypesInfo = nil\n\t\tpass.TypesSizes = nil\n\t\tpass.ResultOf = nil\n\t\tpass.Pkg = nil\n\t\tpass.OtherFiles = nil\n\t\tpass.AllObjectFacts = nil\n\t\tpass.AllPackageFacts = nil\n\t\tpass.ImportObjectFact = nil\n\t\tpass.ExportObjectFact = nil\n\t\tpass.ImportPackageFact = nil\n\t\tpass.ExportPackageFact = nil\n\t\tact.pass = nil\n\t\tact.Deps = nil\n\t\tif act.Result != nil {\n\t\t\tif isMemoryDebug {\n\t\t\t\tdebugf(\"%s: decUse: nilling act result of size %d bytes\", act, sizeOfValueTreeBytes(act.Result))\n\t\t\t}\n\t\t\tact.Result = nil\n\t\t}\n\t}\n\n\tlp.pkg.Syntax = nil\n\tlp.pkg.TypesInfo = nil\n\tlp.pkg.TypesSizes = nil\n\n\t// Can't set lp.pkg.Imports to nil because of loadFromExportData.visit.\n\n\tdependents := atomic.AddInt32(&lp.dependents, -1)\n\tif dependents != 0 {\n\t\treturn\n\t}\n\n\tif canClearTypes {\n\t\t// canClearTypes is set to true if we can discard type\n\t\t// information after the package and its dependents have been\n\t\t// processed. This is the case when no whole program checkers (unused) are\n\t\t// being run.\n\t\tlp.pkg.Types = nil\n\t}\n\tlp.pkg = nil\n\n\tfor _, imp := range lp.imports {\n\t\timp.decUse(canClearTypes)\n\t}\n\tlp.imports = nil\n\n\tfor _, act := range lp.actions {\n\t\tif !lp.isInitial {\n\t\t\tact.Package = nil\n\t\t}\n\t\tact.packageFacts = nil\n\t\tact.objectFacts = nil\n\t}\n\tlp.actions = nil\n}\n\nfunc (lp *loadingPackage) convertError(err error) []packages.Error {\n\tvar errs []packages.Error\n\t// taken from go/packages\n\tswitch err := err.(type) {\n\tcase packages.Error:\n\t\t// from driver\n\t\terrs = append(errs, err)\n\n\tcase *os.PathError:\n\t\t// from parser\n\t\terrs = append(errs, packages.Error{\n\t\t\tPos:  err.Path + \":1\",\n\t\t\tMsg:  err.Err.Error(),\n\t\t\tKind: packages.ParseError,\n\t\t})\n\n\tcase scanner.ErrorList:\n\t\t// from parser\n\t\tfor _, err := range err {\n\t\t\terrs = append(errs, packages.Error{\n\t\t\t\tPos:  err.Pos.String(),\n\t\t\t\tMsg:  err.Msg,\n\t\t\t\tKind: packages.ParseError,\n\t\t\t})\n\t\t}\n\n\tcase types.Error:\n\t\t// from type checker\n\n\t\t// https://github.com/golang/go/blob/go1.23.8/src/go/types/api.go#L52-L57\n\t\tif int(reflect.ValueOf(err).FieldByName(\"go116code\").Int()) == tooNew {\n\t\t\t// https://github.com/golang/go/blob/go1.23.8/src/go/types/check.go#L380\n\t\t\t// https://github.com/golang/go/blob/go1.23.8/src/go/types/check.go#L349\n\t\t\tpanic(err.Msg)\n\t\t}\n\n\t\terrs = append(errs, packages.Error{\n\t\t\tPos:  err.Fset.Position(err.Pos).String(),\n\t\t\tMsg:  err.Msg,\n\t\t\tKind: packages.TypeError,\n\t\t})\n\n\tdefault:\n\t\t// unexpected impoverished error from parser?\n\t\terrs = append(errs, packages.Error{\n\t\t\tPos:  \"-\",\n\t\t\tMsg:  err.Error(),\n\t\t\tKind: packages.UnknownError,\n\t\t})\n\n\t\t// If you see this error message, please file a bug.\n\t\tlp.log.Warnf(\"Internal error: error %q (%T) without position\", err, err)\n\t}\n\n\treturn errs\n}\n\nfunc (lp *loadingPackage) String() string {\n\treturn fmt.Sprintf(\"%s@%s\", lp.pkg.PkgPath, lp.pkg.Name)\n}\n\ntype importerFunc func(path string) (*types.Package, error)\n\nfunc (f importerFunc) Import(path string) (*types.Package, error) { return f(path) }\n\nfunc sizeOfValueTreeBytes(v any) int {\n\treturn sizeOfReflectValueTreeBytes(reflect.ValueOf(v), map[uintptr]struct{}{})\n}\n\nfunc sizeOfReflectValueTreeBytes(rv reflect.Value, visitedPtrs map[uintptr]struct{}) int {\n\tswitch rv.Kind() {\n\tcase reflect.Pointer:\n\t\tptrSize := int(rv.Type().Size())\n\t\tif rv.IsNil() {\n\t\t\treturn ptrSize\n\t\t}\n\t\tptr := rv.Pointer()\n\t\tif _, ok := visitedPtrs[ptr]; ok {\n\t\t\treturn 0\n\t\t}\n\t\tvisitedPtrs[ptr] = struct{}{}\n\t\treturn ptrSize + sizeOfReflectValueTreeBytes(rv.Elem(), visitedPtrs)\n\tcase reflect.Interface:\n\t\tif rv.IsNil() {\n\t\t\treturn 0\n\t\t}\n\t\treturn sizeOfReflectValueTreeBytes(rv.Elem(), visitedPtrs)\n\tcase reflect.Struct:\n\t\tret := 0\n\t\tfor i := range rv.NumField() {\n\t\t\tret += sizeOfReflectValueTreeBytes(rv.Field(i), visitedPtrs)\n\t\t}\n\t\treturn ret\n\tcase reflect.Slice, reflect.Array, reflect.Chan:\n\t\treturn int(rv.Type().Size()) + rv.Cap()*int(rv.Type().Elem().Size())\n\tcase reflect.Map:\n\t\tret := 0\n\t\tfor _, key := range rv.MapKeys() {\n\t\t\tmv := rv.MapIndex(key)\n\t\t\tret += sizeOfReflectValueTreeBytes(key, visitedPtrs)\n\t\t\tret += sizeOfReflectValueTreeBytes(mv, visitedPtrs)\n\t\t}\n\t\treturn ret\n\tcase reflect.String:\n\t\treturn rv.Len()\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,\n\t\treflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,\n\t\treflect.Uintptr, reflect.Bool, reflect.Float32, reflect.Float64,\n\t\treflect.Complex64, reflect.Complex128, reflect.Func, reflect.UnsafePointer:\n\t\treturn int(rv.Type().Size())\n\tcase reflect.Invalid:\n\t\treturn 0\n\tdefault:\n\t\tpanic(\"unknown rv of type \" + rv.String())\n\t}\n}\n"
  },
  {
    "path": "pkg/goanalysis/runners.go",
    "content": "package goanalysis\n\nimport (\n\t\"fmt\"\n\t\"go/token\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/pkgerrors\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/timeutils\"\n)\n\ntype runAnalyzersConfig interface {\n\tgetName() string\n\tgetLinterNameForDiagnostic(*Diagnostic) string\n\tgetAnalyzers() []*analysis.Analyzer\n\tuseOriginalPackages() bool\n\treportIssues(*linter.Context) []*Issue\n\tgetLoadMode() LoadMode\n}\n\nfunc runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]*result.Issue, error) {\n\tlog := lintCtx.Log.Child(logutils.DebugKeyGoAnalysis)\n\tsw := timeutils.NewStopwatch(\"analyzers\", log)\n\n\tconst stagesToPrint = 10\n\tdefer sw.PrintTopStages(stagesToPrint)\n\n\trunner := newRunner(cfg.getName(), log, lintCtx.PkgCache, lintCtx.LoadGuard, cfg.getLoadMode(), sw)\n\n\tpkgs := lintCtx.Packages\n\tif cfg.useOriginalPackages() {\n\t\tpkgs = lintCtx.OriginalPackages\n\t}\n\n\tissues, pkgsFromCache := loadIssuesFromCache(pkgs, lintCtx, cfg.getAnalyzers())\n\tvar pkgsToAnalyze []*packages.Package\n\tfor _, pkg := range pkgs {\n\t\tif !pkgsFromCache[pkg] {\n\t\t\tpkgsToAnalyze = append(pkgsToAnalyze, pkg)\n\t\t}\n\t}\n\n\tdiags, errs, passToPkg := runner.run(cfg.getAnalyzers(), pkgsToAnalyze)\n\n\tdefer func() {\n\t\tif len(errs) == 0 {\n\t\t\t// If we try to save to cache even if we have compilation errors\n\t\t\t// we won't see them on repeated runs.\n\t\t\tsaveIssuesToCache(pkgs, pkgsFromCache, issues, lintCtx, cfg.getAnalyzers())\n\t\t}\n\t}()\n\n\tbuildAllIssues := func() []*result.Issue {\n\t\tvar retIssues []*result.Issue\n\n\t\treportedIssues := cfg.reportIssues(lintCtx)\n\t\tfor _, reportedIssue := range reportedIssues {\n\t\t\tif reportedIssue.Pkg == nil {\n\t\t\t\treportedIssue.Pkg = passToPkg[reportedIssue.Pass]\n\t\t\t}\n\n\t\t\tretIssues = append(retIssues, reportedIssue.Issue)\n\t\t}\n\n\t\treturn slices.Concat(retIssues, buildIssues(diags, cfg.getLinterNameForDiagnostic))\n\t}\n\n\terrIssues, err := pkgerrors.BuildIssuesFromIllTypedError(errs, lintCtx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tissues = append(issues, errIssues...)\n\tissues = append(issues, buildAllIssues()...)\n\n\treturn issues, nil\n}\n\nfunc buildIssues(diags []*Diagnostic, linterNameBuilder func(diag *Diagnostic) string) []*result.Issue {\n\tvar issues []*result.Issue\n\n\tfor _, diag := range diags {\n\t\tlinterName := linterNameBuilder(diag)\n\n\t\tvar text string\n\t\tif diag.Analyzer.Name == linterName {\n\t\t\ttext = diag.Message\n\t\t} else {\n\t\t\ttext = fmt.Sprintf(\"%s: %s\", diag.Analyzer.Name, diag.Message)\n\t\t}\n\n\t\tvar suggestedFixes []analysis.SuggestedFix\n\n\t\tfor _, sf := range diag.SuggestedFixes {\n\t\t\t// Skip suggested fixes on cgo files.\n\t\t\t// The related error is: \"diff has out-of-bounds edits\"\n\t\t\t// This is a temporary workaround.\n\t\t\tif !strings.HasSuffix(diag.File.Name(), \".go\") {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tnsf := analysis.SuggestedFix{Message: sf.Message}\n\n\t\t\tfor _, edit := range sf.TextEdits {\n\t\t\t\tend := edit.End\n\n\t\t\t\tif !end.IsValid() {\n\t\t\t\t\tend = edit.Pos\n\t\t\t\t}\n\n\t\t\t\t// To be applied the positions need to be \"adjusted\" based on the file.\n\t\t\t\t// This is the difference between the \"displayed\" positions and \"effective\" positions.\n\t\t\t\tnsf.TextEdits = append(nsf.TextEdits, analysis.TextEdit{\n\t\t\t\t\tPos:     token.Pos(diag.File.Offset(edit.Pos)),\n\t\t\t\t\tEnd:     token.Pos(diag.File.Offset(end)),\n\t\t\t\t\tNewText: edit.NewText,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tsuggestedFixes = append(suggestedFixes, nsf)\n\t\t}\n\n\t\tissues = append(issues, &result.Issue{\n\t\t\tFromLinter:     linterName,\n\t\t\tText:           text,\n\t\t\tPos:            diag.Position,\n\t\t\tPkg:            diag.Pkg,\n\t\t\tSuggestedFixes: suggestedFixes,\n\t\t})\n\n\t\tif len(diag.Related) > 0 {\n\t\t\tfor _, info := range diag.Related {\n\t\t\t\trelatedPos := diag.Pkg.Fset.Position(info.Pos)\n\n\t\t\t\tif relatedPos.Filename != diag.Position.Filename {\n\t\t\t\t\trelatedPos = diag.Position\n\t\t\t\t}\n\n\t\t\t\tissues = append(issues, &result.Issue{\n\t\t\t\t\tFromLinter: linterName,\n\t\t\t\t\tText:       fmt.Sprintf(\"%s(related information): %s\", diag.Analyzer.Name, info.Message),\n\t\t\t\t\tPos:        relatedPos,\n\t\t\t\t\tPkg:        diag.Pkg,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\treturn issues\n}\n"
  },
  {
    "path": "pkg/goanalysis/runners_cache.go",
    "content": "package goanalysis\n\nimport (\n\t\"runtime\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/cache\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc saveIssuesToCache(allPkgs []*packages.Package, pkgsFromCache map[*packages.Package]bool,\n\tissues []*result.Issue, lintCtx *linter.Context, analyzers []*analysis.Analyzer,\n) {\n\tstartedAt := time.Now()\n\tperPkgIssues := map[*packages.Package][]*result.Issue{}\n\tfor _, issue := range issues {\n\t\tperPkgIssues[issue.Pkg] = append(perPkgIssues[issue.Pkg], issue)\n\t}\n\n\tvar savedIssuesCount int64\n\tlintResKey := getIssuesCacheKey(analyzers)\n\n\tworkerCount := runtime.GOMAXPROCS(-1)\n\tvar wg sync.WaitGroup\n\n\tpkgCh := make(chan *packages.Package, len(allPkgs))\n\tfor range workerCount {\n\t\twg.Go(func() {\n\t\t\tfor pkg := range pkgCh {\n\t\t\t\tpkgIssues := perPkgIssues[pkg]\n\t\t\t\tencodedIssues := make([]EncodingIssue, 0, len(pkgIssues))\n\t\t\t\tfor _, issue := range pkgIssues {\n\t\t\t\t\tencodedIssues = append(encodedIssues, EncodingIssue{\n\t\t\t\t\t\tFromLinter:           issue.FromLinter,\n\t\t\t\t\t\tText:                 issue.Text,\n\t\t\t\t\t\tSeverity:             issue.Severity,\n\t\t\t\t\t\tPos:                  issue.Pos,\n\t\t\t\t\t\tLineRange:            issue.LineRange,\n\t\t\t\t\t\tSuggestedFixes:       issue.SuggestedFixes,\n\t\t\t\t\t\tExpectNoLint:         issue.ExpectNoLint,\n\t\t\t\t\t\tExpectedNoLintLinter: issue.ExpectedNoLintLinter,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tatomic.AddInt64(&savedIssuesCount, int64(len(encodedIssues)))\n\t\t\t\tif err := lintCtx.PkgCache.Put(pkg, cache.HashModeNeedAllDeps, lintResKey, encodedIssues); err != nil {\n\t\t\t\t\tlintCtx.Log.Infof(\"Failed to save package %s issues (%d) to cache: %s\", pkg, len(pkgIssues), err)\n\t\t\t\t} else {\n\t\t\t\t\tissuesCacheDebugf(\"Saved package %s issues (%d) to cache\", pkg, len(pkgIssues))\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tfor _, pkg := range allPkgs {\n\t\tif pkgsFromCache[pkg] {\n\t\t\tcontinue\n\t\t}\n\n\t\tpkgCh <- pkg\n\t}\n\tclose(pkgCh)\n\twg.Wait()\n\n\tlintCtx.PkgCache.Close()\n\n\tissuesCacheDebugf(\"Saved %d issues from %d packages to cache in %s\", savedIssuesCount, len(allPkgs), time.Since(startedAt))\n}\n\nfunc loadIssuesFromCache(pkgs []*packages.Package, lintCtx *linter.Context,\n\tanalyzers []*analysis.Analyzer,\n) (issuesFromCache []*result.Issue, pkgsFromCache map[*packages.Package]bool) {\n\tstartedAt := time.Now()\n\n\tlintResKey := getIssuesCacheKey(analyzers)\n\ttype cacheRes struct {\n\t\tissues  []*result.Issue\n\t\tloadErr error\n\t}\n\tpkgToCacheRes := make(map[*packages.Package]*cacheRes, len(pkgs))\n\tfor _, pkg := range pkgs {\n\t\tpkgToCacheRes[pkg] = &cacheRes{}\n\t}\n\n\tworkerCount := runtime.GOMAXPROCS(-1)\n\tvar wg sync.WaitGroup\n\n\tpkgCh := make(chan *packages.Package, len(pkgs))\n\tfor range workerCount {\n\t\twg.Go(func() {\n\t\t\tfor pkg := range pkgCh {\n\t\t\t\tvar pkgIssues []*EncodingIssue\n\t\t\t\terr := lintCtx.PkgCache.Get(pkg, cache.HashModeNeedAllDeps, lintResKey, &pkgIssues)\n\t\t\t\tcacheRes := pkgToCacheRes[pkg]\n\t\t\t\tcacheRes.loadErr = err\n\t\t\t\tif err != nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif len(pkgIssues) == 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tissues := make([]*result.Issue, 0, len(pkgIssues))\n\t\t\t\tfor _, issue := range pkgIssues {\n\t\t\t\t\tissues = append(issues, &result.Issue{\n\t\t\t\t\t\tFromLinter:           issue.FromLinter,\n\t\t\t\t\t\tText:                 issue.Text,\n\t\t\t\t\t\tSeverity:             issue.Severity,\n\t\t\t\t\t\tPos:                  issue.Pos,\n\t\t\t\t\t\tLineRange:            issue.LineRange,\n\t\t\t\t\t\tSuggestedFixes:       issue.SuggestedFixes,\n\t\t\t\t\t\tPkg:                  pkg,\n\t\t\t\t\t\tExpectNoLint:         issue.ExpectNoLint,\n\t\t\t\t\t\tExpectedNoLintLinter: issue.ExpectedNoLintLinter,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tcacheRes.issues = issues\n\t\t\t}\n\t\t})\n\t}\n\n\tfor _, pkg := range pkgs {\n\t\tpkgCh <- pkg\n\t}\n\tclose(pkgCh)\n\twg.Wait()\n\n\tloadedIssuesCount := 0\n\tpkgsFromCache = map[*packages.Package]bool{}\n\tfor pkg, cacheRes := range pkgToCacheRes {\n\t\tif cacheRes.loadErr == nil {\n\t\t\tloadedIssuesCount += len(cacheRes.issues)\n\t\t\tpkgsFromCache[pkg] = true\n\t\t\tissuesFromCache = append(issuesFromCache, cacheRes.issues...)\n\t\t\tissuesCacheDebugf(\"Loaded package %s issues (%d) from cache\", pkg, len(cacheRes.issues))\n\t\t} else {\n\t\t\tissuesCacheDebugf(\"Didn't load package %s issues from cache: %s\", pkg, cacheRes.loadErr)\n\t\t}\n\t}\n\tissuesCacheDebugf(\"Loaded %d issues from cache in %s, analyzing %d/%d packages\",\n\t\tloadedIssuesCount, time.Since(startedAt), len(pkgs)-len(pkgsFromCache), len(pkgs))\n\treturn issuesFromCache, pkgsFromCache\n}\n\nfunc getIssuesCacheKey(analyzers []*analysis.Analyzer) string {\n\treturn \"lint/result:\" + analyzersHashID(analyzers)\n}\n\nfunc analyzersHashID(analyzers []*analysis.Analyzer) string {\n\tnames := make([]string, 0, len(analyzers))\n\tfor _, a := range analyzers {\n\t\tnames = append(names, a.Name)\n\t}\n\n\tsort.Strings(names)\n\treturn strings.Join(names, \",\")\n}\n"
  },
  {
    "path": "pkg/goformat/runner.go",
    "content": "package goformat\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/alecthomas/chroma/v2/quick\"\n\trpdiff \"github.com/rogpeppe/go-internal/diff\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result/processors\"\n)\n\ntype Runner struct {\n\tlog logutils.Log\n\n\tmetaFormatter *goformatters.MetaFormatter\n\tmatcher       *processors.GeneratedFileMatcher\n\n\topts RunnerOptions\n\n\texitCode int\n}\n\nfunc NewRunner(logger logutils.Log,\n\tmetaFormatter *goformatters.MetaFormatter, matcher *processors.GeneratedFileMatcher,\n\topts RunnerOptions) *Runner {\n\treturn &Runner{\n\t\tlog:           logger,\n\t\tmatcher:       matcher,\n\t\tmetaFormatter: metaFormatter,\n\t\topts:          opts,\n\t}\n}\n\nfunc (c *Runner) Run(paths []string) error {\n\tsavedStdout, savedStderr := os.Stdout, os.Stderr\n\n\tif !logutils.HaveDebugTag(logutils.DebugKeyFormattersOutput) {\n\t\t// Don't allow linters and loader to print anything\n\t\tlog.SetOutput(io.Discard)\n\t\tc.setOutputToDevNull()\n\t\tdefer func() {\n\t\t\tos.Stdout, os.Stderr = savedStdout, savedStderr\n\t\t}()\n\t}\n\n\tif c.opts.stdin {\n\t\treturn c.formatStdIn(\"<standard input>\", savedStdout, os.Stdin)\n\t}\n\n\tfor _, path := range paths {\n\t\terr := c.walk(path, savedStdout)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor pattern, count := range c.opts.excludedPathCounter {\n\t\tif c.opts.warnUnused && count == 0 {\n\t\t\tc.log.Warnf(\"The pattern %q match no issues\", pattern)\n\t\t} else {\n\t\t\tc.log.Infof(\"Skipped %d issues by pattern %q\", count, pattern)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *Runner) walk(root string, stdout *os.File) error {\n\treturn filepath.Walk(root, func(path string, f fs.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif f.IsDir() && skipDir(f.Name()) {\n\t\t\treturn fs.SkipDir\n\t\t}\n\n\t\tif !isGoFile(f) {\n\t\t\treturn nil\n\t\t}\n\n\t\tmatch, err := c.opts.MatchAnyPattern(path)\n\t\tif err != nil || match {\n\t\t\treturn err\n\t\t}\n\n\t\t//nolint:gosec // See explanation below.\n\t\t// `path` contains the `root` but when using `r, err := os.OpenRoot(root)`, this part is not inside the file tree of `r`.\n\t\t// `filepath.Rel()` can be used but it seems overkill in the context and doesn't work well with a file.\n\t\tin, err := os.Open(path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tdefer func() { _ = in.Close() }()\n\n\t\treturn c.process(path, stdout, in)\n\t})\n}\n\nfunc (c *Runner) process(path string, stdout io.Writer, in io.Reader) error {\n\tinput, err := io.ReadAll(in)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmatch, err := c.matcher.IsGeneratedFile(path, input)\n\tif err != nil || match {\n\t\treturn err\n\t}\n\n\toutput := c.metaFormatter.Format(path, input)\n\n\tif bytes.Equal(input, output) {\n\t\treturn nil\n\t}\n\n\tif c.opts.diff {\n\t\tnewName := filepath.ToSlash(path)\n\t\toldName := newName + \".orig\"\n\n\t\tpatch := rpdiff.Diff(oldName, input, newName, output)\n\n\t\tif c.opts.colors {\n\t\t\terr = quick.Highlight(stdout, string(patch), \"diff\", \"terminal\", \"native\")\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\t_, err = stdout.Write(patch)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tc.exitCode = 1\n\n\t\treturn nil\n\t}\n\n\tc.log.Infof(\"format: %s\", path)\n\n\t// On Windows, we need to re-set the permissions from the file. See golang/go#38225.\n\tvar perms os.FileMode\n\tif fi, err := os.Stat(path); err == nil {\n\t\tperms = fi.Mode() & os.ModePerm\n\t}\n\n\treturn os.WriteFile(path, output, perms)\n}\n\nfunc (c *Runner) formatStdIn(path string, stdout io.Writer, in io.Reader) error {\n\tinput, err := io.ReadAll(in)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmatch, err := c.matcher.IsGeneratedFile(path, input)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif match {\n\t\t// If the file is generated,\n\t\t// the input should be written to the stdout to avoid emptied the file.\n\t\t_, err = stdout.Write(input)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t}\n\n\toutput := c.metaFormatter.Format(path, input)\n\n\t_, err = stdout.Write(output)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (c *Runner) setOutputToDevNull() {\n\tdevNull, err := os.Open(os.DevNull)\n\tif err != nil {\n\t\tc.log.Warnf(\"Can't open null device %q: %s\", os.DevNull, err)\n\t\treturn\n\t}\n\n\tos.Stdout, os.Stderr = devNull, devNull\n}\n\nfunc (c *Runner) ExitCode() int {\n\treturn c.exitCode\n}\n\ntype RunnerOptions struct {\n\tbasePath  string\n\tpatterns  []*regexp.Regexp\n\tgenerated string\n\tdiff      bool\n\tcolors    bool\n\tstdin     bool\n\n\twarnUnused          bool\n\texcludedPathCounter map[*regexp.Regexp]int\n}\n\nfunc NewRunnerOptions(cfg *config.Config, diff, diffColored, stdin bool) (RunnerOptions, error) {\n\tbasePath, err := fsutils.GetBasePath(context.Background(), cfg.Run.RelativePathMode, cfg.GetConfigDir())\n\tif err != nil {\n\t\treturn RunnerOptions{}, fmt.Errorf(\"get base path: %w\", err)\n\t}\n\n\t// Required to be consistent with `RunnerOptions.MatchAnyPattern`.\n\tabsBasePath, err := filepath.Abs(basePath)\n\tif err != nil {\n\t\treturn RunnerOptions{}, err\n\t}\n\n\topts := RunnerOptions{\n\t\tbasePath:            absBasePath,\n\t\tgenerated:           cfg.Formatters.Exclusions.Generated,\n\t\tdiff:                diff || diffColored,\n\t\tcolors:              diffColored,\n\t\tstdin:               stdin,\n\t\texcludedPathCounter: make(map[*regexp.Regexp]int),\n\t\twarnUnused:          cfg.Formatters.Exclusions.WarnUnused,\n\t}\n\n\tfor _, pattern := range cfg.Formatters.Exclusions.Paths {\n\t\texp, err := regexp.Compile(fsutils.NormalizePathInRegex(pattern))\n\t\tif err != nil {\n\t\t\treturn RunnerOptions{}, fmt.Errorf(\"compile path pattern %q: %w\", pattern, err)\n\t\t}\n\n\t\topts.patterns = append(opts.patterns, exp)\n\t\topts.excludedPathCounter[exp] = 0\n\t}\n\n\treturn opts, nil\n}\n\nfunc (o RunnerOptions) MatchAnyPattern(path string) (bool, error) {\n\tif len(o.patterns) == 0 {\n\t\treturn false, nil\n\t}\n\n\tabs, err := filepath.Abs(path)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\trel, err := filepath.Rel(o.basePath, abs)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tfor _, pattern := range o.patterns {\n\t\tif pattern.MatchString(rel) {\n\t\t\to.excludedPathCounter[pattern]++\n\t\t\treturn true, nil\n\t\t}\n\t}\n\n\treturn false, nil\n}\n\nfunc skipDir(name string) bool {\n\tswitch name {\n\tcase \"vendor\", \"testdata\", \"node_modules\":\n\t\treturn true\n\n\tdefault:\n\t\treturn strings.HasPrefix(name, \".\") && name != \".\"\n\t}\n}\n\nfunc isGoFile(f fs.FileInfo) bool {\n\treturn !f.IsDir() && !strings.HasPrefix(f.Name(), \".\") && strings.HasSuffix(f.Name(), \".go\")\n}\n"
  },
  {
    "path": "pkg/goformat/runner_test.go",
    "content": "package goformat\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nfunc TestRunnerOptions_MatchAnyPattern(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tcfg      *config.Config\n\t\tfilename string\n\n\t\tassertMatch   assert.BoolAssertionFunc\n\t\texpectedCount int\n\t}{\n\t\t{\n\t\t\tdesc: \"match\",\n\t\t\tcfg: &config.Config{\n\t\t\t\tFormatters: config.Formatters{\n\t\t\t\t\tExclusions: config.FormatterExclusions{\n\t\t\t\t\t\tPaths: []string{`generated\\.go`},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfilename:      \"generated.go\",\n\t\t\tassertMatch:   assert.True,\n\t\t\texpectedCount: 1,\n\t\t},\n\t\t{\n\t\t\tdesc: \"no match\",\n\t\t\tcfg: &config.Config{\n\t\t\t\tFormatters: config.Formatters{\n\t\t\t\t\tExclusions: config.FormatterExclusions{\n\t\t\t\t\t\tPaths: []string{`excluded\\.go`},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfilename:      \"test.go\",\n\t\t\tassertMatch:   assert.False,\n\t\t\texpectedCount: 0,\n\t\t},\n\t\t{\n\t\t\tdesc:        \"no patterns\",\n\t\t\tcfg:         &config.Config{},\n\t\t\tfilename:    \"test.go\",\n\t\t\tassertMatch: assert.False,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttmpDir := t.TempDir()\n\n\t\t\ttestFile := filepath.Join(tmpDir, test.filename)\n\n\t\t\terr := os.WriteFile(testFile, []byte(\"package main\"), 0o600)\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttest.cfg.SetConfigDir(tmpDir)\n\n\t\t\topts, err := NewRunnerOptions(test.cfg, false, false, false)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tmatch, err := opts.MatchAnyPattern(testFile)\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttest.assertMatch(t, match)\n\n\t\t\trequire.Len(t, opts.patterns, len(test.cfg.Formatters.Exclusions.Paths))\n\n\t\t\tif len(opts.patterns) == 0 {\n\t\t\t\tassert.Empty(t, opts.excludedPathCounter)\n\t\t\t} else {\n\t\t\t\tassert.Equal(t, test.expectedCount, opts.excludedPathCounter[opts.patterns[0]])\n\t\t\t}\n\t\t})\n\t}\n}\n\n// File structure:\n//\n//\ttmp\n//\t├── project (`realDir`)\n//\t│   ├── .golangci.yml\n//\t│   └── test.go\n//\t└── somewhere\n//\t    └── symlink (to \"project\")\nfunc TestRunnerOptions_MatchAnyPattern_withSymlinks(t *testing.T) {\n\ttmpDir := t.TempDir()\n\n\ttestFile := filepath.Join(tmpDir, \"project\", \"test.go\")\n\n\trealDir := filepath.Dir(testFile)\n\n\terr := os.MkdirAll(realDir, 0o755)\n\trequire.NoError(t, err)\n\n\terr = os.WriteFile(testFile, []byte(\"package main\"), 0o600)\n\trequire.NoError(t, err)\n\n\tsymlink := filepath.Join(tmpDir, \"somewhere\", \"symlink\")\n\n\terr = os.MkdirAll(filepath.Dir(symlink), 0o755)\n\trequire.NoError(t, err)\n\n\terr = os.Symlink(realDir, symlink)\n\trequire.NoError(t, err)\n\n\tcfg := &config.Config{\n\t\tFormatters: config.Formatters{\n\t\t\tExclusions: config.FormatterExclusions{\n\t\t\t\tPaths: []string{`^[^/\\\\]+\\.go$`},\n\t\t\t},\n\t\t},\n\t}\n\n\tcfg.SetConfigDir(symlink)\n\n\topts, err := NewRunnerOptions(cfg, false, false, false)\n\trequire.NoError(t, err)\n\n\tmatch, err := opts.MatchAnyPattern(filepath.Join(symlink, \"test.go\"))\n\trequire.NoError(t, err)\n\n\tassert.True(t, match)\n\n\trequire.NotEmpty(t, opts.patterns)\n\trequire.Len(t, opts.patterns, len(cfg.Formatters.Exclusions.Paths))\n\n\tassert.Equal(t, 1, opts.excludedPathCounter[opts.patterns[0]])\n}\n"
  },
  {
    "path": "pkg/goformatters/analyzer.go",
    "content": "package goformatters\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/rogpeppe/go-internal/diff\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\n// NewAnalyzer converts a [Formatter] to an [analysis.Analyzer].\nfunc NewAnalyzer(logger logutils.Log, doc string, formatter Formatter) *analysis.Analyzer {\n\treturn &analysis.Analyzer{\n\t\tName: formatter.Name(),\n\t\tDoc:  doc,\n\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\tfor _, file := range pass.Files {\n\t\t\t\tposition, isGoFile := goanalysis.GetGoFilePosition(pass, file)\n\t\t\t\tif !isGoFile {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tinput, err := os.ReadFile(position.Filename)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"unable to open file %s: %w\", position.Filename, err)\n\t\t\t\t}\n\n\t\t\t\toutput, err := formatter.Format(position.Filename, input)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error while running %s: %w\", formatter.Name(), err)\n\t\t\t\t}\n\n\t\t\t\tif !bytes.Equal(input, output) {\n\t\t\t\t\tnewName := filepath.ToSlash(position.Filename)\n\t\t\t\t\toldName := newName + \".orig\"\n\n\t\t\t\t\tpatch := diff.Diff(oldName, input, newName, output)\n\n\t\t\t\t\terr = internal.ExtractDiagnosticFromPatch(pass, file, patch, logger)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"can't extract issues from %s diff output %q: %w\", formatter.Name(), patch, err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil, nil\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "pkg/goformatters/formatters.go",
    "content": "package goformatters\n\ntype Formatter interface {\n\tName() string\n\tFormat(filename string, src []byte) ([]byte, error)\n}\n"
  },
  {
    "path": "pkg/goformatters/gci/gci.go",
    "content": "package gci\n\nimport (\n\t\"context\"\n\t\"go/format\"\n\n\tgcicfg \"github.com/daixiang0/gci/pkg/config\"\n\t\"github.com/daixiang0/gci/pkg/gci\"\n\t\"github.com/daixiang0/gci/pkg/log\"\n\t\"github.com/ldez/grignotin/gomod\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\tgcicfgi \"github.com/golangci/golangci-lint/v2/pkg/goformatters/gci/internal/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/internal\"\n)\n\nconst Name = \"gci\"\n\ntype Formatter struct {\n\tconfig *gcicfg.Config\n}\n\nfunc New(settings *config.GciSettings) (*Formatter, error) {\n\tlog.InitLogger()\n\t_ = log.L().Sync()\n\n\tmodPath, err := gomod.GetModulePath(context.Background())\n\tif err != nil {\n\t\tinternal.FormatterLogger.Errorf(\"gci: %v\", err)\n\t}\n\n\tcfg := gcicfgi.YamlConfig{\n\t\tCfg: gcicfg.BoolConfig{\n\t\t\tNoInlineComments: settings.NoInlineComments,\n\t\t\tNoPrefixComments: settings.NoPrefixComments,\n\t\t\tCustomOrder:      settings.CustomOrder,\n\t\t\tNoLexOrder:       settings.NoLexOrder,\n\n\t\t\t// Should be managed with `formatters.exclusions.generated`.\n\t\t\tSkipGenerated: false,\n\t\t},\n\t\tSectionStrings: settings.Sections,\n\t\tModPath:        modPath,\n\t}\n\n\tparsedCfg, err := cfg.Parse()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &Formatter{config: &gcicfg.Config{\n\t\tBoolConfig:        parsedCfg.BoolConfig,\n\t\tSections:          parsedCfg.Sections,\n\t\tSectionSeparators: parsedCfg.SectionSeparators,\n\t}}, nil\n}\n\nfunc (*Formatter) Name() string {\n\treturn Name\n}\n\nfunc (f *Formatter) Format(filename string, src []byte) ([]byte, error) {\n\t_, formatted, err := gci.LoadFormat(src, filename, *f.config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// gci format the code only when the imports are modified,\n\t// this produced inconsistencies.\n\t// To be always consistent, the code should always be formatted.\n\t// https://github.com/daixiang0/gci/blob/c4f689991095c0e54843dca76fb9c3bad58ec5c7/pkg/gci/gci.go#L148-L151\n\t// https://github.com/daixiang0/gci/blob/c4f689991095c0e54843dca76fb9c3bad58ec5c7/pkg/gci/gci.go#L215\n\treturn format.Source(formatted)\n}\n"
  },
  {
    "path": "pkg/goformatters/gci/internal/LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2020, Xiang Dai\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "pkg/goformatters/gci/internal/config/config.go",
    "content": "package config\n\nimport (\n\t\"sort\"\n\t\"strings\"\n\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/daixiang0/gci/pkg/config\"\n\t\"github.com/daixiang0/gci/pkg/section\"\n\n\tsectioni \"github.com/golangci/golangci-lint/v2/pkg/goformatters/gci/internal/section\"\n)\n\nvar defaultOrder = map[string]int{\n\tsection.StandardType:    0,\n\tsection.DefaultType:     1,\n\tsection.CustomType:      2,\n\tsection.BlankType:       3,\n\tsection.DotType:         4,\n\tsection.AliasType:       5,\n\tsection.LocalModuleType: 6,\n}\n\ntype Config struct {\n\tconfig.BoolConfig\n\tSections          section.SectionList\n\tSectionSeparators section.SectionList\n}\n\ntype YamlConfig struct {\n\tCfg                     config.BoolConfig `yaml:\",inline\"`\n\tSectionStrings          []string          `yaml:\"sections\"`\n\tSectionSeparatorStrings []string          `yaml:\"sectionseparators\"`\n\n\t// Since history issue, Golangci-lint needs Analyzer to run and GCI add an Analyzer layer to integrate.\n\t// The ModPath param is only from analyzer.go, no need to set it in all other places.\n\tModPath string `yaml:\"-\"`\n}\n\nfunc (g YamlConfig) Parse() (*Config, error) {\n\tvar err error\n\n\tsections, err := sectioni.Parse(g.SectionStrings)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif sections == nil {\n\t\tsections = sectioni.DefaultSections()\n\t}\n\tif err := configureSections(sections, g.ModPath); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// if default order sorted sections\n\tif !g.Cfg.CustomOrder {\n\t\tsort.Slice(sections, func(i, j int) bool {\n\t\t\tsectionI, sectionJ := sections[i].Type(), sections[j].Type()\n\n\t\t\tif g.Cfg.NoLexOrder || strings.Compare(sectionI, sectionJ) != 0 {\n\t\t\t\treturn defaultOrder[sectionI] < defaultOrder[sectionJ]\n\t\t\t}\n\n\t\t\treturn strings.Compare(sections[i].String(), sections[j].String()) < 0\n\t\t})\n\t}\n\n\tsectionSeparators, err := sectioni.Parse(g.SectionSeparatorStrings)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif sectionSeparators == nil {\n\t\tsectionSeparators = section.DefaultSectionSeparators()\n\t}\n\n\treturn &Config{g.Cfg, sections, sectionSeparators}, nil\n}\n\nfunc ParseConfig(in string) (*Config, error) {\n\tconfig := YamlConfig{}\n\n\terr := yaml.Unmarshal([]byte(in), &config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tgciCfg, err := config.Parse()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn gciCfg, nil\n}\n\n// configureSections now only do golang module path finding.\n// Since history issue, Golangci-lint needs Analyzer to run and GCI add an Analyzer layer to integrate.\n// The path param is from analyzer.go, in all other places should pass empty string.\nfunc configureSections(sections section.SectionList, path string) error {\n\tfor _, sec := range sections {\n\t\tswitch s := sec.(type) {\n\t\tcase *section.LocalModule:\n\t\t\tif err := s.Configure(path); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/goformatters/gci/internal/readme.md",
    "content": "Code borrowed from gci and modified to use new std packages.\n\nhttps://github.com/daixiang0/gci/pull/227\n"
  },
  {
    "path": "pkg/goformatters/gci/internal/section/parser.go",
    "content": "package section\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/daixiang0/gci/pkg/section\"\n)\n\nfunc Parse(data []string) (section.SectionList, error) {\n\tif len(data) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tvar list section.SectionList\n\tvar errString string\n\tfor _, d := range data {\n\t\ts := strings.ToLower(d)\n\t\tif len(s) == 0 {\n\t\t\treturn nil, nil\n\t\t}\n\n\t\tif s == \"default\" {\n\t\t\tlist = append(list, section.Default{})\n\t\t} else if s == \"standard\" {\n\t\t\tlist = append(list, Standard{})\n\t\t} else if s == \"newline\" {\n\t\t\tlist = append(list, section.NewLine{})\n\t\t} else if strings.HasPrefix(s, \"prefix(\") && len(d) > 8 {\n\t\t\tlist = append(list, section.Custom{Prefix: d[7 : len(d)-1]})\n\t\t} else if strings.HasPrefix(s, \"commentline(\") && len(d) > 13 {\n\t\t\tlist = append(list, section.Custom{Prefix: d[12 : len(d)-1]})\n\t\t} else if s == \"dot\" {\n\t\t\tlist = append(list, section.Dot{})\n\t\t} else if s == \"blank\" {\n\t\t\tlist = append(list, section.Blank{})\n\t\t} else if s == \"alias\" {\n\t\t\tlist = append(list, section.Alias{})\n\t\t} else if s == \"localmodule\" {\n\t\t\t// pointer because we need to mutate the section at configuration time\n\t\t\tlist = append(list, &section.LocalModule{})\n\t\t} else {\n\t\t\terrString += fmt.Sprintf(\" %s\", s)\n\t\t}\n\t}\n\tif errString != \"\" {\n\t\treturn nil, errors.New(fmt.Sprintf(\"invalid params:%s\", errString))\n\t}\n\treturn list, nil\n}\n"
  },
  {
    "path": "pkg/goformatters/gci/internal/section/section.go",
    "content": "package section\n\nimport \"github.com/daixiang0/gci/pkg/section\"\n\nfunc DefaultSections() section.SectionList {\n\treturn section.SectionList{Standard{}, section.Default{}}\n}\n"
  },
  {
    "path": "pkg/goformatters/gci/internal/section/standard.go",
    "content": "package section\n\nimport (\n\t\"github.com/daixiang0/gci/pkg/parse\"\n\t\"github.com/daixiang0/gci/pkg/specificity\"\n)\n\nconst StandardType = \"standard\"\n\ntype Standard struct{}\n\nfunc (s Standard) MatchSpecificity(spec *parse.GciImports) specificity.MatchSpecificity {\n\tif isStandard(spec.Path) {\n\t\treturn specificity.StandardMatch{}\n\t}\n\treturn specificity.MisMatch{}\n}\n\nfunc (s Standard) String() string {\n\treturn StandardType\n}\n\nfunc (s Standard) Type() string {\n\treturn StandardType\n}\n\nfunc isStandard(pkg string) bool {\n\t_, ok := standardPackages[pkg]\n\treturn ok\n}\n"
  },
  {
    "path": "pkg/goformatters/gci/internal/section/standard_list.go",
    "content": "package section\n\n// Code generated based on go1.26.0 X:boringcrypto,arenas,jsonv2,runtimesecret. DO NOT EDIT.\n\nvar standardPackages = map[string]struct{}{\n\t\"archive/tar\":            {},\n\t\"archive/zip\":            {},\n\t\"arena\":                  {},\n\t\"bufio\":                  {},\n\t\"bytes\":                  {},\n\t\"cmp\":                    {},\n\t\"compress/bzip2\":         {},\n\t\"compress/flate\":         {},\n\t\"compress/gzip\":          {},\n\t\"compress/lzw\":           {},\n\t\"compress/zlib\":          {},\n\t\"container/heap\":         {},\n\t\"container/list\":         {},\n\t\"container/ring\":         {},\n\t\"context\":                {},\n\t\"crypto\":                 {},\n\t\"crypto/aes\":             {},\n\t\"crypto/boring\":          {},\n\t\"crypto/cipher\":          {},\n\t\"crypto/des\":             {},\n\t\"crypto/dsa\":             {},\n\t\"crypto/ecdh\":            {},\n\t\"crypto/ecdsa\":           {},\n\t\"crypto/ed25519\":         {},\n\t\"crypto/elliptic\":        {},\n\t\"crypto/fips140\":         {},\n\t\"crypto/hkdf\":            {},\n\t\"crypto/hmac\":            {},\n\t\"crypto/hpke\":            {},\n\t\"crypto/md5\":             {},\n\t\"crypto/mlkem\":           {},\n\t\"crypto/mlkem/mlkemtest\": {},\n\t\"crypto/pbkdf2\":          {},\n\t\"crypto/rand\":            {},\n\t\"crypto/rc4\":             {},\n\t\"crypto/rsa\":             {},\n\t\"crypto/sha1\":            {},\n\t\"crypto/sha256\":          {},\n\t\"crypto/sha3\":            {},\n\t\"crypto/sha512\":          {},\n\t\"crypto/subtle\":          {},\n\t\"crypto/tls\":             {},\n\t\"crypto/tls/fipsonly\":    {},\n\t\"crypto/x509\":            {},\n\t\"crypto/x509/pkix\":       {},\n\t\"database/sql\":           {},\n\t\"database/sql/driver\":    {},\n\t\"debug/buildinfo\":        {},\n\t\"debug/dwarf\":            {},\n\t\"debug/elf\":              {},\n\t\"debug/gosym\":            {},\n\t\"debug/macho\":            {},\n\t\"debug/pe\":               {},\n\t\"debug/plan9obj\":         {},\n\t\"embed\":                  {},\n\t\"encoding\":               {},\n\t\"encoding/ascii85\":       {},\n\t\"encoding/asn1\":          {},\n\t\"encoding/base32\":        {},\n\t\"encoding/base64\":        {},\n\t\"encoding/binary\":        {},\n\t\"encoding/csv\":           {},\n\t\"encoding/gob\":           {},\n\t\"encoding/hex\":           {},\n\t\"encoding/json\":          {},\n\t\"encoding/json/jsontext\": {},\n\t\"encoding/json/v2\":       {},\n\t\"encoding/pem\":           {},\n\t\"encoding/xml\":           {},\n\t\"errors\":                 {},\n\t\"expvar\":                 {},\n\t\"flag\":                   {},\n\t\"fmt\":                    {},\n\t\"go/ast\":                 {},\n\t\"go/build\":               {},\n\t\"go/build/constraint\":    {},\n\t\"go/constant\":            {},\n\t\"go/doc\":                 {},\n\t\"go/doc/comment\":         {},\n\t\"go/format\":              {},\n\t\"go/importer\":            {},\n\t\"go/parser\":              {},\n\t\"go/printer\":             {},\n\t\"go/scanner\":             {},\n\t\"go/token\":               {},\n\t\"go/types\":               {},\n\t\"go/version\":             {},\n\t\"hash\":                   {},\n\t\"hash/adler32\":           {},\n\t\"hash/crc32\":             {},\n\t\"hash/crc64\":             {},\n\t\"hash/fnv\":               {},\n\t\"hash/maphash\":           {},\n\t\"html\":                   {},\n\t\"html/template\":          {},\n\t\"image\":                  {},\n\t\"image/color\":            {},\n\t\"image/color/palette\":    {},\n\t\"image/draw\":             {},\n\t\"image/gif\":              {},\n\t\"image/jpeg\":             {},\n\t\"image/png\":              {},\n\t\"index/suffixarray\":      {},\n\t\"io\":                     {},\n\t\"io/fs\":                  {},\n\t\"io/ioutil\":              {},\n\t\"iter\":                   {},\n\t\"log\":                    {},\n\t\"log/slog\":               {},\n\t\"log/syslog\":             {},\n\t\"maps\":                   {},\n\t\"math\":                   {},\n\t\"math/big\":               {},\n\t\"math/bits\":              {},\n\t\"math/cmplx\":             {},\n\t\"math/rand\":              {},\n\t\"math/rand/v2\":           {},\n\t\"mime\":                   {},\n\t\"mime/multipart\":         {},\n\t\"mime/quotedprintable\":   {},\n\t\"net\":                    {},\n\t\"net/http\":               {},\n\t\"net/http/cgi\":           {},\n\t\"net/http/cookiejar\":     {},\n\t\"net/http/fcgi\":          {},\n\t\"net/http/httptest\":      {},\n\t\"net/http/httptrace\":     {},\n\t\"net/http/httputil\":      {},\n\t\"net/http/pprof\":         {},\n\t\"net/mail\":               {},\n\t\"net/netip\":              {},\n\t\"net/rpc\":                {},\n\t\"net/rpc/jsonrpc\":        {},\n\t\"net/smtp\":               {},\n\t\"net/textproto\":          {},\n\t\"net/url\":                {},\n\t\"os\":                     {},\n\t\"os/exec\":                {},\n\t\"os/signal\":              {},\n\t\"os/user\":                {},\n\t\"path\":                   {},\n\t\"path/filepath\":          {},\n\t\"plugin\":                 {},\n\t\"reflect\":                {},\n\t\"regexp\":                 {},\n\t\"regexp/syntax\":          {},\n\t\"runtime\":                {},\n\t\"runtime/cgo\":            {},\n\t\"runtime/coverage\":       {},\n\t\"runtime/debug\":          {},\n\t\"runtime/metrics\":        {},\n\t\"runtime/pprof\":          {},\n\t\"runtime/race\":           {},\n\t\"runtime/secret\":         {},\n\t\"runtime/trace\":          {},\n\t\"slices\":                 {},\n\t\"sort\":                   {},\n\t\"strconv\":                {},\n\t\"strings\":                {},\n\t\"structs\":                {},\n\t\"sync\":                   {},\n\t\"sync/atomic\":            {},\n\t\"syscall\":                {},\n\t\"syscall/js\":             {},\n\t\"testing\":                {},\n\t\"testing/cryptotest\":     {},\n\t\"testing/fstest\":         {},\n\t\"testing/iotest\":         {},\n\t\"testing/quick\":          {},\n\t\"testing/slogtest\":       {},\n\t\"testing/synctest\":       {},\n\t\"text/scanner\":           {},\n\t\"text/tabwriter\":         {},\n\t\"text/template\":          {},\n\t\"text/template/parse\":    {},\n\t\"time\":                   {},\n\t\"time/tzdata\":            {},\n\t\"unicode\":                {},\n\t\"unicode/utf16\":          {},\n\t\"unicode/utf8\":           {},\n\t\"unique\":                 {},\n\t\"unsafe\":                 {},\n\t\"weak\":                   {},\n}\n"
  },
  {
    "path": "pkg/goformatters/gofmt/gofmt.go",
    "content": "package gofmt\n\nimport (\n\t\"github.com/golangci/gofmt/gofmt\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nconst Name = \"gofmt\"\n\ntype Formatter struct {\n\toptions gofmt.Options\n}\n\nfunc New(settings *config.GoFmtSettings) *Formatter {\n\toptions := gofmt.Options{}\n\n\tif settings != nil {\n\t\toptions.NeedSimplify = settings.Simplify\n\n\t\tfor _, rule := range settings.RewriteRules {\n\t\t\toptions.RewriteRules = append(options.RewriteRules, gofmt.RewriteRule(rule))\n\t\t}\n\t}\n\n\treturn &Formatter{options: options}\n}\n\nfunc (*Formatter) Name() string {\n\treturn Name\n}\n\nfunc (f *Formatter) Format(filename string, src []byte) ([]byte, error) {\n\treturn gofmt.Source(filename, src, f.options)\n}\n"
  },
  {
    "path": "pkg/goformatters/gofumpt/gofumpt.go",
    "content": "package gofumpt\n\nimport (\n\t\"strings\"\n\n\tgofumpt \"mvdan.cc/gofumpt/format\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nconst Name = \"gofumpt\"\n\ntype Formatter struct {\n\toptions gofumpt.Options\n}\n\nfunc New(settings *config.GoFumptSettings, goVersion string) *Formatter {\n\tvar options gofumpt.Options\n\n\tif settings != nil {\n\t\toptions = gofumpt.Options{\n\t\t\tLangVersion: getLangVersion(goVersion),\n\t\t\tModulePath:  settings.ModulePath,\n\t\t\tExtraRules:  settings.ExtraRules,\n\t\t}\n\t}\n\n\treturn &Formatter{options: options}\n}\n\nfunc (*Formatter) Name() string {\n\treturn Name\n}\n\nfunc (f *Formatter) Format(_ string, src []byte) ([]byte, error) {\n\treturn gofumpt.Source(src, f.options)\n}\n\nfunc getLangVersion(v string) string {\n\treturn \"go\" + strings.TrimPrefix(v, \"go\")\n}\n"
  },
  {
    "path": "pkg/goformatters/goimports/goimports.go",
    "content": "package goimports\n\nimport (\n\t\"strings\"\n\n\t\"golang.org/x/tools/imports\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nconst Name = \"goimports\"\n\ntype Formatter struct{}\n\nfunc New(settings *config.GoImportsSettings) *Formatter {\n\tif settings != nil {\n\t\timports.LocalPrefix = strings.Join(settings.LocalPrefixes, \",\")\n\t}\n\n\treturn &Formatter{}\n}\n\nfunc (*Formatter) Name() string {\n\treturn Name\n}\n\nfunc (*Formatter) Format(filename string, src []byte) ([]byte, error) {\n\t// The `imports.LocalPrefix` (`settings.LocalPrefixes`) is a global var.\n\treturn imports.Process(filename, src, nil)\n}\n"
  },
  {
    "path": "pkg/goformatters/golines/golines.go",
    "content": "package golines\n\nimport (\n\t\"github.com/golangci/golines/shorten\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nconst Name = \"golines\"\n\ntype Formatter struct {\n\tshortener *shorten.Shortener\n}\n\nfunc New(settings *config.GoLinesSettings) *Formatter {\n\tcfg := &shorten.Config{}\n\n\tif settings != nil {\n\t\tcfg = &shorten.Config{\n\t\t\tMaxLen:          settings.MaxLen,\n\t\t\tTabLen:          settings.TabLen,\n\t\t\tKeepAnnotations: false, // golines debug (not usable inside golangci-lint)\n\t\t\tShortenComments: settings.ShortenComments,\n\t\t\tReformatTags:    settings.ReformatTags,\n\t\t\tDotFile:         \"\", // golines debug (not usable inside golangci-lint)\n\t\t\tChainSplitDots:  settings.ChainSplitDots,\n\t\t}\n\t}\n\n\treturn &Formatter{shortener: shorten.NewShortener(cfg)}\n}\n\nfunc (*Formatter) Name() string {\n\treturn Name\n}\n\nfunc (f *Formatter) Format(_ string, src []byte) ([]byte, error) {\n\treturn f.shortener.Process(src)\n}\n"
  },
  {
    "path": "pkg/goformatters/internal/commons.go",
    "content": "package internal\n\nimport \"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\n// FormatterLogger must be used only when the context logger is not available.\nvar FormatterLogger = logutils.NewStderrLog(logutils.DebugKeyFormatter)\n"
  },
  {
    "path": "pkg/goformatters/internal/diff.go",
    "content": "package internal\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/token\"\n\t\"slices\"\n\t\"strings\"\n\n\tdiffpkg \"github.com/sourcegraph/go-diff/diff\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype Change struct {\n\tFrom, To int\n\tNewLines []string\n}\n\ntype diffLineType string\n\nconst (\n\tdiffLineAdded    diffLineType = \"added\"\n\tdiffLineOriginal diffLineType = \"original\"\n\tdiffLineDeleted  diffLineType = \"deleted\"\n)\n\ntype diffLine struct {\n\toriginalNumber int // 1-based original line number\n\ttyp            diffLineType\n\tdata           string // \"+\" or \"-\" stripped line\n}\n\ntype hunkChangesParser struct {\n\t// needed because we merge currently added lines with the last original line\n\tlastOriginalLine *diffLine\n\n\t// if the first line of diff is an adding we save all additions to replacementLinesToPrepend\n\treplacementLinesToPrepend []string\n\n\tlog logutils.Log\n\n\tchanges []Change\n}\n\nfunc (p *hunkChangesParser) parse(h *diffpkg.Hunk) []Change {\n\tlines := parseDiffLines(h)\n\n\tfor i := 0; i < len(lines); {\n\t\tline := lines[i]\n\n\t\tif line.typ == diffLineOriginal {\n\t\t\tp.handleOriginalLine(lines, line, &i)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar deletedLines []diffLine\n\t\tfor ; i < len(lines) && lines[i].typ == diffLineDeleted; i++ {\n\t\t\tdeletedLines = append(deletedLines, lines[i])\n\t\t}\n\n\t\tvar addedLines []string\n\t\tfor ; i < len(lines) && lines[i].typ == diffLineAdded; i++ {\n\t\t\taddedLines = append(addedLines, lines[i].data)\n\t\t}\n\n\t\tif len(deletedLines) != 0 {\n\t\t\tp.handleDeletedLines(deletedLines, addedLines)\n\t\t\tcontinue\n\t\t}\n\n\t\t// no deletions, only additions\n\t\tp.handleAddedOnlyLines(addedLines)\n\t}\n\n\tif len(p.replacementLinesToPrepend) != 0 {\n\t\tp.log.Infof(\"The diff contains only additions: no original or deleted lines: %#v\", lines)\n\t\treturn nil\n\t}\n\n\treturn p.changes\n}\n\nfunc (p *hunkChangesParser) handleOriginalLine(lines []diffLine, line diffLine, i *int) {\n\tif len(p.replacementLinesToPrepend) == 0 {\n\t\tp.lastOriginalLine = &line\n\t\t*i++\n\t\treturn\n\t}\n\n\t// check following added lines for the case:\n\t// + added line 1\n\t// original line\n\t// + added line 2\n\n\t*i++\n\tvar followingAddedLines []string\n\tfor ; *i < len(lines) && lines[*i].typ == diffLineAdded; *i++ {\n\t\tfollowingAddedLines = append(followingAddedLines, lines[*i].data)\n\t}\n\n\tchange := Change{\n\t\tFrom:     line.originalNumber,\n\t\tTo:       line.originalNumber,\n\t\tNewLines: slices.Concat(p.replacementLinesToPrepend, []string{line.data}, followingAddedLines),\n\t}\n\tp.changes = append(p.changes, change)\n\n\tp.replacementLinesToPrepend = nil\n\tp.lastOriginalLine = &line\n}\n\nfunc (p *hunkChangesParser) handleDeletedLines(deletedLines []diffLine, addedLines []string) {\n\tchange := Change{\n\t\tFrom: deletedLines[0].originalNumber,\n\t\tTo:   deletedLines[len(deletedLines)-1].originalNumber,\n\t}\n\n\tswitch {\n\tcase len(addedLines) != 0:\n\t\tchange.NewLines = slices.Concat(p.replacementLinesToPrepend, addedLines)\n\t\tp.replacementLinesToPrepend = nil\n\n\tcase len(p.replacementLinesToPrepend) != 0:\n\t\t// delete-only change with possible prepending\n\t\tchange.NewLines = slices.Clone(p.replacementLinesToPrepend)\n\t\tp.replacementLinesToPrepend = nil\n\t}\n\n\tp.changes = append(p.changes, change)\n}\n\nfunc (p *hunkChangesParser) handleAddedOnlyLines(addedLines []string) {\n\tif p.lastOriginalLine == nil {\n\t\t// the first line is added; the diff looks like:\n\t\t// 1. + ...\n\t\t// 2. - ...\n\t\t// or\n\t\t// 1. + ...\n\t\t// 2. ...\n\n\t\tp.replacementLinesToPrepend = addedLines\n\n\t\treturn\n\t}\n\n\t// add-only change merged into the last original line with possible prepending\n\tchange := Change{\n\t\tFrom:     p.lastOriginalLine.originalNumber,\n\t\tTo:       p.lastOriginalLine.originalNumber,\n\t\tNewLines: slices.Concat(p.replacementLinesToPrepend, []string{p.lastOriginalLine.data}, addedLines),\n\t}\n\n\tp.changes = append(p.changes, change)\n\n\tp.replacementLinesToPrepend = nil\n}\n\nfunc parseDiffLines(h *diffpkg.Hunk) []diffLine {\n\tlines := bytes.Split(h.Body, []byte{'\\n'})\n\n\tcurrentOriginalLineNumber := int(h.OrigStartLine)\n\n\tvar diffLines []diffLine\n\n\tfor i, line := range lines {\n\t\tdl := diffLine{\n\t\t\toriginalNumber: currentOriginalLineNumber,\n\t\t}\n\n\t\tif i == len(lines)-1 && len(line) == 0 {\n\t\t\t// handle last \\n: don't add an empty original line\n\t\t\tbreak\n\t\t}\n\n\t\tlineStr := string(line)\n\n\t\tswitch {\n\t\tcase strings.HasPrefix(lineStr, \"-\"):\n\t\t\tdl.typ = diffLineDeleted\n\t\t\tdl.data = strings.TrimPrefix(lineStr, \"-\")\n\t\t\tcurrentOriginalLineNumber++\n\n\t\tcase strings.HasPrefix(lineStr, \"+\"):\n\t\t\tdl.typ = diffLineAdded\n\t\t\tdl.data = strings.TrimPrefix(lineStr, \"+\")\n\n\t\tdefault:\n\t\t\tdl.typ = diffLineOriginal\n\t\t\tdl.data = strings.TrimPrefix(lineStr, \" \")\n\t\t\tcurrentOriginalLineNumber++\n\t\t}\n\n\t\tdiffLines = append(diffLines, dl)\n\t}\n\n\t// if > 0, then the original file had a 'No newline at end of file' mark\n\tif h.OrigNoNewlineAt > 0 {\n\t\tdl := diffLine{\n\t\t\toriginalNumber: currentOriginalLineNumber + 1,\n\t\t\ttyp:            diffLineAdded,\n\t\t\tdata:           \"\",\n\t\t}\n\t\tdiffLines = append(diffLines, dl)\n\t}\n\n\treturn diffLines\n}\n\nfunc ExtractDiagnosticFromPatch(\n\tpass *analysis.Pass,\n\tfile *ast.File,\n\tpatch []byte,\n\tlogger logutils.Log,\n) error {\n\tdiffs, err := diffpkg.ParseMultiFileDiff(patch)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't parse patch: %w\", err)\n\t}\n\n\tif len(diffs) == 0 {\n\t\treturn fmt.Errorf(\"got no diffs from patch parser: %s\", patch)\n\t}\n\n\tft := pass.Fset.File(file.Pos())\n\n\tadjLine := pass.Fset.PositionFor(file.Pos(), false).Line - pass.Fset.PositionFor(file.Pos(), true).Line\n\n\tfor _, d := range diffs {\n\t\tif len(d.Hunks) == 0 {\n\t\t\tlogger.Warnf(\"Got no hunks in diff %+v\", d)\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, hunk := range d.Hunks {\n\t\t\tp := hunkChangesParser{log: logger}\n\n\t\t\tchanges := p.parse(hunk)\n\n\t\t\tfor _, change := range changes {\n\t\t\t\tpass.Report(toDiagnostic(ft, change, adjLine))\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc toDiagnostic(ft *token.File, change Change, adjLine int) analysis.Diagnostic {\n\tfrom := min(change.From+adjLine, ft.LineCount())\n\n\tstart := ft.LineStart(from)\n\n\tend := goanalysis.EndOfLinePos(ft, change.To+adjLine)\n\n\treturn analysis.Diagnostic{\n\t\tPos:     start,\n\t\tEnd:     end,\n\t\tMessage: \"File is not properly formatted\",\n\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\tPos:     start,\n\t\t\t\tEnd:     end,\n\t\t\t\tNewText: []byte(strings.Join(change.NewLines, \"\\n\")),\n\t\t\t}},\n\t\t}},\n\t}\n}\n"
  },
  {
    "path": "pkg/goformatters/internal/diff_test.go",
    "content": "package internal\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\tdiffpkg \"github.com/sourcegraph/go-diff/diff\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/mock\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nfunc Test_parse(t *testing.T) {\n\ttestCases := []struct {\n\t\tdiff     string\n\t\tlog      logutils.Log\n\t\texpected []Change\n\t}{\n\t\t{\n\t\t\tdiff: \"delete_last_line.diff\",\n\t\t\texpected: []Change{{\n\t\t\t\tFrom: 10,\n\t\t\t\tTo:   10,\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdiff: \"delete_only_first_lines.diff\",\n\t\t\texpected: []Change{{\n\t\t\t\tFrom: 1,\n\t\t\t\tTo:   2,\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdiff: \"add_only.diff\",\n\t\t\texpected: []Change{{\n\t\t\t\tFrom: 2,\n\t\t\t\tTo:   2,\n\t\t\t\tNewLines: []string{\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"// added line\",\n\t\t\t\t},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdiff: \"add_only_different_lines.diff\",\n\t\t\texpected: []Change{\n\t\t\t\t{\n\t\t\t\t\tFrom: 4,\n\t\t\t\t\tTo:   4,\n\t\t\t\t\tNewLines: []string{\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"// add line 1\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFrom: 7,\n\t\t\t\t\tTo:   7,\n\t\t\t\t\tNewLines: []string{\n\t\t\t\t\t\t\"       Errorf(format string, args ...interface{})\",\n\t\t\t\t\t\t\"       // add line 2\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdiff: \"add_only_in_all_diff.diff\",\n\t\t\tlog: logutils.NewMockLog().\n\t\t\t\tOnInfof(\"The diff contains only additions: no original or deleted lines: %#v\", mock.Anything),\n\t\t},\n\t\t{\n\t\t\tdiff: \"add_only_multiple_lines.diff\",\n\t\t\texpected: []Change{{\n\t\t\t\tFrom: 4,\n\t\t\t\tTo:   4,\n\t\t\t\tNewLines: []string{\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"// add line 1\",\n\t\t\t\t\t\"// add line 2\",\n\t\t\t\t\t\"\",\n\t\t\t\t},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdiff: \"add_only_on_first_line.diff\",\n\t\t\texpected: []Change{{\n\t\t\t\tFrom: 1,\n\t\t\t\tTo:   1,\n\t\t\t\tNewLines: []string{\n\t\t\t\t\t\"// added line\",\n\t\t\t\t\t\"package logutil\",\n\t\t\t\t},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdiff: \"add_only_on_first_line_with_shared_original_line.diff\",\n\t\t\texpected: []Change{{\n\t\t\t\tFrom: 1,\n\t\t\t\tTo:   1,\n\t\t\t\tNewLines: []string{\n\t\t\t\t\t\"// added line 1\",\n\t\t\t\t\t\"package logutil\",\n\t\t\t\t\t\"// added line 2\",\n\t\t\t\t\t\"// added line 3\",\n\t\t\t\t},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdiff: \"replace_line.diff\",\n\t\t\texpected: []Change{{\n\t\t\t\tFrom:     1,\n\t\t\t\tTo:       1,\n\t\t\t\tNewLines: []string{\"package test2\"},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdiff: \"replace_line_after_first_line_adding.diff\",\n\t\t\texpected: []Change{\n\t\t\t\t{\n\t\t\t\t\tFrom: 1,\n\t\t\t\t\tTo:   1,\n\t\t\t\t\tNewLines: []string{\n\t\t\t\t\t\t\"// added line\",\n\t\t\t\t\t\t\"package logutil\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFrom: 3,\n\t\t\t\t\tTo:   3,\n\t\t\t\t\tNewLines: []string{\n\t\t\t\t\t\t\"// changed line\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdiff: \"gofmt_diff.diff\",\n\t\t\texpected: []Change{\n\t\t\t\t{\n\t\t\t\t\tFrom: 4,\n\t\t\t\t\tTo:   6,\n\t\t\t\t\tNewLines: []string{\n\t\t\t\t\t\t\"func gofmt(a, b int) int {\",\n\t\t\t\t\t\t\"       if a != b {\",\n\t\t\t\t\t\t\"               return 1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFrom: 8,\n\t\t\t\t\tTo:   8,\n\t\t\t\t\tNewLines: []string{\n\t\t\t\t\t\t\"       return 2\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.diff, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tdiff, err := os.ReadFile(filepath.Join(\"testdata\", test.diff))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tdiffs, err := diffpkg.ParseMultiFileDiff(diff)\n\t\t\tif err != nil {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\n\t\t\trequire.Len(t, diffs, 1)\n\n\t\t\thunks := diffs[0].Hunks\n\t\t\tassert.NotEmpty(t, hunks)\n\n\t\t\tvar changes []Change\n\t\t\tfor _, hunk := range hunks {\n\t\t\t\tp := hunkChangesParser{log: test.log}\n\n\t\t\t\tchanges = append(changes, p.parse(hunk)...)\n\t\t\t}\n\n\t\t\tassert.Equal(t, test.expected, changes)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/add_only.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..43d04bf 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -1,5 +1,6 @@\n package logutil\n\n+// added line\n type Func func(format string, args ...interface{})\n\n type Log interface {\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/add_only_different_lines.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..e5ed2ad 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -2,9 +2,12 @@ package logutil\n\n type Func func(format string, args ...interface{})\n\n+// add line 1\n+\n type Log interface {\n        Fatalf(format string, args ...interface{})\n        Errorf(format string, args ...interface{})\n+       // add line 2\n        Warnf(format string, args ...interface{})\n        Infof(format string, args ...interface{})\n\t\tDebugf(key string, format string, args ...interface{})\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/add_only_in_all_diff.diff",
    "content": "diff --git a/test.go b/test.go\nnew file mode 100644\nindex 0000000..6399915\n--- /dev/null\n+++ b/test.go\n@@ -0,0 +1,3 @@\n+package test\n+\n+// line\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/add_only_multiple_lines.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..3b83a94 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -2,6 +2,9 @@ package logutil\n\n type Func func(format string, args ...interface{})\n\n+// add line 1\n+// add line 2\n+\n type Log interface {\n        Fatalf(format string, args ...interface{})\n\t\tErrorf(format string, args ...interface{})\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/add_only_on_first_line.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..97e6660 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -1,3 +1,4 @@\n+// added line\n package logutil\n\n type Func func(format string, args ...interface{})\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/add_only_on_first_line_with_shared_original_line.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..7ff80c9 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -1,4 +1,7 @@\n+// added line 1\n package logutil\n+// added line 2\n+// added line 3\n\n type Func func(format string, args ...interface{})\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/delete_last_line.diff",
    "content": "diff --git i/main.go w/main.go\nindex ef3cbb7..52a7925 100644\n--- i/main.go\n+++ w/main.go\n@@ -7,4 +7,3 @@ import (\n func main() {\n        fmt.Println(\"hello world\")\n }\n-\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/delete_only_first_lines.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..0fb554e 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -1,5 +1,3 @@\n-package logutil\n-\n type Func func(format string, args ...interface{})\n\n type Log interface {\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/gofmt_diff.diff",
    "content": "diff --git a/gofmt.go b/gofmt.go\nindex 2c9f78d..c0d5791 100644\n--- a/gofmt.go\n+++ b/gofmt.go\n@@ -1,9 +1,9 @@\n //golangcitest:args -Egofmt\n package p\n\n- func gofmt(a, b int) int {\n-         if a != b {\n-                 return 1\n+func gofmt(a, b int) int {\n+       if a != b {\n+               return 1\n        }\n-         return 2\n+       return 2\n }\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/replace_line.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..c2a8516 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -1,4 +1,4 @@\n-package logutil\n+package test2\n\n type Func func(format string, args ...interface{})\n"
  },
  {
    "path": "pkg/goformatters/internal/testdata/replace_line_after_first_line_adding.diff",
    "content": "diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go\nindex 258b340..43fc0de 100644\n--- a/internal/shared/logutil/log.go\n+++ b/internal/shared/logutil/log.go\n@@ -1,6 +1,7 @@\n+// added line\n package logutil\n\n-type Func func(format string, args ...interface{})\n+// changed line\n\n type Log interface {\n        Fatalf(format string, args ...interface{})"
  },
  {
    "path": "pkg/goformatters/meta_formatter.go",
    "content": "package goformatters\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gci\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofmt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofumpt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/goimports\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/golines\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/swaggo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype MetaFormatter struct {\n\tlog        logutils.Log\n\tformatters []Formatter\n}\n\nfunc NewMetaFormatter(log logutils.Log, cfg *config.Formatters, runCfg *config.Run) (*MetaFormatter, error) {\n\tfor _, formatter := range cfg.Enable {\n\t\tif !IsFormatter(formatter) {\n\t\t\treturn nil, fmt.Errorf(\"invalid formatter %q\", formatter)\n\t\t}\n\t}\n\n\tm := &MetaFormatter{log: log}\n\n\tif slices.Contains(cfg.Enable, gofmt.Name) {\n\t\tm.formatters = append(m.formatters, gofmt.New(&cfg.Settings.GoFmt))\n\t}\n\n\tif slices.Contains(cfg.Enable, gofumpt.Name) {\n\t\tm.formatters = append(m.formatters, gofumpt.New(&cfg.Settings.GoFumpt, runCfg.Go))\n\t}\n\n\tif slices.Contains(cfg.Enable, goimports.Name) {\n\t\tm.formatters = append(m.formatters, goimports.New(&cfg.Settings.GoImports))\n\t}\n\n\tif slices.Contains(cfg.Enable, swaggo.Name) {\n\t\tm.formatters = append(m.formatters, swaggo.New())\n\t}\n\n\t// gci is a last because the only goal of gci is to handle imports.\n\tif slices.Contains(cfg.Enable, gci.Name) {\n\t\tformatter, err := gci.New(&cfg.Settings.Gci)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"gci: creating formatter: %w\", err)\n\t\t}\n\n\t\tm.formatters = append(m.formatters, formatter)\n\t}\n\n\t// golines calls `format.Source()` internally so no need to format after it.\n\tif slices.Contains(cfg.Enable, golines.Name) {\n\t\tm.formatters = append(m.formatters, golines.New(&cfg.Settings.GoLines))\n\t}\n\n\treturn m, nil\n}\n\nfunc (m *MetaFormatter) Format(filename string, src []byte) []byte {\n\tif len(m.formatters) == 0 {\n\t\tdata, err := format.Source(src)\n\t\tif err != nil {\n\t\t\tm.log.Warnf(\"(fmt) formatting file %s: %v\", filename, err)\n\t\t\treturn src\n\t\t}\n\n\t\treturn data\n\t}\n\n\tdata := bytes.Clone(src)\n\n\tfor _, formatter := range m.formatters {\n\t\tformatted, err := formatter.Format(filename, data)\n\t\tif err != nil {\n\t\t\tm.log.Warnf(\"(%s) formatting file %s: %v\", formatter.Name(), filename, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tdata = formatted\n\t}\n\n\treturn data\n}\n\nfunc IsFormatter(name string) bool {\n\treturn slices.Contains([]string{gofmt.Name, gofumpt.Name, goimports.Name, gci.Name, golines.Name, swaggo.Name}, name)\n}\n"
  },
  {
    "path": "pkg/goformatters/swaggo/swaggo.go",
    "content": "package swaggo\n\nimport \"github.com/golangci/swaggoswag\"\n\nconst Name = \"swaggo\"\n\ntype Formatter struct {\n\tformatter *swaggoswag.Formatter\n}\n\nfunc New() *Formatter {\n\treturn &Formatter{\n\t\tformatter: swaggoswag.NewFormatter(),\n\t}\n}\n\nfunc (*Formatter) Name() string {\n\treturn Name\n}\n\nfunc (f *Formatter) Format(path string, src []byte) ([]byte, error) {\n\treturn f.formatter.Format(path, src)\n}\n"
  },
  {
    "path": "pkg/golinters/arangolint/arangolint.go",
    "content": "package arangolint\n\nimport (\n\t\"go.augendre.info/arangolint/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewAnalyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/arangolint/arangolint_integration_test.go",
    "content": "package arangolint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/arangolint/testdata/arangolint.go",
    "content": "//golangcitest:args -Earangolint\npackage arangolint\n\nimport (\n\t\"context\"\n\n\t\"github.com/arangodb/go-driver/v2/arangodb\"\n)\n\nfunc _() {\n\tctx := context.Background()\n\tarangoClient := arangodb.NewClient(nil)\n\tdb, _ := arangoClient.GetDatabase(ctx, \"name\", nil)\n\n\t// direct nil\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, nil)           // want \"missing AllowImplicit option\"\n\ttrx, _ := db.BeginTransaction(ctx, arangodb.TransactionCollections{}, nil) // want \"missing AllowImplicit option\"\n\t_ = trx\n\n\t// direct missing\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{LockTimeout: 0})          // want \"missing AllowImplicit option\"\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{LockTimeout: 0}) // want \"missing AllowImplicit option\"\n\n\t// direct false\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: false})\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: false})\n\n\t// direct true\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true})\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true})\n\n\t// direct with other fields\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true, LockTimeout: 0})\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true, LockTimeout: 0})\n}\n"
  },
  {
    "path": "pkg/golinters/arangolint/testdata/arangolint_cgo.go",
    "content": "//golangcitest:args -Earangolint\npackage arangolint\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"unsafe\"\n\n\t\"github.com/arangodb/go-driver/v2/arangodb\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tctx := context.Background()\n\tarangoClient := arangodb.NewClient(nil)\n\tdb, _ := arangoClient.GetDatabase(ctx, \"name\", nil)\n\n\t// direct nil\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, nil)           // want \"missing AllowImplicit option\"\n\ttrx, _ := db.BeginTransaction(ctx, arangodb.TransactionCollections{}, nil) // want \"missing AllowImplicit option\"\n\t_ = trx\n\n\t// direct missing\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{LockTimeout: 0})          // want \"missing AllowImplicit option\"\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{LockTimeout: 0}) // want \"missing AllowImplicit option\"\n\n\t// direct false\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: false})\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: false})\n\n\t// direct true\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true})\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true})\n\n\t// direct with other fields\n\tdb.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true, LockTimeout: 0})\n\ttrx, _ = db.BeginTransaction(ctx, arangodb.TransactionCollections{}, &arangodb.BeginTransactionOptions{AllowImplicit: true, LockTimeout: 0})\n}\n"
  },
  {
    "path": "pkg/golinters/arangolint/testdata/go.mod",
    "content": "module arangolint\n\ngo 1.25.0\n\nrequire github.com/arangodb/go-driver/v2 v2.2.0\n\nrequire (\n\tgithub.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e // indirect\n\tgithub.com/dchest/siphash v1.2.3 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/kkdai/maglev v0.2.0 // indirect\n\tgithub.com/mattn/go-colorable v0.1.14 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/rs/zerolog v1.34.0 // indirect\n\tgolang.org/x/net v0.46.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.30.0 // indirect\n)\n"
  },
  {
    "path": "pkg/golinters/arangolint/testdata/go.sum",
    "content": "github.com/arangodb/go-driver/v2 v2.2.0 h1:ndG0SVwT5kAslp62F1DBywA4KomcjNV78dROAix4chY=\ngithub.com/arangodb/go-driver/v2 v2.2.0/go.mod h1:UzpvhTGK5UQpTy29UmJz2jciiq5khct6seRNiqClstI=\ngithub.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e h1:Xg+hGrY2LcQBbxd0ZFdbGSyRKTYMZCfBbw/pMJFOk1g=\ngithub.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e/go.mod h1:mq7Shfa/CaixoDxiyAAc5jZ6CVBAyPaNQCGS7mkj4Ho=\ngithub.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dchest/siphash v1.2.2/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4=\ngithub.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA=\ngithub.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/kkdai/maglev v0.2.0 h1:w6DCW0kAA6fstZqXkrBrlgIC3jeIRXkjOYea/m6EK/Y=\ngithub.com/kkdai/maglev v0.2.0/go.mod h1:d+mt8Lmt3uqi9aRb/BnPjzD0fy+ETs1vVXiGRnqHVZ4=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=\ngithub.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=\ngithub.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=\ngithub.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngolang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=\ngolang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=\ngolang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "pkg/golinters/asasalint/asasalint.go",
    "content": "package asasalint\n\nimport (\n\t\"github.com/alingse/asasalint\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.AsasalintSettings) *goanalysis.Linter {\n\tcfg := asasalint.LinterSetting{}\n\tif settings != nil {\n\t\tcfg.Exclude = settings.Exclude\n\t\tcfg.NoBuiltinExclusions = !settings.UseBuiltinExclusions\n\n\t\t// Should be managed with `linters.exclusions.rules`.\n\t\tcfg.IgnoreTest = false\n\t}\n\n\tanalyzer, err := asasalint.NewAnalyzer(cfg)\n\tif err != nil {\n\t\tinternal.LinterLogger.Fatalf(\"asasalint: create analyzer: %v\", err)\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/asasalint/asasalint_integration_test.go",
    "content": "package asasalint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/asasalint/testdata/asasalint.go",
    "content": "//golangcitest:args -Easasalint\npackage testdata\n\nimport \"fmt\"\n\nfunc getArgsLength(args ...interface{}) int {\n\t// this line will not report as error\n\tfmt.Println(args)\n\treturn len(args)\n}\n\nfunc checkArgsLength(args ...interface{}) int {\n\treturn getArgsLength(args) // want `pass \\[\\]any as any to func getArgsLength func\\(args \\.\\.\\.interface\\{\\}\\)`\n}\n\nfunc someCall() {\n\tvar a = []interface{}{1, 2, 3}\n\tfmt.Println(checkArgsLength(a...) == getArgsLength(a)) // want `pass \\[\\]any as any to func getArgsLength func\\(args \\.\\.\\.interface\\{\\}\\)`\n\tfmt.Println(checkArgsLength(a...) == getArgsLength(a...))\n}\n"
  },
  {
    "path": "pkg/golinters/asasalint/testdata/asasalint_cgo.go",
    "content": "//golangcitest:args -Easasalint\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc getArgsLength(args ...interface{}) int {\n\t// this line will not report as error\n\tfmt.Println(args)\n\treturn len(args)\n}\n\nfunc checkArgsLength(args ...interface{}) int {\n\treturn getArgsLength(args) // want `pass \\[\\]any as any to func getArgsLength func\\(args \\.\\.\\.interface\\{\\}\\)`\n}\n\nfunc someCall() {\n\tvar a = []interface{}{1, 2, 3}\n\tfmt.Println(checkArgsLength(a...) == getArgsLength(a)) // want `pass \\[\\]any as any to func getArgsLength func\\(args \\.\\.\\.interface\\{\\}\\)`\n\tfmt.Println(checkArgsLength(a...) == getArgsLength(a...))\n}\n"
  },
  {
    "path": "pkg/golinters/asciicheck/asciicheck.go",
    "content": "package asciicheck\n\nimport (\n\t\"github.com/golangci/asciicheck\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(asciicheck.NewAnalyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/asciicheck/asciicheck_integration_test.go",
    "content": "package asciicheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/asciicheck/testdata/asciicheck.go",
    "content": "//golangcitest:args -Easciicheck\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\ntype AsciicheckTеstStruct struct { // want `identifier \"AsciicheckTеstStruct\" contain non-ASCII character: U\\+0435 'е'`\n\tDate time.Time\n}\n\ntype AsciicheckField struct{}\n\ntype AsciicheckJustStruct struct {\n\tTеst AsciicheckField // want `identifier \"Tеst\" contain non-ASCII character: U\\+0435 'е'`\n}\n\nfunc AsciicheckTеstFunc() { // want `identifier \"AsciicheckTеstFunc\" contain non-ASCII character: U\\+0435 'е'`\n\tvar tеstVar int // want `identifier \"tеstVar\" contain non-ASCII character: U\\+0435 'е'`\n\ttеstVar = 0\n\tfmt.Println(tеstVar)\n}\n"
  },
  {
    "path": "pkg/golinters/asciicheck/testdata/asciicheck_cgo.go",
    "content": "//golangcitest:args -Easciicheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype AsciicheckTеstStruct struct { // want `identifier \"AsciicheckTеstStruct\" contain non-ASCII character: U\\+0435 'е'`\n\tDate time.Time\n}\n\ntype AsciicheckField struct{}\n\ntype AsciicheckJustStruct struct {\n\tTеst AsciicheckField // want `identifier \"Tеst\" contain non-ASCII character: U\\+0435 'е'`\n}\n\nfunc AsciicheckTеstFunc() { // want `identifier \"AsciicheckTеstFunc\" contain non-ASCII character: U\\+0435 'е'`\n\tvar tеstVar int // want `identifier \"tеstVar\" contain non-ASCII character: U\\+0435 'е'`\n\ttеstVar = 0\n\tfmt.Println(tеstVar)\n}\n"
  },
  {
    "path": "pkg/golinters/bidichk/bidichk.go",
    "content": "package bidichk\n\nimport (\n\t\"strings\"\n\n\t\"github.com/breml/bidichk/pkg/bidichk\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.BiDiChkSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tvar opts []string\n\n\t\tif settings.LeftToRightEmbedding {\n\t\t\topts = append(opts, \"LEFT-TO-RIGHT-EMBEDDING\")\n\t\t}\n\t\tif settings.RightToLeftEmbedding {\n\t\t\topts = append(opts, \"RIGHT-TO-LEFT-EMBEDDING\")\n\t\t}\n\t\tif settings.PopDirectionalFormatting {\n\t\t\topts = append(opts, \"POP-DIRECTIONAL-FORMATTING\")\n\t\t}\n\t\tif settings.LeftToRightOverride {\n\t\t\topts = append(opts, \"LEFT-TO-RIGHT-OVERRIDE\")\n\t\t}\n\t\tif settings.RightToLeftOverride {\n\t\t\topts = append(opts, \"RIGHT-TO-LEFT-OVERRIDE\")\n\t\t}\n\t\tif settings.LeftToRightIsolate {\n\t\t\topts = append(opts, \"LEFT-TO-RIGHT-ISOLATE\")\n\t\t}\n\t\tif settings.RightToLeftIsolate {\n\t\t\topts = append(opts, \"RIGHT-TO-LEFT-ISOLATE\")\n\t\t}\n\t\tif settings.FirstStrongIsolate {\n\t\t\topts = append(opts, \"FIRST-STRONG-ISOLATE\")\n\t\t}\n\t\tif settings.PopDirectionalIsolate {\n\t\t\topts = append(opts, \"POP-DIRECTIONAL-ISOLATE\")\n\t\t}\n\n\t\tcfg = map[string]any{\n\t\t\t\"disallowed-runes\": strings.Join(opts, \",\"),\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(bidichk.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/bidichk/bidichk_integration_test.go",
    "content": "package bidichk\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/bidichk/testdata/bidichk.go",
    "content": "//golangcitest:args -Ebidichk\npackage testdata\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"LEFT-TO-RIGHT-OVERRIDE: '‭', it is between the single quotes, but it is not visible with a regular editor\") // want \"found dangerous unicode character sequence LEFT-TO-RIGHT-OVERRIDE\"\n}\n"
  },
  {
    "path": "pkg/golinters/bidichk/testdata/bidichk_cgo.go",
    "content": "//golangcitest:args -Ebidichk\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tfmt.Println(\"LEFT-TO-RIGHT-OVERRIDE: '‭', it is between the single quotes, but it is not visible with a regular editor\") // want \"found dangerous unicode character sequence LEFT-TO-RIGHT-OVERRIDE\"\n}\n"
  },
  {
    "path": "pkg/golinters/bodyclose/bodyclose.go",
    "content": "package bodyclose\n\nimport (\n\t\"github.com/timakin/bodyclose/passes/bodyclose\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(bodyclose.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/bodyclose/bodyclose_integration_test.go",
    "content": "package bodyclose\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/bodyclose/testdata/bodyclose.go",
    "content": "//golangcitest:args -Ebodyclose\npackage testdata\n\nimport (\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\nfunc BodycloseNotClosed() {\n\tresp, _ := http.Get(\"https://google.com\") // want \"response body must be closed\"\n\t_, _ = ioutil.ReadAll(resp.Body)\n}\n"
  },
  {
    "path": "pkg/golinters/bodyclose/testdata/bodyclose_cgo.go",
    "content": "//golangcitest:args -Ebodyclose\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc BodycloseNotClosed() {\n\tresp, _ := http.Get(\"https://google.com\") // want \"response body must be closed\"\n\t_, _ = ioutil.ReadAll(resp.Body)\n}\n"
  },
  {
    "path": "pkg/golinters/canonicalheader/canonicalheader.go",
    "content": "package canonicalheader\n\nimport (\n\t\"github.com/lasiar/canonicalheader\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(canonicalheader.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/canonicalheader/canonicalheader_test.go",
    "content": "package canonicalheader_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/canonicalheader/testdata/canonicalheader.go",
    "content": "//golangcitest:args -Ecanonicalheader\npackage testdata\n\nimport \"net/http\"\n\nfunc canonicalheader() {\n\tv := http.Header{}\n\n\tv.Get(\"Test-HEader\")          // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Set(\"Test-HEader\", \"value\") // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Add(\"Test-HEader\", \"value\") // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Del(\"Test-HEader\")          // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Values(\"Test-HEader\")       // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\n\tv.Values(\"Sec-WebSocket-Accept\")\n\n\tv.Set(\"Test-Header\", \"value\")\n\tv.Add(\"Test-Header\", \"value\")\n\tv.Del(\"Test-Header\")\n\tv.Values(\"Test-Header\")\n}\n"
  },
  {
    "path": "pkg/golinters/canonicalheader/testdata/canonicalheader_cgo.go",
    "content": "//golangcitest:args -Ecanonicalheader\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"net/http\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc canonicalheader() {\n\tv := http.Header{}\n\n\tv.Get(\"Test-HEader\")          // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Set(\"Test-HEader\", \"value\") // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Add(\"Test-HEader\", \"value\") // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Del(\"Test-HEader\")          // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\tv.Values(\"Test-HEader\")       // want `non-canonical header \"Test-HEader\", instead use: \"Test-Header\"`\n\n\tv.Values(\"Sec-WebSocket-Accept\")\n\n\tv.Set(\"Test-Header\", \"value\")\n\tv.Add(\"Test-Header\", \"value\")\n\tv.Del(\"Test-Header\")\n\tv.Values(\"Test-Header\")\n}\n"
  },
  {
    "path": "pkg/golinters/canonicalheader/testdata/fix/in/canonicalheader.go",
    "content": "//golangcitest:args -Ecanonicalheader\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"net/http\"\n\nfunc canonicalheader() {\n\tv := http.Header{}\n\n\tv.Get(\"Test-HEader\")\n\tv.Set(\"Test-HEader\", \"value\")\n\tv.Add(\"Test-HEader\", \"value\")\n\tv.Del(\"Test-HEader\")\n\tv.Values(\"Test-HEader\")\n\n\tv.Values(\"Sec-WebSocket-Accept\")\n\n\tv.Set(\"Test-Header\", \"value\")\n\tv.Add(\"Test-Header\", \"value\")\n\tv.Del(\"Test-Header\")\n\tv.Values(\"Test-Header\")\n}\n"
  },
  {
    "path": "pkg/golinters/canonicalheader/testdata/fix/out/canonicalheader.go",
    "content": "//golangcitest:args -Ecanonicalheader\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"net/http\"\n\nfunc canonicalheader() {\n\tv := http.Header{}\n\n\tv.Get(\"Test-Header\")\n\tv.Set(\"Test-Header\", \"value\")\n\tv.Add(\"Test-Header\", \"value\")\n\tv.Del(\"Test-Header\")\n\tv.Values(\"Test-Header\")\n\n\tv.Values(\"Sec-WebSocket-Accept\")\n\n\tv.Set(\"Test-Header\", \"value\")\n\tv.Add(\"Test-Header\", \"value\")\n\tv.Del(\"Test-Header\")\n\tv.Values(\"Test-Header\")\n}\n"
  },
  {
    "path": "pkg/golinters/containedctx/containedctx.go",
    "content": "package containedctx\n\nimport (\n\t\"github.com/sivchari/containedctx\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(containedctx.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/containedctx/containedctx_integration_test.go",
    "content": "package containedctx\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/containedctx/testdata/containedctx.go",
    "content": "//golangcitest:args -Econtainedctx\npackage testdata\n\nimport \"context\"\n\ntype ok struct {\n\ti int\n\ts string\n}\n\ntype ng struct {\n\tctx context.Context // want \"found a struct that contains a context.Context field\"\n}\n\ntype empty struct{}\n"
  },
  {
    "path": "pkg/golinters/containedctx/testdata/containedctx_cgo.go",
    "content": "//golangcitest:args -Econtainedctx\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype ok struct {\n\ti int\n\ts string\n}\n\ntype ng struct {\n\tctx context.Context // want \"found a struct that contains a context.Context field\"\n}\n\ntype empty struct{}\n"
  },
  {
    "path": "pkg/golinters/contextcheck/contextcheck.go",
    "content": "package contextcheck\n\nimport (\n\t\"github.com/kkHAIKE/contextcheck\"\n\t\"golang.org/x/tools/go/analysis/passes/ctrlflow\"\n\t\"golang.org/x/tools/go/analysis/passes/inspect\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n)\n\nfunc New() *goanalysis.Linter {\n\tanalyzer := contextcheck.NewAnalyzer(contextcheck.Configuration{})\n\t// TODO(ldez) there is a problem with this linter:\n\t// I think the problem related to facts.\n\t// The BuildSSA pass has been changed inside (0.39.0):\n\t// https://github.com/golang/tools/commit/b74c09864920a69a4d2f6ef0ecb4f9cff226893a\n\tanalyzer.Requires = append(analyzer.Requires, ctrlflow.Analyzer, inspect.Analyzer)\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\tanalyzer.Run = contextcheck.NewRun(lintCtx.Packages, false)\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/contextcheck/contextcheck_integration_test.go",
    "content": "package contextcheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/contextcheck/testdata/contextcheck.go",
    "content": "//golangcitest:args -Econtextcheck\npackage testdata\n\nimport \"context\"\n\ntype MyString string\n\nfunc contextcheckCase1(ctx context.Context) {\n\tfuncWithoutCtx() // want \"Function `funcWithoutCtx` should pass the context parameter\"\n}\n\nfunc contextcheckCase2(ctx context.Context) {\n\tctx = context.WithValue(ctx, MyString(\"aaa\"), \"aaaaaa\")\n\tfuncWithCtx(ctx)\n\n\tdefer func() {\n\t\tfuncWithCtx(ctx)\n\t}()\n\n\tfunc(ctx context.Context) {\n\t\tfuncWithCtx(ctx)\n\t}(ctx)\n\n\tfuncWithCtx(context.Background()) // want \"Non-inherited new context, use function like `context.WithXXX` instead\"\n}\n\nfunc contextcheckCase3(ctx context.Context) {\n\tfunc() {\n\t\tfuncWithCtx(ctx)\n\t}()\n\n\tctx = context.Background() // want \"Non-inherited new context, use function like `context.WithXXX` instead\"\n\tfuncWithCtx(ctx)\n}\n\nfunc contextcheckCase4(ctx context.Context) {\n\tctx, cancel := getNewCtx(ctx)\n\tdefer cancel()\n\tfuncWithCtx(ctx)\n}\n\nfunc funcWithCtx(ctx context.Context) {}\n\nfunc funcWithoutCtx() {\n\tfuncWithCtx(context.TODO())\n}\n\nfunc getNewCtx(ctx context.Context) (newCtx context.Context, cancel context.CancelFunc) {\n\treturn context.WithCancel(ctx)\n}\n"
  },
  {
    "path": "pkg/golinters/contextcheck/testdata/contextcheck_cgo.go",
    "content": "//golangcitest:args -Econtextcheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc contextcheckCase1(ctx context.Context) {\n\tfuncWithoutCtx() // want \"Function `funcWithoutCtx` should pass the context parameter\"\n}\n\nfunc funcWithCtx(ctx context.Context) {}\n\nfunc funcWithoutCtx() {\n\tfuncWithCtx(context.TODO())\n}\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/copyloopvar.go",
    "content": "package copyloopvar\n\nimport (\n\t\"github.com/karamaru-alpha/copyloopvar\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.CopyLoopVarSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"check-alias\": settings.CheckAlias,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(copyloopvar.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/copyloopvar_integration_test.go",
    "content": "package copyloopvar\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/testdata/copyloopvar.go",
    "content": "//go:build go1.22\n\n//golangcitest:args -Ecopyloopvar\npackage testdata\n\nimport \"fmt\"\n\nfunc copyloopvarCase1() {\n\tslice := []int{1, 2, 3}\n\tfns := make([]func(), 0, len(slice)*2)\n\tfor i, v := range slice {\n\t\ti := i // want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t\tv := v // want `The copy of the 'for' variable \"v\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(v)\n\t\t})\n\t\t_v := v\n\t\t_ = _v\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n\nfunc copyloopvarCase2() {\n\tloopCount := 3\n\tfns := make([]func(), 0, loopCount)\n\tfor i := 1; i <= loopCount; i++ {\n\t\ti := i // want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/testdata/copyloopvar.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    copyloopvar:\n      check-alias: true\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/testdata/copyloopvar_cgo.go",
    "content": "//go:build go1.22\n\n//golangcitest:args -Ecopyloopvar\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc copyloopvarCase2() {\n\tloopCount := 3\n\tfns := make([]func(), 0, loopCount)\n\tfor i := 1; i <= loopCount; i++ {\n\t\ti := i // want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/testdata/copyloopvar_custom.go",
    "content": "//go:build go1.22\n\n//golangcitest:args -Ecopyloopvar\n//golangcitest:config_path testdata/copyloopvar.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc copyloopvarCase1() {\n\tslice := []int{1, 2, 3}\n\tfns := make([]func(), 0, len(slice)*2)\n\tfor i, v := range slice {\n\t\ti := i // want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t\tv := v // want `The copy of the 'for' variable \"v\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(v)\n\t\t})\n\t\t_v := v // want `The copy of the 'for' variable \"v\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\t_ = _v\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n\nfunc copyloopvarCase2() {\n\tloopCount := 3\n\tfns := make([]func(), 0, loopCount)\n\tfor i := 1; i <= loopCount; i++ {\n\t\ti := i // want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/testdata/fix/in/copyloopvar.go",
    "content": "//golangcitest:args -Ecopyloopvar\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc _() {\n\tslice := []int{1, 2, 3}\n\tfns := make([]func(), 0, len(slice)*2)\n\tfor i, v := range slice {\n\t\ti := i // want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t\tv := v // want `The copy of the 'for' variable \"v\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(v)\n\t\t})\n\t\t_v := v\n\t\t_ = _v\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n\nfunc _() {\n\tloopCount := 3\n\tfns := make([]func(), 0, loopCount)\n\tfor i := 1; i <= loopCount; i++ {\n\t\ti := i // want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/copyloopvar/testdata/fix/out/copyloopvar.go",
    "content": "//golangcitest:args -Ecopyloopvar\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc _() {\n\tslice := []int{1, 2, 3}\n\tfns := make([]func(), 0, len(slice)*2)\n\tfor i, v := range slice {\n\t\t// want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t\t// want `The copy of the 'for' variable \"v\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(v)\n\t\t})\n\t\t_v := v\n\t\t_ = _v\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n\nfunc _() {\n\tloopCount := 3\n\tfns := make([]func(), 0, loopCount)\n\tfor i := 1; i <= loopCount; i++ {\n\t\t// want `The copy of the 'for' variable \"i\" can be deleted \\(Go 1\\.22\\+\\)`\n\t\tfns = append(fns, func() {\n\t\t\tfmt.Println(i)\n\t\t})\n\t}\n\tfor _, fn := range fns {\n\t\tfn()\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/cyclop/cyclop.go",
    "content": "package cyclop\n\nimport (\n\t\"github.com/bkielbasa/cyclop/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.CyclopSettings) *goanalysis.Linter {\n\tcfg := map[string]any{}\n\n\tif settings != nil {\n\t\t// Should be managed with `linters.exclusions.rules`.\n\t\tcfg[\"skipTests\"] = false\n\n\t\tif settings.MaxComplexity != 0 {\n\t\t\tcfg[\"maxComplexity\"] = settings.MaxComplexity\n\t\t}\n\n\t\tif settings.PackageAverage != 0 {\n\t\t\tcfg[\"packageAverage\"] = settings.PackageAverage\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/cyclop/cyclop_integration_test.go",
    "content": "package cyclop\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/cyclop/testdata/cyclop.go",
    "content": "//golangcitest:args -Ecyclop\n//golangcitest:config_path testdata/cyclop.yml\npackage testdata\n\nfunc cyclopComplexFunc(s string) { // want \"calculated cyclomatic complexity for function cyclopComplexFunc is 22, max is 15\"\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/cyclop/testdata/cyclop.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    cyclop:\n      max-complexity: 15\n"
  },
  {
    "path": "pkg/golinters/cyclop/testdata/cyclop_cgo.go",
    "content": "//golangcitest:args -Ecyclop\n//golangcitest:config_path testdata/cyclop.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc cyclopComplexFunc(s string) { // want \"calculated cyclomatic complexity for function cyclopComplexFunc is 22, max is 15\"\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/decorder/decorder.go",
    "content": "package decorder\n\nimport (\n\t\"strings\"\n\n\t\"gitlab.com/bosi/decorder\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.DecorderSettings) *goanalysis.Linter {\n\t// disable all rules/checks by default\n\tcfg := map[string]any{\n\t\t\"ignore-underscore-vars\":        false,\n\t\t\"disable-dec-num-check\":         true,\n\t\t\"disable-type-dec-num-check\":    false,\n\t\t\"disable-const-dec-num-check\":   false,\n\t\t\"disable-var-dec-num-check\":     false,\n\t\t\"disable-dec-order-check\":       true,\n\t\t\"disable-init-func-first-check\": true,\n\t}\n\n\tif settings != nil {\n\t\tcfg[\"dec-order\"] = strings.Join(settings.DecOrder, \",\")\n\t\tcfg[\"ignore-underscore-vars\"] = settings.IgnoreUnderscoreVars\n\t\tcfg[\"disable-dec-num-check\"] = settings.DisableDecNumCheck\n\t\tcfg[\"disable-type-dec-num-check\"] = settings.DisableTypeDecNumCheck\n\t\tcfg[\"disable-const-dec-num-check\"] = settings.DisableConstDecNumCheck\n\t\tcfg[\"disable-var-dec-num-check\"] = settings.DisableVarDecNumCheck\n\t\tcfg[\"disable-dec-order-check\"] = settings.DisableDecOrderCheck\n\t\tcfg[\"disable-init-func-first-check\"] = settings.DisableInitFuncFirstCheck\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(decorder.Analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/decorder/decorder_integration_test.go",
    "content": "package decorder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/decorder/testdata/decorder.go",
    "content": "//golangcitest:args -Edecorder\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"math\"\n\nconst (\n\tdecoh = math.MaxInt64\n\tdecoi = 1\n)\n\nvar decoj = 1\nvar decok = 1\n\ntype decol int\n\nfunc decom() {\n\tconst decon = 1\n}\n\nfunc init() {}\n"
  },
  {
    "path": "pkg/golinters/decorder/testdata/decorder_cgo.go",
    "content": "//golangcitest:args -Edecorder\n//golangcitest:config_path testdata/decorder_custom.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nconst (\n\tdecoc = math.MaxInt64\n\tdecod = 1\n)\n\nvar decoa = 1\nvar decob = 1 // want \"multiple \\\"var\\\" declarations are not allowed; use parentheses instead\"\n\ntype decoe int // want \"type must not be placed after const\"\n\nfunc decof() {\n\tconst decog = 1\n}\n\nfunc init() {} // want \"init func must be the first function in file\"\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n"
  },
  {
    "path": "pkg/golinters/decorder/testdata/decorder_custom.go",
    "content": "//golangcitest:args -Edecorder\n//golangcitest:config_path testdata/decorder_custom.yml\npackage testdata\n\nimport \"math\"\n\nconst (\n\tdecoc = math.MaxInt64\n\tdecod = 1\n)\n\nvar decoa = 1\nvar decob = 1 // want \"multiple \\\"var\\\" declarations are not allowed; use parentheses instead\"\n\ntype decoe int // want \"type must not be placed after const\"\n\nfunc decof() {\n\tconst decog = 1\n}\n\nfunc init() {} // want \"init func must be the first function in file\"\n"
  },
  {
    "path": "pkg/golinters/decorder/testdata/decorder_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    decorder:\n      dec-order:\n        - type\n        - const\n        - var\n        - func\n      disable-dec-order-check: false\n      disable-init-func-first-check: false\n      disable-dec-num-check: false\n"
  },
  {
    "path": "pkg/golinters/depguard/depguard.go",
    "content": "package depguard\n\nimport (\n\t\"strings\"\n\n\t\"github.com/OpenPeeDeeP/depguard/v2\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n)\n\nfunc New(settings *config.DepGuardSettings, replacer *strings.Replacer) *goanalysis.Linter {\n\tconf := depguard.LinterSettings{}\n\n\tif settings != nil {\n\t\tfor s, rule := range settings.Rules {\n\t\t\tvar extendedPatterns []string\n\t\t\tfor _, file := range rule.Files {\n\t\t\t\textendedPatterns = append(extendedPatterns, replacer.Replace(file))\n\t\t\t}\n\n\t\t\tlist := &depguard.List{\n\t\t\t\tListMode: rule.ListMode,\n\t\t\t\tFiles:    extendedPatterns,\n\t\t\t\tAllow:    rule.Allow,\n\t\t\t}\n\n\t\t\t// because of bug with Viper parsing (split on dot) we use a list of struct instead of a map.\n\t\t\t// https://github.com/spf13/viper/issues/324\n\t\t\t// https://github.com/golangci/golangci-lint/issues/3749#issuecomment-1492536630\n\n\t\t\tdeny := map[string]string{}\n\t\t\tfor _, r := range rule.Deny {\n\t\t\t\tdeny[r.Pkg] = r.Desc\n\t\t\t}\n\t\t\tlist.Deny = deny\n\n\t\t\tconf[s] = list\n\t\t}\n\t}\n\n\tanalyzer := depguard.NewUncompiledAnalyzer(&conf)\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.Analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\terr := analyzer.Compile()\n\t\t\tif err != nil {\n\t\t\t\tlintCtx.Log.Errorf(\"create analyzer: %v\", err)\n\t\t\t}\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/depguard/depguard_integration_test.go",
    "content": "package depguard\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/depguard/testdata/depguard.go",
    "content": "//golangcitest:args -Edepguard\n//golangcitest:config_path testdata/depguard.yml\npackage testdata\n\nimport (\n\t\"compress/gzip\" // want \"import 'compress/gzip' is not allowed from list 'main': nope\"\n\t\"log\"           // want \"import 'log' is not allowed from list 'main': don't use log\"\n\n\t\"golang.org/x/tools/go/analysis\" // want \"import 'golang.org/x/tools/go/analysis' is not allowed from list 'main': example import with dot\"\n)\n\nfunc SpewDebugInfo() {\n\tlog.Println(gzip.BestCompression)\n\t_ = analysis.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/depguard/testdata/depguard.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    depguard:\n      rules:\n        main:\n          deny:\n            - pkg: compress\n              desc: \"nope\"\n            - pkg: log\n              desc: \"don't use log\"\n            - pkg: \"golang.org/x/tools/go/analysis\"\n              desc: \"example import with dot\"\n"
  },
  {
    "path": "pkg/golinters/depguard/testdata/depguard_additional_guards.go",
    "content": "//golangcitest:args -Edepguard\n//golangcitest:config_path testdata/depguard_additional_guards.yml\npackage testdata\n\nimport (\n\t\"compress/gzip\" // want \"import 'compress/gzip' is not allowed from list 'main': nope\"\n\t\"fmt\"           // want \"import 'fmt' is not allowed from list 'main': nope\"\n\t\"log\"           // want \"import 'log' is not allowed from list 'main': don't use log\"\n\t\"strings\"       // want \"import 'strings' is not allowed from list 'main': nope\"\n\n\t\"golang.org/x/tools/go/analysis\" // want \"import 'golang.org/x/tools/go/analysis' is not allowed from list 'main': example import with dot\"\n)\n\nfunc SpewDebugInfo() {\n\tlog.Println(gzip.BestCompression)\n\tlog.Println(fmt.Sprintf(\"SpewDebugInfo\"))\n\tlog.Println(strings.ToLower(\"SpewDebugInfo\"))\n\t_ = analysis.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/depguard/testdata/depguard_additional_guards.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    depguard:\n      rules:\n        main:\n          deny:\n            - pkg: fmt\n              desc: \"nope\"\n            - pkg: strings\n              desc: \"nope\"\n            - pkg: compress\n              desc: \"nope\"\n            - pkg: log\n              desc: \"don't use log\"\n            - pkg: \"golang.org/x/tools/go/analysis\"\n              desc: \"example import with dot\"\n"
  },
  {
    "path": "pkg/golinters/depguard/testdata/depguard_cgo.go",
    "content": "//golangcitest:args -Edepguard\n//golangcitest:config_path testdata/depguard.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"compress/gzip\" // want \"import 'compress/gzip' is not allowed from list 'main': nope\"\n\t\"log\"           // want \"import 'log' is not allowed from list 'main': don't use log\"\n\t\"unsafe\"\n\n\t\"golang.org/x/tools/go/analysis\" // want \"import 'golang.org/x/tools/go/analysis' is not allowed from list 'main': example import with dot\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc SpewDebugInfo() {\n\tlog.Println(gzip.BestCompression)\n\t_ = analysis.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/depguard/testdata/depguard_ignore_file_rules.go",
    "content": "//golangcitest:args -Edepguard\n//golangcitest:config_path testdata/depguard_ignore_file_rules.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\n// NOTE - No lint errors because this file is ignored\nimport (\n\t\"compress/gzip\"\n\t\"log\"\n\n\t\"golang.org/x/tools/go/analysis\"\n)\n\nfunc SpewDebugInfo() {\n\tlog.Println(gzip.BestCompression)\n\t_ = analysis.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/depguard/testdata/depguard_ignore_file_rules.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    depguard:\n      rules:\n        main:\n          files:\n            - \"!**/*_ignore_file_rules.go\"\n          deny:\n            - pkg: compress\n              desc: \"nope\"\n            - pkg: log\n              desc: \"don't use log\"\n            - pkg: \"golang.org/x/tools/go/analysis\"\n              desc: \"example import with dot\"\n"
  },
  {
    "path": "pkg/golinters/dogsled/dogsled.go",
    "content": "package dogsled\n\nimport (\n\t\"go/ast\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/inspect\"\n\t\"golang.org/x/tools/go/ast/inspector\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.DogsledSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"dogsled\",\n\t\t\tDoc:  \"Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\treturn run(pass, settings.MaxBlankIdentifiers)\n\t\t\t},\n\t\t\tRequires: []*analysis.Analyzer{inspect.Analyzer},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc run(pass *analysis.Pass, maxBlanks int) (any, error) {\n\tinsp, ok := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)\n\tif !ok {\n\t\treturn nil, nil\n\t}\n\n\tfor node := range insp.PreorderSeq((*ast.FuncDecl)(nil)) {\n\t\tfuncDecl, ok := node.(*ast.FuncDecl)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tif funcDecl.Body == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, expr := range funcDecl.Body.List {\n\t\t\tassgnStmt, ok := expr.(*ast.AssignStmt)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tnumBlank := 0\n\t\t\tfor _, left := range assgnStmt.Lhs {\n\t\t\t\tident, ok := left.(*ast.Ident)\n\t\t\t\tif !ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif ident.Name == \"_\" {\n\t\t\t\t\tnumBlank++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif numBlank > maxBlanks {\n\t\t\t\tpass.Reportf(assgnStmt.Pos(), \"declaration has %v blank identifiers\", numBlank)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil, nil\n}\n"
  },
  {
    "path": "pkg/golinters/dogsled/dogsled_integration_test.go",
    "content": "package dogsled\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/dogsled/testdata/dogsled.go",
    "content": "//golangcitest:args -Edogsled\npackage testdata\n\nfunc Dogsled() {\n\t_ = ret1()\n\t_, _ = ret2()\n\t_, _, _ = ret3()    // want \"declaration has 3 blank identifiers\"\n\t_, _, _, _ = ret4() // want \"declaration has 4 blank identifiers\"\n}\n\nfunc ret1() (a int) {\n\treturn 1\n}\n\nfunc ret2() (a, b int) {\n\treturn 1, 2\n}\n\nfunc ret3() (a, b, c int) {\n\treturn 1, 2, 3\n}\n\nfunc ret4() (a, b, c, d int) {\n\treturn 1, 2, 3, 4\n}\n"
  },
  {
    "path": "pkg/golinters/dogsled/testdata/dogsled_cgo.go",
    "content": "//golangcitest:args -Edogsled\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\t_ = ret1()\n\t_, _ = ret2()\n\t_, _, _ = ret3()    // want \"declaration has 3 blank identifiers\"\n\t_, _, _, _ = ret4() // want \"declaration has 4 blank identifiers\"\n}\n\nfunc ret1() (a int) {\n\treturn 1\n}\n\nfunc ret2() (a, b int) {\n\treturn 1, 2\n}\n\nfunc ret3() (a, b, c int) {\n\treturn 1, 2, 3\n}\n\nfunc ret4() (a, b, c, d int) {\n\treturn 1, 2, 3, 4\n}\n"
  },
  {
    "path": "pkg/golinters/dupl/dupl.go",
    "content": "package dupl\n\nimport (\n\t\"fmt\"\n\t\"go/token\"\n\t\"sync\"\n\n\tduplAPI \"github.com/golangci/dupl/lib\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"dupl\"\n\nfunc New(settings *config.DuplSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Detects duplicate fragments of code.\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues, err := runDupl(pass, settings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runDupl(pass *analysis.Pass, settings *config.DuplSettings) ([]*goanalysis.Issue, error) {\n\tissues, err := duplAPI.Run(internal.GetGoFileNames(pass), settings.Threshold)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(issues) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tres := make([]*goanalysis.Issue, 0, len(issues))\n\n\tfor _, i := range issues {\n\t\ttoFilename, err := fsutils.ShortestRelPath(i.To.Filename(), \"\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to get shortest rel path for %q: %w\", i.To.Filename(), err)\n\t\t}\n\n\t\tdupl := fmt.Sprintf(\"%s:%d-%d\", toFilename, i.To.LineStart(), i.To.LineEnd())\n\t\ttext := fmt.Sprintf(\"%d-%d lines are duplicate of %s\",\n\t\t\ti.From.LineStart(), i.From.LineEnd(),\n\t\t\tinternal.FormatCode(dupl))\n\n\t\tres = append(res, goanalysis.NewIssue(&result.Issue{\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: i.From.Filename(),\n\t\t\t\tLine:     i.From.LineStart(),\n\t\t\t},\n\t\t\tLineRange: &result.Range{\n\t\t\t\tFrom: i.From.LineStart(),\n\t\t\t\tTo:   i.From.LineEnd(),\n\t\t\t},\n\t\t\tText:       text,\n\t\t\tFromLinter: linterName,\n\t\t}, pass))\n\t}\n\n\treturn res, nil\n}\n"
  },
  {
    "path": "pkg/golinters/dupl/dupl_integration_test.go",
    "content": "package dupl\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/dupl/testdata/dupl.go",
    "content": "//golangcitest:args -Edupl\n//golangcitest:config_path testdata/dupl.yml\npackage testdata\n\ntype DuplLogger struct{}\n\nfunc (DuplLogger) level() int {\n\treturn 1\n}\n\nfunc (DuplLogger) Debug(args ...interface{}) {}\nfunc (DuplLogger) Info(args ...interface{})  {}\n\nfunc (logger *DuplLogger) First(args ...interface{}) { // want \"14-23 lines are duplicate of `.*dupl.go:25-34`\"\n\tif logger.level() >= 0 {\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t}\n}\n\nfunc (logger *DuplLogger) Second(args ...interface{}) { // want \"25-34 lines are duplicate of `.*dupl.go:14-23`\"\n\tif logger.level() >= 1 {\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/dupl/testdata/dupl.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    dupl:\n      threshold: 20\n"
  },
  {
    "path": "pkg/golinters/dupl/testdata/dupl_cgo.go",
    "content": "//golangcitest:args -Edupl\n//golangcitest:config_path testdata/dupl.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype DuplLogger struct{}\n\nfunc (DuplLogger) level() int {\n\treturn 1\n}\n\nfunc (DuplLogger) Debug(args ...interface{}) {}\nfunc (DuplLogger) Info(args ...interface{})  {}\n\nfunc (logger *DuplLogger) First(args ...interface{}) { // want \"34-43 lines are duplicate of `.*dupl_cgo.go:45-54`\"\n\tif logger.level() >= 0 {\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t\tlogger.Debug(args...)\n\t}\n}\n\nfunc (logger *DuplLogger) Second(args ...interface{}) { // want \"45-54 lines are duplicate of `.*dupl_cgo.go:34-43`\"\n\tif logger.level() >= 1 {\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t\tlogger.Info(args...)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/dupword.go",
    "content": "package dupword\n\nimport (\n\t\"strings\"\n\n\t\"github.com/Abirdcfly/dupword\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.DupWordSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"keyword\":       strings.Join(settings.Keywords, \",\"),\n\t\t\t\"ignore\":        strings.Join(settings.Ignore, \",\"),\n\t\t\t\"comments-only\": settings.CommentsOnly,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(dupword.NewAnalyzer()).\n\t\tWithDesc(\"Checks for duplicate words in the source code\").\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/dupword_integration_test.go",
    "content": "package dupword\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/dupword.go",
    "content": "//golangcitest:args -Edupword\npackage testdata\n\nimport \"fmt\"\n\nfunc duplicateWordInComments() {\n\t// this line include duplicated word the the // want `Duplicate words \\(the\\) found`\n\tfmt.Println(\"hello\")\n}\n\nfunc duplicateWordInStr() {\n\ta := \"this line include duplicate word and and\"                   // want `Duplicate words \\(and\\) found`\n\tb := \"print the\\n the line, print the the \\n\\t the line. and and\" // want `Duplicate words \\(and,the\\) found`\n\tfmt.Println(a, b)\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/dupword_cgo.go",
    "content": "//golangcitest:args -Edupword\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc duplicateWordInComments() {\n\t// this line include duplicated word the the // want `Duplicate words \\(the\\) found`\n\tfmt.Println(\"hello\")\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/dupword_comments_only.go",
    "content": "//golangcitest:args -Edupword\n//golangcitest:config_path testdata/dupword_comments_only.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc _() {\n\t// want +2 `Duplicate words \\(and\\) found`\n\t// want +2 `Duplicate words \\(and,the\\) found`\n\t// this line include duplicate word and and\n\t// print the\\n the line, print the the \\n\\t the line. and and\n\n\ta := \"this line include duplicate word and and\"\n\tb := \"print the\\n the line, print the the \\n\\t the line. and and\"\n\tfmt.Println(a, b)\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/dupword_comments_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    dupword:\n      comments-only: true\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/dupword_ignore.go",
    "content": "//golangcitest:args -Edupword\n//golangcitest:config_path testdata/dupword_ignore.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc duplicateWordInComments() {\n\t// this line include duplicated word the the\n\tfmt.Println(\"hello\")\n}\n\nfunc duplicateWordInStr() {\n\ta := \"this line include duplicate word and and\"                   // want `Duplicate words \\(and\\) found`\n\tb := \"print the\\n the line, print the the \\n\\t the line. and and\" // want `Duplicate words \\(and\\) found`\n\tfmt.Println(a, b)\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/dupword_ignore.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    dupword:\n      ignore:\n      - \"the\"\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/fix/in/dupword.go",
    "content": "//golangcitest:args -Edupword\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc duplicateWordInComments() {\n\t// this line include duplicated word the the\n\tfmt.Println(\"hello\")\n}\n\nfunc duplicateWordInStr() {\n\ta := \"this line include duplicate word and and\"\n\tb := \"print the\\n the line, print the the \\n\\t the line. and and\"\n\tfmt.Println(a, b)\n}\n"
  },
  {
    "path": "pkg/golinters/dupword/testdata/fix/out/dupword.go",
    "content": "//golangcitest:args -Edupword\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc duplicateWordInComments() {\n\t// this line include duplicated word the\n\tfmt.Println(\"hello\")\n}\n\nfunc duplicateWordInStr() {\n\ta := \"this line include duplicate word and\"\n\tb := \"print the\\n line, print the line. and\"\n\tfmt.Println(a, b)\n}\n"
  },
  {
    "path": "pkg/golinters/durationcheck/durationcheck.go",
    "content": "package durationcheck\n\nimport (\n\t\"github.com/charithe/durationcheck\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(durationcheck.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/durationcheck/durationcheck_integration_test.go",
    "content": "package durationcheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/durationcheck/testdata/durationcheck.go",
    "content": "//golangcitest:args -Edurationcheck\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\ntype durationCheckData struct {\n\ti int\n\td time.Duration\n}\n\nfunc durationcheckCase01() {\n\tdcd := durationCheckData{i: 10}\n\t_ = time.Duration(dcd.i) * time.Second\n}\n\nfunc durationcheckCase02() {\n\tdcd := durationCheckData{d: 10 * time.Second}\n\t_ = dcd.d * time.Second // want \"Multiplication of durations: `dcd.d \\\\* time.Second`\"\n}\n\nfunc durationcheckCase03() {\n\tseconds := 10\n\tfmt.Print(time.Duration(seconds) * time.Second)\n}\n\nfunc durationcheckCase04(someDuration time.Duration) {\n\ttimeToWait := someDuration * time.Second // want \"Multiplication of durations: `someDuration \\\\* time.Second`\"\n\ttime.Sleep(timeToWait)\n}\n\nfunc durationcheckCase05() {\n\tsomeDuration := 2 * time.Second\n\ttimeToWait := someDuration * time.Second // want \"Multiplication of durations: `someDuration \\\\* time.Second`\"\n\ttime.Sleep(timeToWait)\n}\n"
  },
  {
    "path": "pkg/golinters/durationcheck/testdata/durationcheck_cgo.go",
    "content": "//golangcitest:args -Edurationcheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype durationCheckData struct {\n\ti int\n\td time.Duration\n}\n\nfunc durationcheckCase01() {\n\tdcd := durationCheckData{i: 10}\n\t_ = time.Duration(dcd.i) * time.Second\n}\n\nfunc durationcheckCase02() {\n\tdcd := durationCheckData{d: 10 * time.Second}\n\t_ = dcd.d * time.Second // want \"Multiplication of durations: `dcd.d \\\\* time.Second`\"\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/embeddedstructfieldcheck.go",
    "content": "package embeddedstructfieldcheck\n\nimport (\n\t\"github.com/manuelarte/embeddedstructfieldcheck/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.EmbeddedStructFieldCheckSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\tanalyzer.ForbidMutexCheck: settings.ForbidMutex,\n\t\t\tanalyzer.EmptyLineCheck:   settings.EmptyLine,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/embeddedstructfieldcheck_integration_test.go",
    "content": "package embeddedstructfieldcheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/embeddedstructfieldcheck_comments.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\npackage testdata\n\nimport \"time\"\n\ntype ValidStructWithSingleLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time\n\n\t// version Single line comment\n\tversion int\n}\n\ntype StructWithSingleLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\t// version Single line comment\n\tversion int\n}\n\ntype StructWithMultiLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\t// version Single line comment\n\t// very long comment\n\tversion int\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/embeddedstructfieldcheck_mutex.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\n//golangcitest:config_path testdata/embeddedstructfieldcheck_mutex.yml\npackage testdata\n\nimport \"sync\"\n\ntype MutextEmbedded struct {\n\tsync.Mutex // want `sync.Mutex should not be embedded`\n}\n\ntype MutextNotEmbedded struct {\n\tmu sync.Mutex\n}\n\ntype PointerMutextEmbedded struct {\n\t*sync.Mutex // want `sync.Mutex should not be embedded`\n}\n\ntype RWMutextEmbedded struct {\n\tsync.RWMutex // want `sync.RWMutex should not be embedded`\n}\n\ntype RWMutextNotEmbedded struct {\n\tmu sync.RWMutex\n}\n\ntype PointerRWMutextEmbedded struct {\n\t*sync.RWMutex // want `sync.RWMutex should not be embedded`\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/embeddedstructfieldcheck_mutex.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    embeddedstructfieldcheck:\n      forbid-mutex: true\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/embeddedstructfieldcheck_simple.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\npackage testdata\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\ntype ValidStruct struct {\n\ttime.Time\n\n\tversion int\n}\n\ntype NoSpaceStruct struct {\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\tversion   int\n}\n\ntype NotSortedStruct struct {\n\tversion int\n\n\ttime.Time // want `embedded fields should be listed before regular fields`\n}\n\ntype MixedEmbeddedAndNotEmbedded struct {\n\tcontext.Context\n\n\tname string\n\n\ttime.Time // want `embedded fields should be listed before regular fields`\n\n\tage int\n}\n\ntype EmbeddedWithPointers struct {\n\t*time.Time // want `there must be an empty line separating embedded fields from regular fields`\n\tversion    int\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/embeddedstructfieldcheck_special_cases.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\npackage testdata\n\nimport \"time\"\n\nfunc myFunction() {\n\ttype myType struct {\n\t\tversion   int\n\t\ttime.Time // want `embedded fields should be listed before regular fields`\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/fix/in/comments.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"time\"\n\ntype ValidStructWithSingleLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time\n\n\t// version Single line comment\n\tversion int\n}\n\ntype StructWithSingleLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\n\t// version Single line comment\n\tversion int\n}\n\ntype StructWithMultiLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\n\t// version Single line comment\n\t// very long comment\n\tversion int\n}\n\ntype A struct {\n\t// comment\n\tValidStructWithSingleLineComments\n\t// C is foo\n\tStructWithSingleLineComments // want `there must be an empty line separating embedded fields from regular fields`\n\n\tD string\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/fix/in/simple.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"time\"\n)\n\ntype ValidStruct struct {\n\ttime.Time\n\n\tversion int\n}\n\ntype NoSpaceStruct struct {\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\tversion   int\n}\n\ntype EmbeddedWithPointers struct {\n\t*time.Time // want `there must be an empty line separating embedded fields from regular fields`\n\tversion    int\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/fix/out/comments.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"time\"\n\ntype ValidStructWithSingleLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time\n\n\t// version Single line comment\n\tversion int\n}\n\ntype StructWithSingleLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\n\t// version Single line comment\n\tversion int\n}\n\ntype StructWithMultiLineComments struct {\n\t// time.Time Single line comment\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\n\t// version Single line comment\n\t// very long comment\n\tversion int\n}\n\ntype A struct {\n\t// comment\n\tValidStructWithSingleLineComments\n\t// C is foo\n\tStructWithSingleLineComments // want `there must be an empty line separating embedded fields from regular fields`\n\n\tD string\n}\n"
  },
  {
    "path": "pkg/golinters/embeddedstructfieldcheck/testdata/fix/out/simple.go",
    "content": "//golangcitest:args -Eembeddedstructfieldcheck\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"time\"\n)\n\ntype ValidStruct struct {\n\ttime.Time\n\n\tversion int\n}\n\ntype NoSpaceStruct struct {\n\ttime.Time // want `there must be an empty line separating embedded fields from regular fields`\n\n\tversion int\n}\n\ntype EmbeddedWithPointers struct {\n\t*time.Time // want `there must be an empty line separating embedded fields from regular fields`\n\n\tversion int\n}\n"
  },
  {
    "path": "pkg/golinters/err113/err113.go",
    "content": "package err113\n\nimport (\n\t\"github.com/Djarvur/go-err113\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(err113.NewAnalyzer()).\n\t\tWithDesc(\"Check errors handling expressions\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/err113/err113_integration_test.go",
    "content": "package err113\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/err113/testdata/err113.go",
    "content": "//golangcitest:args -Eerr113\npackage testdata\n\nimport \"os\"\n\nfunc SimpleEqual(e1, e2 error) bool {\n\treturn e1 == e2 // want `do not compare errors directly \"e1 == e2\", use \"errors.Is\\(e1, e2\\)\" instead`\n}\n\nfunc SimpleNotEqual(e1, e2 error) bool {\n\treturn e1 != e2 // want `do not compare errors directly \"e1 != e2\", use \"!errors.Is\\(e1, e2\\)\" instead`\n}\n\nfunc CheckGoerr13Import(e error) bool {\n\tf, err := os.Create(\"f.txt\")\n\tif err != nil {\n\t\treturn err == e // want `do not compare errors directly \"err == e\", use \"errors.Is\\(err, e\\)\" instead`\n\t}\n\tf.Close()\n\treturn false\n}\n"
  },
  {
    "path": "pkg/golinters/err113/testdata/err113_cgo.go",
    "content": "//golangcitest:args -Eerr113\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"os\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc CheckGoerr13Import(e error) bool {\n\tf, err := os.Create(\"f.txt\")\n\tif err != nil {\n\t\treturn err == e // want `do not compare errors directly \"err == e\", use \"errors.Is\\(err, e\\)\" instead`\n\t}\n\tf.Close()\n\treturn false\n}\n"
  },
  {
    "path": "pkg/golinters/err113/testdata/fix/in/err113.go",
    "content": "//golangcitest:args -Eerr113\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"os\"\n\nfunc SimpleEqual(e1, e2 error) bool {\n\treturn e1 == e2\n}\n\nfunc SimpleNotEqual(e1, e2 error) bool {\n\treturn e1 != e2\n}\n\nfunc CheckGoerr13Import(e error) bool {\n\tf, err := os.Create(\"f.txt\")\n\tif err != nil {\n\t\treturn err == e\n\t}\n\tf.Close()\n\treturn false\n}\n"
  },
  {
    "path": "pkg/golinters/err113/testdata/fix/out/err113.go",
    "content": "//golangcitest:args -Eerr113\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"os\"\n\nfunc SimpleEqual(e1, e2 error) bool {\n\treturn errors.Is(e1, e2)\n}\n\nfunc SimpleNotEqual(e1, e2 error) bool {\n\treturn !errors.Is(e1, e2)\n}\n\nfunc CheckGoerr13Import(e error) bool {\n\tf, err := os.Create(\"f.txt\")\n\tif err != nil {\n\t\treturn errors.Is(err, e)\n\t}\n\tf.Close()\n\treturn false\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/errcheck.go",
    "content": "package errcheck\n\nimport (\n\t\"cmp\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"sync\"\n\n\t\"github.com/kisielk/errcheck/errcheck\"\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"errcheck\"\n\nfunc New(settings *config.ErrcheckSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\tanalyzer := &analysis.Analyzer{\n\t\tName: linterName,\n\t\tDoc: \"errcheck is a program for checking for unchecked errors in Go code. \" +\n\t\t\t\"These unchecked errors can be critical bugs in some cases\",\n\t\tRun: goanalysis.DummyRun,\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\tchecker := getChecker(settings)\n\t\t\tchecker.Tags = lintCtx.Cfg.Run.BuildTags\n\n\t\t\tanalyzer.Run = func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues := runErrCheck(pass, checker, settings.Verbose)\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runErrCheck(pass *analysis.Pass, checker *errcheck.Checker, verbose bool) []*goanalysis.Issue {\n\tpkg := &packages.Package{\n\t\tFset:      pass.Fset,\n\t\tSyntax:    pass.Files,\n\t\tTypes:     pass.Pkg,\n\t\tTypesInfo: pass.TypesInfo,\n\t}\n\n\tlintIssues := checker.CheckPackage(pkg).Unique()\n\tif len(lintIssues.UncheckedErrors) == 0 {\n\t\treturn nil\n\t}\n\n\tissues := make([]*goanalysis.Issue, len(lintIssues.UncheckedErrors))\n\n\tfor i, err := range lintIssues.UncheckedErrors {\n\t\ttext := \"Error return value is not checked\"\n\n\t\tif err.FuncName != \"\" {\n\t\t\tcode := cmp.Or(err.SelectorName, err.FuncName)\n\t\t\tif verbose {\n\t\t\t\tcode = err.FuncName\n\t\t\t}\n\n\t\t\ttext = fmt.Sprintf(\"Error return value of %s is not checked\", internal.FormatCode(code))\n\t\t}\n\n\t\tissues[i] = goanalysis.NewIssue(\n\t\t\t&result.Issue{\n\t\t\t\tFromLinter: linterName,\n\t\t\t\tText:       text,\n\t\t\t\tPos:        err.Pos,\n\t\t\t},\n\t\t\tpass,\n\t\t)\n\t}\n\n\treturn issues\n}\n\nfunc getChecker(errCfg *config.ErrcheckSettings) *errcheck.Checker {\n\tchecker := errcheck.Checker{\n\t\tExclusions: errcheck.Exclusions{\n\t\t\tBlankAssignments:       !errCfg.CheckAssignToBlank,\n\t\t\tTypeAssertions:         !errCfg.CheckTypeAssertions,\n\t\t\tSymbolRegexpsByPackage: map[string]*regexp.Regexp{},\n\t\t},\n\t}\n\n\tif !errCfg.DisableDefaultExclusions {\n\t\tchecker.Exclusions.Symbols = append(checker.Exclusions.Symbols, errcheck.DefaultExcludedSymbols...)\n\t}\n\n\tchecker.Exclusions.Symbols = append(checker.Exclusions.Symbols, errCfg.ExcludeFunctions...)\n\n\treturn &checker\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/errcheck_integration_test.go",
    "content": "package errcheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck.go",
    "content": "//golangcitest:args -Eerrcheck\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"net/http\"\n\t\"os\"\n)\n\nfunc RetErr() error {\n\treturn nil\n}\n\nfunc MissedErrorCheck() {\n\tRetErr() // want \"Error return value is not checked\"\n}\n\nfunc IgnoreCloseMissingErrHandling() error {\n\tf, err := os.Open(\"t.go\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tf.Close() // want \"Error return value of `f.Close` is not checked\"\n\treturn nil\n}\n\nfunc IgnoreCloseInDeferMissingErrHandling() {\n\tresp, err := http.Get(\"http://example.com/\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer resp.Body.Close() // want \"Error return value of `resp.Body.Close` is not checked\"\n\n\tpanic(resp)\n}\n\nfunc IgnoreStdxWrite() {\n\tos.Stdout.Write([]byte{}) // want \"Error return value of `os.Stdout.Write` is not checked\"\n\tos.Stderr.Write([]byte{}) // want \"Error return value of `os.Stderr.Write` is not checked\"\n}\n\nfunc IgnoreBufferWrites(buf *bytes.Buffer) {\n\tbuf.WriteString(\"x\")\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck_cgo.go",
    "content": "//golangcitest:args -Eerrcheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc RetErr() error {\n\treturn nil\n}\n\nfunc MissedErrorCheck() {\n\tRetErr() // want \"Error return value is not checked\"\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck_exclude_functions.go",
    "content": "//golangcitest:args -Eerrcheck\n//golangcitest:config_path testdata/errcheck_exclude_functions.yml\npackage testdata\n\nimport (\n\t\"io/ioutil\"\n)\n\nfunc TestErrcheckExcludeFunctions() []byte {\n\tret, _ := ioutil.ReadFile(\"f.txt\")\n\tioutil.ReadDir(\"dir\")\n\treturn ret\n}\n\nfunc TestErrcheckNoExcludeFunctions() []byte {\n\tret, _ := ioutil.ReadAll(nil) // want \"Error return value of `ioutil.ReadAll` is not checked\"\n\treturn ret\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck_exclude_functions.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    errcheck:\n      check-blank: true\n      exclude-functions:\n        - io/ioutil.ReadFile\n        - io/ioutil.ReadDir\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck_ignore_default.go",
    "content": "//golangcitest:args -Eerrcheck\n//golangcitest:config_path testdata/errcheck_ignore_default.yml\npackage testdata\n\nimport (\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc TestErrcheckIgnoreHashWriteByDefault() []byte {\n\th := sha256.New()\n\th.Write([]byte(\"food\"))\n\treturn h.Sum(nil)\n}\n\nfunc TestErrcheckIgnoreFmtByDefault(s string) int {\n\tn, _ := fmt.Println(s)\n\treturn n\n}\n\nfunc TestErrcheckNoIgnoreOs() {\n\t_, _ = os.Open(\"f.txt\") // want \"Error return value of `os.Open` is not checked\"\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck_ignore_default.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    errcheck:\n      check-blank: true\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck_type_assertions.go",
    "content": "//golangcitest:args -Eerrcheck\n//golangcitest:config_path testdata/errcheck_type_assertions.yml\n//golangcitest:expected_exitcode 1\npackage testdata\n\nfunc ErrorTypeAssertion(filter map[string]interface{}) bool {\n\treturn filter[\"messages_sent.messageid\"].(map[string]interface{})[\"$ne\"] != nil // want \"Error return value is not checked\"\n}\n"
  },
  {
    "path": "pkg/golinters/errcheck/testdata/errcheck_type_assertions.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    errcheck:\n      check-type-assertions: true\n"
  },
  {
    "path": "pkg/golinters/errchkjson/errchkjson.go",
    "content": "package errchkjson\n\nimport (\n\t\"github.com/breml/errchkjson\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.ErrChkJSONSettings) *goanalysis.Linter {\n\tcfg := map[string]any{\n\t\t\"omit-safe\": true,\n\t}\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"omit-safe\":          !settings.CheckErrorFreeEncoding,\n\t\t\t\"report-no-exported\": settings.ReportNoExported,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(errchkjson.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/errchkjson/errchkjson_integration_test.go",
    "content": "package errchkjson\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/errchkjson/testdata/errchkjson.go",
    "content": "//golangcitest:args -Eerrchkjson\n//golangcitest:config_path testdata/errchkjson.yml\npackage testdata\n\nimport (\n\t\"encoding\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"unsafe\"\n)\n\ntype marshalText struct{}\n\nfunc (mt marshalText) MarshalText() ([]byte, error) {\n\treturn []byte(`mt`), nil\n}\n\nvar _ encoding.TextMarshaler = marshalText(struct{}{})\n\n// JSONMarshalSafeTypesWithNoSafe contains a multitude of test cases to marshal different combinations of types to JSON,\n// that are safe, that is, they will never return an error, if these types are marshaled to JSON.\nfunc JSONMarshalSafeTypesWithNoSafe() {\n\tvar err error\n\n\t_, _ = json.Marshal(nil)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\tjson.Marshal(nil)          // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(nil) // nil is safe and check-error-free-encoding is false\n\t_ = err\n\n\t_, _ = json.MarshalIndent(nil, \"\", \" \")   // want \"Error return value of `encoding/json.MarshalIndent` is not checked\"\n\tjson.MarshalIndent(nil, \"\", \" \")          // want \"Error return value of `encoding/json.MarshalIndent` is not checked\"\n\t_, err = json.MarshalIndent(nil, \"\", \" \") // nil is safe and check-error-free-encoding is false\n\t_ = err\n\n\tenc := json.NewEncoder(ioutil.Discard)\n\t_ = enc.Encode(nil)   // want \"Error return value of `\\\\([*]encoding/json.Encoder\\\\).Encode` is not checked\"\n\tenc.Encode(nil)       // want \"Error return value of `\\\\([*]encoding/json.Encoder\\\\).Encode` is not checked\"\n\terr = enc.Encode(nil) // nil is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar b bool\n\t_, _ = json.Marshal(b)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(b) // bool is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar i int\n\t_, _ = json.Marshal(i)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(i) // int is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar i8 int8\n\t_, _ = json.Marshal(i8)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(i8) // int8 is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar i16 int16\n\t_, _ = json.Marshal(i16)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(i16) // int16 is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar i32 int32\n\t_, _ = json.Marshal(i32)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(i32) // int32 / rune is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar i64 int64\n\t_, _ = json.Marshal(i64)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(i64) // int64 is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar ui uint\n\t_, _ = json.Marshal(ui)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(ui) // uint is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar ui8 uint8\n\t_, _ = json.Marshal(ui8)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(ui8) // uint8 is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar ui16 uint16\n\t_, _ = json.Marshal(ui16)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(ui16) // uint16 is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar ui32 uint32\n\t_, _ = json.Marshal(ui32)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(ui32) // uint32 is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar ui64 uint64\n\t_, _ = json.Marshal(ui64)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(ui64) // uint64 is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar uiptr uintptr\n\t_, _ = json.Marshal(uiptr)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(uiptr) // uintptr is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar str string\n\t_, _ = json.Marshal(str)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(str) // string is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar strSlice []string\n\t_, _ = json.Marshal(strSlice)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(strSlice) // []string is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar intSlice []int\n\t_, _ = json.Marshal(intSlice)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(intSlice) // []int is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar boolSlice []bool\n\t_, _ = json.Marshal(boolSlice)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(boolSlice) // []bool is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar strArray [10]string\n\t_, _ = json.Marshal(strArray)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(strArray) // [10]string is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar intArray [10]int\n\t_, _ = json.Marshal(intArray)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(intArray) // [10]int is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar boolArray [10]bool\n\t_, _ = json.Marshal(boolArray)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(boolArray) // [10]bool is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar basicStruct struct {\n\t\tBool    bool\n\t\tInt     int\n\t\tInt8    int8\n\t\tInt16   int16\n\t\tInt32   int32 // also rune\n\t\tInt64   int64\n\t\tUint    uint\n\t\tUint8   uint8 // also byte\n\t\tUint16  uint16\n\t\tUint32  uint32\n\t\tUint64  uint64\n\t\tUintptr uintptr\n\t\tString  string\n\t}\n\t_, _ = json.Marshal(basicStruct)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(basicStruct) // struct containing only safe basic types is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar ptrStruct struct {\n\t\tBool    *bool\n\t\tInt     *int\n\t\tInt8    *int8\n\t\tInt16   *int16\n\t\tInt32   *int32\n\t\tInt64   *int64\n\t\tUint    *uint\n\t\tUint8   *uint8\n\t\tUint16  *uint16\n\t\tUint32  *uint32\n\t\tUint64  *uint64\n\t\tUintptr *uintptr\n\t\tString  *string\n\t}\n\t_, _ = json.Marshal(ptrStruct)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(ptrStruct) // struct containing pointer to only safe basic types is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar mapStrStr map[string]string\n\t_, _ = json.Marshal(mapStrStr)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(mapStrStr) // map[string]string is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar mapStrInt map[string]int\n\t_, _ = json.Marshal(mapStrInt)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(mapStrInt) // map[string]int is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar mapStrBool map[string]bool\n\t_, _ = json.Marshal(mapStrBool)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(mapStrBool) // map[string]bool is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar mapIntStr map[int]string\n\t_, _ = json.Marshal(mapIntStr)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(mapIntStr) // map[int]string is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar mapIntInt map[int]int\n\t_, _ = json.Marshal(mapIntInt)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(mapIntInt) // map[int]int is safe and check-error-free-encoding is false\n\t_ = err\n\n\tvar mapIntBool map[int]bool\n\t_, _ = json.Marshal(mapIntBool)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(mapIntBool) // map[int]bool is safe and check-error-free-encoding is false\n\t_ = err\n\n\ttype innerStruct struct {\n\t\tBool   bool\n\t\tInt    int\n\t\tString string\n\n\t\tStrSlice  []string\n\t\tIntSlice  []int\n\t\tBoolSlice []bool\n\n\t\tStrArray  [10]string\n\t\tIntArray  [10]int\n\t\tBoolArray [10]bool\n\n\t\tMapStrStr  map[string]string\n\t\tMapStrInt  map[string]int\n\t\tMapStrBool map[string]bool\n\n\t\tMapIntStr  map[int]string\n\t\tMapIntInt  map[int]int\n\t\tMapIntBool map[int]bool\n\t}\n\tvar outerStruct struct {\n\t\tBool   bool\n\t\tInt    int\n\t\tString string\n\n\t\tStrSlice  []string\n\t\tIntSlice  []int\n\t\tBoolSlice []bool\n\n\t\tStrArray  [10]string\n\t\tIntArray  [10]int\n\t\tBoolArray [10]bool\n\n\t\tMapStrStr  map[string]string\n\t\tMapStrInt  map[string]int\n\t\tMapStrBool map[string]bool\n\n\t\tMapIntStr  map[int]string\n\t\tMapIntInt  map[int]int\n\t\tMapIntBool map[int]bool\n\n\t\tInnerStruct innerStruct\n\t}\n\t_, _ = json.Marshal(outerStruct)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(outerStruct) // struct with only safe types is safe and check-error-free-encoding is false\n\t_ = err\n}\n\ntype (\n\tstructKey                      struct{ id int }\n\tExportedUnsafeAndInvalidStruct struct { // unsafe unexported but omitted\n\t\tF64                  float64\n\t\tF64Ptr               *float64\n\t\tF64Slice             []float64\n\t\tF64Array             [10]float64\n\t\tMapStrF64            map[string]float64\n\t\tMapEIStr             map[interface{}]string\n\t\tNumber               json.Number\n\t\tNumberPtr            *json.Number\n\t\tNumberSlice          []json.Number\n\t\tMapNumberStr         map[json.Number]string\n\t\tEi                   interface{}\n\t\tStringer             fmt.Stringer\n\t\tMt                   marshalText\n\t\tMapMarshalTextString map[marshalText]string\n\n\t\tC128         complex128\n\t\tC128Ptr      *complex128\n\t\tC128Slice    []complex128\n\t\tC128Array    [10]complex128\n\t\tMapBoolStr   map[bool]string\n\t\tMapF64Str    map[float64]string\n\t\tF            func()\n\t\tCh           chan struct{}\n\t\tUnsafePtr    unsafe.Pointer\n\t\tMapStructStr map[structKey]string\n\t}\n)\n\n// JSONMarshalSafeStructWithUnexportedFieldsWithNoSafe contains a struct with unexported, unsafe fields.\nfunc JSONMarshalSaveStructWithUnexportedFieldsWithNoSafe() {\n\tvar err error\n\n\tvar unexportedInStruct struct {\n\t\tBool bool // safe exported\n\n\t\tf64                  float64                         // unsafe unexported\n\t\tf64Ptr               *float64                        // unsafe unexported\n\t\tf64Slice             []float64                       // unsafe unexported\n\t\tf64Array             [10]float64                     // unsafe unexported\n\t\tmapStrF64            map[string]float64              // unsafe unexported\n\t\tmapEIStr             map[interface{}]string          // unsafe unexported\n\t\tnumber               json.Number                     // unsafe unexported\n\t\tnumberPtr            *json.Number                    // unsafe unexported\n\t\tnumberSlice          []json.Number                   // unsafe unexported\n\t\tmapNumberStr         map[json.Number]string          // unsafe unexported\n\t\tei                   interface{}                     // unsafe unexported\n\t\tstringer             fmt.Stringer                    // unsafe unexported\n\t\tmt                   marshalText                     // unsafe unexported\n\t\tmapMarshalTextString map[marshalText]string          // unsafe unexported\n\t\tunexportedStruct     ExportedUnsafeAndInvalidStruct  // unsafe unexported\n\t\tunexportedStructPtr  *ExportedUnsafeAndInvalidStruct // unsafe unexported\n\n\t\tc128         complex128           // invalid unexported\n\t\tc128Slice    []complex128         // invalid unexported\n\t\tc128Array    [10]complex128       // invalid unexported\n\t\tmapBoolStr   map[bool]string      // invalid unexported\n\t\tmapF64Str    map[float64]string   // invalid unexported\n\t\tf            func()               // invalid unexported\n\t\tch           chan struct{}        // invalid unexported\n\t\tunsafePtr    unsafe.Pointer       // invalid unexported\n\t\tmapStructStr map[structKey]string // invalid unexported\n\t}\n\t_ = unexportedInStruct.f64\n\t_ = unexportedInStruct.f64Ptr\n\t_ = unexportedInStruct.f64Slice\n\t_ = unexportedInStruct.f64Array\n\t_ = unexportedInStruct.mapStrF64\n\t_ = unexportedInStruct.mapEIStr\n\t_ = unexportedInStruct.number\n\t_ = unexportedInStruct.numberPtr\n\t_ = unexportedInStruct.numberSlice\n\t_ = unexportedInStruct.mapNumberStr\n\t_ = unexportedInStruct.ei\n\t_ = unexportedInStruct.stringer\n\t_ = unexportedInStruct.mt\n\t_ = unexportedInStruct.mapMarshalTextString\n\t_ = unexportedInStruct.unexportedStruct\n\t_ = unexportedInStruct.unexportedStructPtr\n\n\t_ = unexportedInStruct.c128\n\t_ = unexportedInStruct.c128Slice\n\t_ = unexportedInStruct.c128Array\n\t_ = unexportedInStruct.mapBoolStr\n\t_ = unexportedInStruct.mapF64Str\n\t_ = unexportedInStruct.f\n\t_ = unexportedInStruct.ch\n\t_ = unexportedInStruct.unsafePtr\n\t_ = unexportedInStruct.mapStructStr[structKey{1}]\n\t_, _ = json.Marshal(unexportedInStruct)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(unexportedInStruct) // struct containing unsafe but unexported fields is safe\n\t_ = err\n}\n\n// JSONMarshalSafeStructWithOmittedFieldsWithNoSafe contains a struct with omitted, unsafe fields.\nfunc JSONMarshalSaveStructWithOmittedFieldsWithNoSafe() {\n\tvar err error\n\n\tvar omitInStruct struct {\n\t\tBool bool // safe exported\n\n\t\tF64                  float64                         `json:\"-\"` // unsafe exported but omitted\n\t\tF64Ptr               *float64                        `json:\"-\"` // unsafe exported but omitted\n\t\tF64Slice             []float64                       `json:\"-\"` // unsafe exported but omitted\n\t\tF64Array             [10]float64                     `json:\"-\"` // unsafe exported but omitted\n\t\tMapStrF64            map[string]float64              `json:\"-\"` // unsafe exported but omitted\n\t\tMapEIStr             map[interface{}]string          `json:\"-\"` // unsafe exported but omitted\n\t\tNumber               json.Number                     `json:\"-\"` // unsafe exported but omitted\n\t\tNumberPtr            *json.Number                    `json:\"-\"` // unsafe exported but omitted\n\t\tNumberSlice          []json.Number                   `json:\"-\"` // unsafe exported but omitted\n\t\tMapNumberStr         map[json.Number]string          `json:\"-\"` // unsafe exported but omitted\n\t\tEi                   interface{}                     `json:\"-\"` // unsafe exported but omitted\n\t\tStringer             fmt.Stringer                    `json:\"-\"` // unsafe exported but omitted\n\t\tMt                   marshalText                     `json:\"-\"` // unsafe exported but omitted\n\t\tMapMarshalTextString map[marshalText]string          `json:\"-\"` // unsafe exported but omitted\n\t\tExportedStruct       ExportedUnsafeAndInvalidStruct  `json:\"-\"` // unsafe exported but omitted\n\t\tExportedStructPtr    *ExportedUnsafeAndInvalidStruct `json:\"-\"` // unsafe exported but omitted\n\n\t\tC128         complex128           `json:\"-\"` // invalid exported but omitted\n\t\tC128Slice    []complex128         `json:\"-\"` // invalid exported but omitted\n\t\tC128Array    [10]complex128       `json:\"-\"` // invalid exported but omitted\n\t\tMapBoolStr   map[bool]string      `json:\"-\"` // invalid exported but omitted\n\t\tMapF64Str    map[float64]string   `json:\"-\"` // invalid exported but omitted\n\t\tF            func()               `json:\"-\"` // invalid exported but omitted\n\t\tCh           chan struct{}        `json:\"-\"` // invalid exported but omitted\n\t\tUnsafePtr    unsafe.Pointer       `json:\"-\"` // invalid exported but omitted\n\t\tMapStructStr map[structKey]string `json:\"-\"` // invalid exported but omitted\n\t}\n\t_ = omitInStruct.MapStructStr[structKey{1}]\n\t_, _ = json.Marshal(omitInStruct)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(omitInStruct) // struct containing unsafe but omitted, exported fields is safe and check-error-free-encoding is false\n\t_ = err\n}\n\n// JSONMarshalUnsafeTypes contains a multitude of test cases to marshal different combinations of types to JSON,\n// that can potentially lead to json.Marshal returning an error.\nfunc JSONMarshalUnsafeTypes() {\n\tvar err error\n\n\tvar f32 float32\n\tjson.Marshal(f32)          // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, _ = json.Marshal(f32)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(f32) // err is checked\n\t_ = err\n\n\tvar f64 float64\n\t_, _ = json.Marshal(f64)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(f64) // err is checked\n\t_ = err\n\n\tvar f32Slice []float32\n\t_, _ = json.Marshal(f32Slice)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(f32Slice) // err is checked\n\t_ = err\n\n\tvar f64Slice []float64\n\t_, _ = json.Marshal(f64Slice)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(f64Slice) // err is checked\n\t_ = err\n\n\tvar f32Array [10]float32\n\t_, _ = json.Marshal(f32Array)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(f32Array) // err is checked\n\t_ = err\n\n\tvar f64Array [10]float64\n\t_, _ = json.Marshal(f64Array)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(f64Array) // err is checked\n\t_ = err\n\n\tvar structPtrF32 struct {\n\t\tF32 *float32\n\t}\n\t_, _ = json.Marshal(structPtrF32)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(structPtrF32) // err is checked\n\t_ = err\n\n\tvar structPtrF64 struct {\n\t\tF64 *float64\n\t}\n\t_, _ = json.Marshal(structPtrF64)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(structPtrF64) // err is checked\n\t_ = err\n\n\tvar mapStrF32 map[string]float32\n\t_, _ = json.Marshal(mapStrF32)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(mapStrF32) // err is checked\n\t_ = err\n\n\tvar mapStrF64 map[string]float64\n\t_, _ = json.Marshal(mapStrF64)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(mapStrF64) // err is checked\n\t_ = err\n\n\tvar mapEIStr map[interface{}]string\n\t_, _ = json.Marshal(mapEIStr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `interface{}` as map key found\"\n\t_, err = json.Marshal(mapEIStr) // err is checked\n\t_ = err\n\n\tvar mapStringerStr map[fmt.Stringer]string\n\t_, _ = json.Marshal(mapStringerStr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `fmt.Stringer` as map key found\"\n\t_, err = json.Marshal(mapStringerStr) // err is checked\n\t_ = err\n\n\tvar number json.Number\n\t_, _ = json.Marshal(number)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` found\"\n\t_, err = json.Marshal(number) // err is checked\n\t_ = err\n\n\tvar numberSlice []json.Number\n\t_, _ = json.Marshal(numberSlice)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` found\"\n\t_, err = json.Marshal(numberSlice) // err is checked\n\t_ = err\n\n\tvar mapNumberStr map[json.Number]string\n\t_, _ = json.Marshal(mapNumberStr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` as map key found\"\n\t_, err = json.Marshal(mapNumberStr) // err is checked\n\t_ = err\n\n\tvar mapStrNumber map[string]json.Number\n\t_, _ = json.Marshal(mapStrNumber)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` found\"\n\t_, err = json.Marshal(mapStrNumber) // err is checked\n\t_ = err\n\n\tvar ei interface{}\n\t_, _ = json.Marshal(ei)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `interface{}` found\"\n\t_, err = json.Marshal(ei) // err is checked\n\t_ = err\n\n\tvar eiptr *interface{}\n\t_, _ = json.Marshal(eiptr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `*interface{}` found\"\n\t_, err = json.Marshal(eiptr) // err is checked\n\t_ = err\n\n\tvar stringer fmt.Stringer\n\t_, _ = json.Marshal(stringer)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `fmt.Stringer` found\"\n\t_, err = json.Marshal(stringer) // err is checked\n\t_ = err\n\n\tvar structWithEmptyInterface struct {\n\t\tEmptyInterface interface{}\n\t}\n\t_, _ = json.Marshal(structWithEmptyInterface)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `interface{}` found\"\n\t_, err = json.Marshal(structWithEmptyInterface) // err is checked\n\t_ = err\n\n\tvar mt marshalText\n\t_, _ = json.Marshal(mt)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `[a-z-]+.marshalText` found\"\n\t_, err = json.Marshal(mt) // err is checked\n\t_ = err\n\n\tvar mapMarshalTextString map[marshalText]string\n\t_, _ = json.Marshal(mapMarshalTextString)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `[a-z-]+.marshalText` as map key found\"\n\t_, err = json.Marshal(mapMarshalTextString) // err is checked\n\t_ = err\n}\n\n// JSONMarshalInvalidTypes contains a multitude of test cases to marshal different combinations of types to JSON,\n// that are invalid and not supported by json.Marshal, that is they will always return an error, if these types used\n// with json.Marshal.\nfunc JSONMarshalInvalidTypes() {\n\tvar err error\n\n\tvar c64 complex64\n\tjson.Marshal(c64)          // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, _ = json.Marshal(c64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(c64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar c128 complex128\n\t_, _ = json.Marshal(c128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(c128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar sliceC64 []complex64\n\t_, _ = json.Marshal(sliceC64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(sliceC64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar sliceC128 []complex128\n\t_, _ = json.Marshal(sliceC128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(sliceC128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar arrayC64 []complex64\n\t_, _ = json.Marshal(arrayC64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(arrayC64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar arrayC128 []complex128\n\t_, _ = json.Marshal(arrayC128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(arrayC128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar structPtrC64 struct {\n\t\tC64 *complex64\n\t}\n\t_, _ = json.Marshal(structPtrC64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(structPtrC64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar structPtrC128 struct {\n\t\tC128 *complex128\n\t}\n\t_, _ = json.Marshal(structPtrC128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(structPtrC128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar mapBoolStr map[bool]string\n\t_, _ = json.Marshal(mapBoolStr)   // want \"`encoding/json.Marshal` for unsupported type `bool` as map key found\"\n\t_, err = json.Marshal(mapBoolStr) // want \"`encoding/json.Marshal` for unsupported type `bool` as map key found\"\n\t_ = err\n\n\tvar mapF32Str map[float32]string\n\t_, _ = json.Marshal(mapF32Str)   // want \"`encoding/json.Marshal` for unsupported type `float32` as map key found\"\n\t_, err = json.Marshal(mapF32Str) // want \"`encoding/json.Marshal` for unsupported type `float32` as map key found\"\n\t_ = err\n\n\tvar mapF64Str map[float64]string\n\t_, _ = json.Marshal(mapF64Str)   // want \"`encoding/json.Marshal` for unsupported type `float64` as map key found\"\n\t_, err = json.Marshal(mapF64Str) // want \"`encoding/json.Marshal` for unsupported type `float64` as map key found\"\n\t_ = err\n\n\tvar mapC64Str map[complex64]string\n\t_, _ = json.Marshal(mapC64Str)   // want \"`encoding/json.Marshal` for unsupported type `complex64` as map key found\"\n\t_, err = json.Marshal(mapC64Str) // want \"`encoding/json.Marshal` for unsupported type `complex64` as map key found\"\n\t_ = err\n\n\tvar mapC128Str map[complex128]string\n\t_, _ = json.Marshal(mapC128Str)   // want \"`encoding/json.Marshal` for unsupported type `complex128` as map key found\"\n\t_, err = json.Marshal(mapC128Str) // want \"`encoding/json.Marshal` for unsupported type `complex128` as map key found\"\n\t_ = err\n\n\tmapStructStr := map[structKey]string{structKey{1}: \"str\"}\n\t_, _ = json.Marshal(mapStructStr)   // want \"`encoding/json.Marshal` for unsupported type `[a-z-]+.structKey` as map key found\"\n\t_, err = json.Marshal(mapStructStr) // want \"`encoding/json.Marshal` for unsupported type `[a-z-]+.structKey` as map key found\"\n\t_ = err\n\n\tf := func() {}\n\t_, _ = json.Marshal(f)   // want \"`encoding/json.Marshal` for unsupported type `func\\\\(\\\\)` found\"\n\t_, err = json.Marshal(f) // want \"`encoding/json.Marshal` for unsupported type `func\\\\(\\\\)` found\"\n\t_ = err\n\n\tvar ch chan struct{} = make(chan struct{})\n\t_, _ = json.Marshal(ch)   // want \"`encoding/json.Marshal` for unsupported type `chan struct{}` found\"\n\t_, err = json.Marshal(ch) // want \"`encoding/json.Marshal` for unsupported type `chan struct{}` found\"\n\t_ = err\n\n\tvar unsafePtr unsafe.Pointer\n\t_, _ = json.Marshal(unsafePtr)   // want \"`encoding/json.Marshal` for unsupported type `unsafe.Pointer` found\"\n\t_, err = json.Marshal(unsafePtr) // want \"`encoding/json.Marshal` for unsupported type `unsafe.Pointer` found\"\n\t_ = err\n}\n\n// NotJSONMarshal contains other go ast node types, that are not considered by errchkjson\nfunc NotJSONMarshal() {\n\ts := fmt.Sprintln(\"I am not considered by errchkjson\")\n\t_ = s\n\tf := func() bool { return false }\n\t_ = f()\n}\n\n// JSONMarshalStructWithoutExportedFields contains a struct without exported fields.\nfunc JSONMarshalStructWithoutExportedFields() {\n\tvar err error\n\n\tvar withoutExportedFields struct {\n\t\tprivateField            bool\n\t\tExportedButOmittedField bool `json:\"-\"`\n\t}\n\t_, err = json.Marshal(withoutExportedFields)\n\t_ = err\n}\n\n// JSONMarshalStructWithoutExportedFields contains a struct without exported fields.\nfunc JSONMarshalStructWithNestedStructWithoutExportedFields() {\n\tvar err error\n\n\tvar withNestedStructWithoutExportedFields struct {\n\t\tExportedStruct struct {\n\t\t\tprivatField bool\n\t\t}\n\t}\n\t_, err = json.Marshal(withNestedStructWithoutExportedFields)\n\t_ = err\n}\n"
  },
  {
    "path": "pkg/golinters/errchkjson/testdata/errchkjson.yml",
    "content": "version: \"2\"\n\nissues:\n  max-issues-per-linter: 100\n"
  },
  {
    "path": "pkg/golinters/errchkjson/testdata/errchkjson_cgo.go",
    "content": "//golangcitest:args -Eerrchkjson\n//golangcitest:config_path testdata/errchkjson.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"encoding/json\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tvar err error\n\n\t_, _ = json.Marshal(nil)   // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\tjson.Marshal(nil)          // want \"Error return value of `encoding/json.Marshal` is not checked\"\n\t_, err = json.Marshal(nil) // nil is safe and check-error-free-encoding is false\n\t_ = err\n}\n"
  },
  {
    "path": "pkg/golinters/errchkjson/testdata/errchkjson_check_error_free_encoding.go",
    "content": "//golangcitest:args -Eerrchkjson\n//golangcitest:config_path testdata/errchkjson_check_error_free_encoding.yml\npackage testdata\n\nimport (\n\t\"encoding\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"unsafe\"\n)\n\ntype marshalText struct{}\n\nfunc (mt marshalText) MarshalText() ([]byte, error) {\n\treturn []byte(`mt`), nil\n}\n\nvar _ encoding.TextMarshaler = marshalText(struct{}{})\n\n// JSONMarshalSafeTypes contains a multitude of test cases to marshal different combinations of types to JSON,\n// that are safe, that is, they will never return an error, if these types are marshaled to JSON.\nfunc JSONMarshalSafeTypes() {\n\tvar err error\n\n\t_, _ = json.Marshal(nil)   // nil is safe\n\tjson.Marshal(nil)          // nil is safe\n\t_, err = json.Marshal(nil) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\t_, _ = json.MarshalIndent(nil, \"\", \" \")   // nil is safe\n\tjson.MarshalIndent(nil, \"\", \" \")          // nil is safe\n\t_, err = json.MarshalIndent(nil, \"\", \" \") // want \"Error return value of `encoding/json.MarshalIndent` is checked but passed argument is safe\"\n\t_ = err\n\n\tenc := json.NewEncoder(ioutil.Discard)\n\t_ = enc.Encode(nil) // want \"Error return value of `\\\\([*]encoding/json.Encoder\\\\).Encode` is not checked\"\n\tenc.Encode(nil)     // want \"Error return value of `\\\\([*]encoding/json.Encoder\\\\).Encode` is not checked\"\n\terr = enc.Encode(nil)\n\t_ = err\n\n\tvar b bool\n\t_, _ = json.Marshal(b)   // bool is safe\n\t_, err = json.Marshal(b) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar i int\n\t_, _ = json.Marshal(i)   // int is safe\n\t_, err = json.Marshal(i) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar i8 int8\n\t_, _ = json.Marshal(i8)   // int8 is safe\n\t_, err = json.Marshal(i8) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar i16 int16\n\t_, _ = json.Marshal(i16)   // int16 is safe\n\t_, err = json.Marshal(i16) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar i32 int32\n\t_, _ = json.Marshal(i32)   // int32 / rune is safe\n\t_, err = json.Marshal(i32) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar i64 int64\n\t_, _ = json.Marshal(i64)   // int64 is safe\n\t_, err = json.Marshal(i64) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar ui uint\n\t_, _ = json.Marshal(ui)   // uint is safe\n\t_, err = json.Marshal(ui) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar ui8 uint8\n\t_, _ = json.Marshal(ui8)   // uint8 / byte is safe\n\t_, err = json.Marshal(ui8) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar ui16 uint16\n\t_, _ = json.Marshal(ui16)   // uint16 is safe\n\t_, err = json.Marshal(ui16) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar ui32 uint32\n\t_, _ = json.Marshal(ui32)   // uint32 / rune is safe\n\t_, err = json.Marshal(ui32) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar ui64 uint64\n\t_, _ = json.Marshal(ui64)   // uint64 is safe\n\t_, err = json.Marshal(ui64) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar uiptr uintptr\n\t_, _ = json.Marshal(uiptr)   // uintptr is safe\n\t_, err = json.Marshal(uiptr) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar str string\n\t_, _ = json.Marshal(str)   // string is safe\n\t_, err = json.Marshal(str) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar strSlice []string\n\t_, _ = json.Marshal(strSlice)   // []string is safe\n\t_, err = json.Marshal(strSlice) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar intSlice []int\n\t_, _ = json.Marshal(intSlice)   // []int is safe\n\t_, err = json.Marshal(intSlice) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar boolSlice []bool\n\t_, _ = json.Marshal(boolSlice)   // []bool is safe\n\t_, err = json.Marshal(boolSlice) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar strArray [10]string\n\t_, _ = json.Marshal(strArray)   // [10]string is safe\n\t_, err = json.Marshal(strArray) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar intArray [10]int\n\t_, _ = json.Marshal(intArray)   // [10]int is safe\n\t_, err = json.Marshal(intArray) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar boolArray [10]bool\n\t_, _ = json.Marshal(boolArray)   // [10]bool is safe\n\t_, err = json.Marshal(boolArray) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar basicStruct struct {\n\t\tBool    bool\n\t\tInt     int\n\t\tInt8    int8\n\t\tInt16   int16\n\t\tInt32   int32 // also rune\n\t\tInt64   int64\n\t\tUint    uint\n\t\tUint8   uint8 // also byte\n\t\tUint16  uint16\n\t\tUint32  uint32\n\t\tUint64  uint64\n\t\tUintptr uintptr\n\t\tString  string\n\t}\n\t_, _ = json.Marshal(basicStruct)   // struct containing only safe basic types is safe\n\t_, err = json.Marshal(basicStruct) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar ptrStruct struct {\n\t\tBool    *bool\n\t\tInt     *int\n\t\tInt8    *int8\n\t\tInt16   *int16\n\t\tInt32   *int32\n\t\tInt64   *int64\n\t\tUint    *uint\n\t\tUint8   *uint8\n\t\tUint16  *uint16\n\t\tUint32  *uint32\n\t\tUint64  *uint64\n\t\tUintptr *uintptr\n\t\tString  *string\n\t}\n\t_, _ = json.Marshal(ptrStruct)   // struct containing pointer to only safe basic types is safe\n\t_, err = json.Marshal(ptrStruct) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar mapStrStr map[string]string\n\t_, _ = json.Marshal(mapStrStr)   // map[string]string is safe\n\t_, err = json.Marshal(mapStrStr) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar mapStrInt map[string]int\n\t_, _ = json.Marshal(mapStrInt)   // map[string]int is safe\n\t_, err = json.Marshal(mapStrInt) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar mapStrBool map[string]bool\n\t_, _ = json.Marshal(mapStrBool)   // map[string]bool is safe\n\t_, err = json.Marshal(mapStrBool) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar mapIntStr map[int]string\n\t_, _ = json.Marshal(mapIntStr)   // map[int]string is safe\n\t_, err = json.Marshal(mapIntStr) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar mapIntInt map[int]int\n\t_, _ = json.Marshal(mapIntInt)   // map[int]int is safe\n\t_, err = json.Marshal(mapIntInt) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\tvar mapIntBool map[int]bool\n\t_, _ = json.Marshal(mapIntBool)   // map[int]bool is safe\n\t_, err = json.Marshal(mapIntBool) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n\n\ttype innerStruct struct {\n\t\tBool   bool\n\t\tInt    int\n\t\tString string\n\n\t\tStrSlice  []string\n\t\tIntSlice  []int\n\t\tBoolSlice []bool\n\n\t\tStrArray  [10]string\n\t\tIntArray  [10]int\n\t\tBoolArray [10]bool\n\n\t\tMapStrStr  map[string]string\n\t\tMapStrInt  map[string]int\n\t\tMapStrBool map[string]bool\n\n\t\tMapIntStr  map[int]string\n\t\tMapIntInt  map[int]int\n\t\tMapIntBool map[int]bool\n\t}\n\tvar outerStruct struct {\n\t\tBool   bool\n\t\tInt    int\n\t\tString string\n\n\t\tStrSlice  []string\n\t\tIntSlice  []int\n\t\tBoolSlice []bool\n\n\t\tStrArray  [10]string\n\t\tIntArray  [10]int\n\t\tBoolArray [10]bool\n\n\t\tMapStrStr  map[string]string\n\t\tMapStrInt  map[string]int\n\t\tMapStrBool map[string]bool\n\n\t\tMapIntStr  map[int]string\n\t\tMapIntInt  map[int]int\n\t\tMapIntBool map[int]bool\n\n\t\tInnerStruct innerStruct\n\t}\n\t_, _ = json.Marshal(outerStruct)   // struct with only safe types\n\t_, err = json.Marshal(outerStruct) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n}\n\ntype (\n\tstructKey                      struct{ id int }\n\tExportedUnsafeAndInvalidStruct struct { // unsafe unexported but omitted\n\t\tF64                  float64\n\t\tF64Ptr               *float64\n\t\tF64Slice             []float64\n\t\tF64Array             [10]float64\n\t\tMapStrF64            map[string]float64\n\t\tMapEIStr             map[interface{}]string\n\t\tNumber               json.Number\n\t\tNumberPtr            *json.Number\n\t\tNumberSlice          []json.Number\n\t\tMapNumberStr         map[json.Number]string\n\t\tEi                   interface{}\n\t\tStringer             fmt.Stringer\n\t\tMt                   marshalText\n\t\tMapMarshalTextString map[marshalText]string\n\n\t\tC128         complex128\n\t\tC128Ptr      *complex128\n\t\tC128Slice    []complex128\n\t\tC128Array    [10]complex128\n\t\tMapBoolStr   map[bool]string\n\t\tMapF64Str    map[float64]string\n\t\tF            func()\n\t\tCh           chan struct{}\n\t\tUnsafePtr    unsafe.Pointer\n\t\tMapStructStr map[structKey]string\n\t}\n)\n\n// JSONMarshalSaveStructWithUnexportedFields contains a struct with unexported, unsafe fields.\nfunc JSONMarshalSaveStructWithUnexportedFields() {\n\tvar err error\n\n\tvar unexportedInStruct struct {\n\t\tBool bool // safe exported\n\n\t\tf64                  float64                         // unsafe unexported\n\t\tf64Ptr               *float64                        // unsafe unexported\n\t\tf64Slice             []float64                       // unsafe unexported\n\t\tf64Array             [10]float64                     // unsafe unexported\n\t\tmapStrF64            map[string]float64              // unsafe unexported\n\t\tmapEIStr             map[interface{}]string          // unsafe unexported\n\t\tnumber               json.Number                     // unsafe unexported\n\t\tnumberPtr            *json.Number                    // unsafe unexported\n\t\tnumberSlice          []json.Number                   // unsafe unexported\n\t\tmapNumberStr         map[json.Number]string          // unsafe unexported\n\t\tei                   interface{}                     // unsafe unexported\n\t\tstringer             fmt.Stringer                    // unsafe unexported\n\t\tmt                   marshalText                     // unsafe unexported\n\t\tmapMarshalTextString map[marshalText]string          // unsafe unexported\n\t\tunexportedStruct     ExportedUnsafeAndInvalidStruct  // unsafe unexported\n\t\tunexportedStructPtr  *ExportedUnsafeAndInvalidStruct // unsafe unexported\n\n\t\tc128         complex128           // invalid unexported\n\t\tc128Slice    []complex128         // invalid unexported\n\t\tc128Array    [10]complex128       // invalid unexported\n\t\tmapBoolStr   map[bool]string      // invalid unexported\n\t\tmapF64Str    map[float64]string   // invalid unexported\n\t\tf            func()               // invalid unexported\n\t\tch           chan struct{}        // invalid unexported\n\t\tunsafePtr    unsafe.Pointer       // invalid unexported\n\t\tmapStructStr map[structKey]string // invalid unexported\n\t}\n\t_ = unexportedInStruct.f64\n\t_ = unexportedInStruct.f64Ptr\n\t_ = unexportedInStruct.f64Slice\n\t_ = unexportedInStruct.f64Array\n\t_ = unexportedInStruct.mapStrF64\n\t_ = unexportedInStruct.mapEIStr\n\t_ = unexportedInStruct.number\n\t_ = unexportedInStruct.numberPtr\n\t_ = unexportedInStruct.numberSlice\n\t_ = unexportedInStruct.mapNumberStr\n\t_ = unexportedInStruct.ei\n\t_ = unexportedInStruct.stringer\n\t_ = unexportedInStruct.mt\n\t_ = unexportedInStruct.mapMarshalTextString\n\t_ = unexportedInStruct.unexportedStruct\n\t_ = unexportedInStruct.unexportedStructPtr\n\n\t_ = unexportedInStruct.c128\n\t_ = unexportedInStruct.c128Slice\n\t_ = unexportedInStruct.c128Array\n\t_ = unexportedInStruct.mapBoolStr\n\t_ = unexportedInStruct.mapF64Str\n\t_ = unexportedInStruct.f\n\t_ = unexportedInStruct.ch\n\t_ = unexportedInStruct.unsafePtr\n\t_ = unexportedInStruct.mapStructStr[structKey{1}]\n\t_, _ = json.Marshal(unexportedInStruct)   // struct containing unsafe but unexported fields is safe\n\t_, err = json.Marshal(unexportedInStruct) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n}\n\n// JSONMarshalSaveStructWithOmittedFields contains a struct with omitted, unsafe fields.\nfunc JSONMarshalSaveStructWithOmittedFields() {\n\tvar err error\n\n\tvar omitInStruct struct {\n\t\tBool bool // safe exported\n\n\t\tF64                  float64                         `json:\"-\"` // unsafe exported but omitted\n\t\tF64Ptr               *float64                        `json:\"-\"` // unsafe exported but omitted\n\t\tF64Slice             []float64                       `json:\"-\"` // unsafe exported but omitted\n\t\tF64Array             [10]float64                     `json:\"-\"` // unsafe exported but omitted\n\t\tMapStrF64            map[string]float64              `json:\"-\"` // unsafe exported but omitted\n\t\tMapEIStr             map[interface{}]string          `json:\"-\"` // unsafe exported but omitted\n\t\tNumber               json.Number                     `json:\"-\"` // unsafe exported but omitted\n\t\tNumberPtr            *json.Number                    `json:\"-\"` // unsafe exported but omitted\n\t\tNumberSlice          []json.Number                   `json:\"-\"` // unsafe exported but omitted\n\t\tMapNumberStr         map[json.Number]string          `json:\"-\"` // unsafe exported but omitted\n\t\tEi                   interface{}                     `json:\"-\"` // unsafe exported but omitted\n\t\tStringer             fmt.Stringer                    `json:\"-\"` // unsafe exported but omitted\n\t\tMt                   marshalText                     `json:\"-\"` // unsafe exported but omitted\n\t\tMapMarshalTextString map[marshalText]string          `json:\"-\"` // unsafe exported but omitted\n\t\tExportedStruct       ExportedUnsafeAndInvalidStruct  `json:\"-\"` // unsafe exported but omitted\n\t\tExportedStructPtr    *ExportedUnsafeAndInvalidStruct `json:\"-\"` // unsafe exported but omitted\n\n\t\tC128         complex128           `json:\"-\"` // invalid exported but omitted\n\t\tC128Slice    []complex128         `json:\"-\"` // invalid exported but omitted\n\t\tC128Array    [10]complex128       `json:\"-\"` // invalid exported but omitted\n\t\tMapBoolStr   map[bool]string      `json:\"-\"` // invalid exported but omitted\n\t\tMapF64Str    map[float64]string   `json:\"-\"` // invalid exported but omitted\n\t\tF            func()               `json:\"-\"` // invalid exported but omitted\n\t\tCh           chan struct{}        `json:\"-\"` // invalid exported but omitted\n\t\tUnsafePtr    unsafe.Pointer       `json:\"-\"` // invalid exported but omitted\n\t\tMapStructStr map[structKey]string `json:\"-\"` // invalid exported but omitted\n\t}\n\t_ = omitInStruct.MapStructStr[structKey{1}]\n\t_, _ = json.Marshal(omitInStruct)   // struct containing unsafe but omitted, exported fields is safe\n\t_, err = json.Marshal(omitInStruct) // want \"Error return value of `encoding/json.Marshal` is checked but passed argument is safe\"\n\t_ = err\n}\n\n// JSONMarshalUnsafeTypes contains a multitude of test cases to marshal different combinations of types to JSON,\n// that can potentially lead to json.Marshal returning an error.\nfunc JSONMarshalUnsafeTypes() {\n\tvar err error\n\n\tvar f32 float32\n\tjson.Marshal(f32)          // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, _ = json.Marshal(f32)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(f32) // err is checked\n\t_ = err\n\n\tvar f64 float64\n\t_, _ = json.Marshal(f64)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(f64) // err is checked\n\t_ = err\n\n\tvar f32Slice []float32\n\t_, _ = json.Marshal(f32Slice)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(f32Slice) // err is checked\n\t_ = err\n\n\tvar f64Slice []float64\n\t_, _ = json.Marshal(f64Slice)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(f64Slice) // err is checked\n\t_ = err\n\n\tvar f32Array [10]float32\n\t_, _ = json.Marshal(f32Array)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(f32Array) // err is checked\n\t_ = err\n\n\tvar f64Array [10]float64\n\t_, _ = json.Marshal(f64Array)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(f64Array) // err is checked\n\t_ = err\n\n\tvar structPtrF32 struct {\n\t\tF32 *float32\n\t}\n\t_, _ = json.Marshal(structPtrF32)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(structPtrF32) // err is checked\n\t_ = err\n\n\tvar structPtrF64 struct {\n\t\tF64 *float64\n\t}\n\t_, _ = json.Marshal(structPtrF64)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(structPtrF64) // err is checked\n\t_ = err\n\n\tvar mapStrF32 map[string]float32\n\t_, _ = json.Marshal(mapStrF32)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float32` found\"\n\t_, err = json.Marshal(mapStrF32) // err is checked\n\t_ = err\n\n\tvar mapStrF64 map[string]float64\n\t_, _ = json.Marshal(mapStrF64)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `float64` found\"\n\t_, err = json.Marshal(mapStrF64) // err is checked\n\t_ = err\n\n\tvar mapEIStr map[interface{}]string\n\t_, _ = json.Marshal(mapEIStr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `interface{}` as map key found\"\n\t_, err = json.Marshal(mapEIStr) // err is checked\n\t_ = err\n\n\tvar mapStringerStr map[fmt.Stringer]string\n\t_, _ = json.Marshal(mapStringerStr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `fmt.Stringer` as map key found\"\n\t_, err = json.Marshal(mapStringerStr) // err is checked\n\t_ = err\n\n\tvar number json.Number\n\t_, _ = json.Marshal(number)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` found\"\n\t_, err = json.Marshal(number) // err is checked\n\t_ = err\n\n\tvar numberSlice []json.Number\n\t_, _ = json.Marshal(numberSlice)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` found\"\n\t_, err = json.Marshal(numberSlice) // err is checked\n\t_ = err\n\n\tvar mapNumberStr map[json.Number]string\n\t_, _ = json.Marshal(mapNumberStr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` as map key found\"\n\t_, err = json.Marshal(mapNumberStr) // err is checked\n\t_ = err\n\n\tvar mapStrNumber map[string]json.Number\n\t_, _ = json.Marshal(mapStrNumber)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `encoding/json.Number` found\"\n\t_, err = json.Marshal(mapStrNumber) // err is checked\n\t_ = err\n\n\tvar ei interface{}\n\t_, _ = json.Marshal(ei)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `interface{}` found\"\n\t_, err = json.Marshal(ei) // err is checked\n\t_ = err\n\n\tvar eiptr *interface{}\n\t_, _ = json.Marshal(eiptr)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `*interface{}` found\"\n\t_, err = json.Marshal(eiptr) // err is checked\n\t_ = err\n\n\tvar stringer fmt.Stringer\n\t_, _ = json.Marshal(stringer)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `fmt.Stringer` found\"\n\t_, err = json.Marshal(stringer) // err is checked\n\t_ = err\n\n\tvar structWithEmptyInterface struct {\n\t\tEmptyInterface interface{}\n\t}\n\t_, _ = json.Marshal(structWithEmptyInterface)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `interface{}` found\"\n\t_, err = json.Marshal(structWithEmptyInterface) // err is checked\n\t_ = err\n\n\tvar mt marshalText\n\t_, _ = json.Marshal(mt)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `[a-z-]+.marshalText` found\"\n\t_, err = json.Marshal(mt) // err is checked\n\t_ = err\n\n\tvar mapMarshalTextString map[marshalText]string\n\t_, _ = json.Marshal(mapMarshalTextString)   // want \"Error return value of `encoding/json.Marshal` is not checked: unsafe type `[a-z-]+.marshalText` as map key found\"\n\t_, err = json.Marshal(mapMarshalTextString) // err is checked\n\t_ = err\n}\n\n// JSONMarshalInvalidTypes contains a multitude of test cases to marshal different combinations of types to JSON,\n// that are invalid and not supported by json.Marshal, that is they will always return an error, if these types used\n// with json.Marshal.\nfunc JSONMarshalInvalidTypes() {\n\tvar err error\n\n\tvar c64 complex64\n\tjson.Marshal(c64)          // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, _ = json.Marshal(c64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(c64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar c128 complex128\n\t_, _ = json.Marshal(c128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(c128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar sliceC64 []complex64\n\t_, _ = json.Marshal(sliceC64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(sliceC64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar sliceC128 []complex128\n\t_, _ = json.Marshal(sliceC128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(sliceC128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar arrayC64 []complex64\n\t_, _ = json.Marshal(arrayC64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(arrayC64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar arrayC128 []complex128\n\t_, _ = json.Marshal(arrayC128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(arrayC128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar structPtrC64 struct {\n\t\tC64 *complex64\n\t}\n\t_, _ = json.Marshal(structPtrC64)   // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_, err = json.Marshal(structPtrC64) // want \"`encoding/json.Marshal` for unsupported type `complex64` found\"\n\t_ = err\n\n\tvar structPtrC128 struct {\n\t\tC128 *complex128\n\t}\n\t_, _ = json.Marshal(structPtrC128)   // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_, err = json.Marshal(structPtrC128) // want \"`encoding/json.Marshal` for unsupported type `complex128` found\"\n\t_ = err\n\n\tvar mapBoolStr map[bool]string\n\t_, _ = json.Marshal(mapBoolStr)   // want \"`encoding/json.Marshal` for unsupported type `bool` as map key found\"\n\t_, err = json.Marshal(mapBoolStr) // want \"`encoding/json.Marshal` for unsupported type `bool` as map key found\"\n\t_ = err\n\n\tvar mapF32Str map[float32]string\n\t_, _ = json.Marshal(mapF32Str)   // want \"`encoding/json.Marshal` for unsupported type `float32` as map key found\"\n\t_, err = json.Marshal(mapF32Str) // want \"`encoding/json.Marshal` for unsupported type `float32` as map key found\"\n\t_ = err\n\n\tvar mapF64Str map[float64]string\n\t_, _ = json.Marshal(mapF64Str)   // want \"`encoding/json.Marshal` for unsupported type `float64` as map key found\"\n\t_, err = json.Marshal(mapF64Str) // want \"`encoding/json.Marshal` for unsupported type `float64` as map key found\"\n\t_ = err\n\n\tvar mapC64Str map[complex64]string\n\t_, _ = json.Marshal(mapC64Str)   // want \"`encoding/json.Marshal` for unsupported type `complex64` as map key found\"\n\t_, err = json.Marshal(mapC64Str) // want \"`encoding/json.Marshal` for unsupported type `complex64` as map key found\"\n\t_ = err\n\n\tvar mapC128Str map[complex128]string\n\t_, _ = json.Marshal(mapC128Str)   // want \"`encoding/json.Marshal` for unsupported type `complex128` as map key found\"\n\t_, err = json.Marshal(mapC128Str) // want \"`encoding/json.Marshal` for unsupported type `complex128` as map key found\"\n\t_ = err\n\n\tmapStructStr := map[structKey]string{structKey{1}: \"str\"}\n\t_, _ = json.Marshal(mapStructStr)   // want \"`encoding/json.Marshal` for unsupported type `[a-z-]+.structKey` as map key found\"\n\t_, err = json.Marshal(mapStructStr) // want \"`encoding/json.Marshal` for unsupported type `[a-z-]+.structKey` as map key found\"\n\t_ = err\n\n\tf := func() {}\n\t_, _ = json.Marshal(f)   // want \"`encoding/json.Marshal` for unsupported type `func\\\\(\\\\)` found\"\n\t_, err = json.Marshal(f) // want \"`encoding/json.Marshal` for unsupported type `func\\\\(\\\\)` found\"\n\t_ = err\n\n\tvar ch chan struct{} = make(chan struct{})\n\t_, _ = json.Marshal(ch)   // want \"`encoding/json.Marshal` for unsupported type `chan struct{}` found\"\n\t_, err = json.Marshal(ch) // want \"`encoding/json.Marshal` for unsupported type `chan struct{}` found\"\n\t_ = err\n\n\tvar unsafePtr unsafe.Pointer\n\t_, _ = json.Marshal(unsafePtr)   // want \"`encoding/json.Marshal` for unsupported type `unsafe.Pointer` found\"\n\t_, err = json.Marshal(unsafePtr) // want \"`encoding/json.Marshal` for unsupported type `unsafe.Pointer` found\"\n\t_ = err\n}\n\n// NotJSONMarshal contains other go ast node types, that are not considered by errchkjson\nfunc NotJSONMarshal() {\n\ts := fmt.Sprintln(\"I am not considered by errchkjson\")\n\t_ = s\n\tf := func() bool { return false }\n\t_ = f()\n}\n"
  },
  {
    "path": "pkg/golinters/errchkjson/testdata/errchkjson_check_error_free_encoding.yml",
    "content": "version: \"2\"\n\nissues:\n  max-issues-per-linter: 100\n\nlinters:\n  settings:\n    errchkjson:\n      check-error-free-encoding: true\n"
  },
  {
    "path": "pkg/golinters/errchkjson/testdata/errchkjson_no_exported.go",
    "content": "//golangcitest:args -Eerrchkjson\n//golangcitest:config_path testdata/errchkjson_no_exported.yml\npackage testdata\n\nimport (\n\t\"encoding/json\"\n)\n\n// JSONMarshalStructWithoutExportedFields contains a struct without exported fields.\nfunc JSONMarshalStructWithoutExportedFields() {\n\tvar withoutExportedFields struct {\n\t\tprivateField            bool\n\t\tExportedButOmittedField bool `json:\"-\"`\n\t}\n\t_, err := json.Marshal(withoutExportedFields) // want \"Error argument passed to `encoding/json.Marshal` does not contain any exported field\"\n\t_ = err\n}\n\n// JSONMarshalStructWithNestedStructWithoutExportedFields contains a struct without exported fields.\nfunc JSONMarshalStructWithNestedStructWithoutExportedFields() {\n\tvar withNestedStructWithoutExportedFields struct {\n\t\tExportedStruct struct {\n\t\t\tprivatField bool\n\t\t}\n\t}\n\t_, err := json.Marshal(withNestedStructWithoutExportedFields)\n\t_ = err\n}\n"
  },
  {
    "path": "pkg/golinters/errchkjson/testdata/errchkjson_no_exported.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    errchkjson:\n      report-no-exported: true\n"
  },
  {
    "path": "pkg/golinters/errname/errname.go",
    "content": "package errname\n\nimport (\n\t\"github.com/Antonboom/errname/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.New()).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/errname/errname_integration_test.go",
    "content": "package errname\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/errname/testdata/errname.go",
    "content": "//golangcitest:args -Eerrname\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nvar (\n\tEOF          = errors.New(\"end of file\")\n\tErrEndOfFile = errors.New(\"end of file\")\n\terrEndOfFile = errors.New(\"end of file\")\n\n\tEndOfFileError = errors.New(\"end of file\") // want \"the sentinel error name `EndOfFileError` should conform to the `ErrXxx` format\"\n\tErrorEndOfFile = errors.New(\"end of file\") // want \"the sentinel error name `ErrorEndOfFile` should conform to the `ErrXxx` format\"\n\tEndOfFileErr   = errors.New(\"end of file\") // want \"the sentinel error name `EndOfFileErr` should conform to the `ErrXxx` format\"\n\tendOfFileError = errors.New(\"end of file\") // want \"the sentinel error name `endOfFileError` should conform to the `errXxx` format\"\n\terrorEndOfFile = errors.New(\"end of file\") // want \"the sentinel error name `errorEndOfFile` should conform to the `errXxx` format\"\n)\n\nconst maxSize = 256\n\nvar (\n\tErrOutOfSize = fmt.Errorf(\"out of size (max %d)\", maxSize)\n\terrOutOfSize = fmt.Errorf(\"out of size (max %d)\", maxSize)\n\n\tOutOfSizeError = fmt.Errorf(\"out of size (max %d)\", maxSize) // want \"the sentinel error name `OutOfSizeError` should conform to the `ErrXxx` format\"\n\toutOfSizeError = fmt.Errorf(\"out of size (max %d)\", maxSize) // want \"the sentinel error name `outOfSizeError` should conform to the `errXxx` format\"\n)\n\nfunc errInsideFuncIsNotSentinel() error {\n\tvar lastErr error\n\treturn lastErr\n}\n\ntype NotErrorType struct{}\n\nfunc (t NotErrorType) Set() {}\nfunc (t NotErrorType) Get() {}\n\ntype DNSConfigError struct{}\n\nfunc (D DNSConfigError) Error() string { return \"DNS config error\" }\n\ntype someTypeWithoutPtr struct{}           // want \"the error type name `someTypeWithoutPtr` should conform to the `xxxError` format\"\nfunc (s someTypeWithoutPtr) Error() string { return \"someTypeWithoutPtr\" }\n\ntype SomeTypeWithoutPtr struct{}           // want \"the error type name `SomeTypeWithoutPtr` should conform to the `XxxError` format\"\nfunc (s SomeTypeWithoutPtr) Error() string { return \"SomeTypeWithoutPtr\" }\n\ntype someTypeWithPtr struct{}            // want \"the error type name `someTypeWithPtr` should conform to the `xxxError` format\"\nfunc (s *someTypeWithPtr) Error() string { return \"someTypeWithPtr\" }\n\ntype SomeTypeWithPtr struct{}            // want \"the error type name `SomeTypeWithPtr` should conform to the `XxxError` format\"\nfunc (s *SomeTypeWithPtr) Error() string { return \"SomeTypeWithPtr\" }\n"
  },
  {
    "path": "pkg/golinters/errname/testdata/errname_cgo.go",
    "content": "//golangcitest:args -Eerrname\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"errors\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nvar (\n\tEOF          = errors.New(\"end of file\")\n\tErrEndOfFile = errors.New(\"end of file\")\n\terrEndOfFile = errors.New(\"end of file\")\n\n\tEndOfFileError = errors.New(\"end of file\") // want \"the sentinel error name `EndOfFileError` should conform to the `ErrXxx` format\"\n\tErrorEndOfFile = errors.New(\"end of file\") // want \"the sentinel error name `ErrorEndOfFile` should conform to the `ErrXxx` format\"\n\tEndOfFileErr   = errors.New(\"end of file\") // want \"the sentinel error name `EndOfFileErr` should conform to the `ErrXxx` format\"\n\tendOfFileError = errors.New(\"end of file\") // want \"the sentinel error name `endOfFileError` should conform to the `errXxx` format\"\n\terrorEndOfFile = errors.New(\"end of file\") // want \"the sentinel error name `errorEndOfFile` should conform to the `errXxx` format\"\n)\n"
  },
  {
    "path": "pkg/golinters/errorlint/errorlint.go",
    "content": "package errorlint\n\nimport (\n\t\"codeberg.org/polyfloyd/go-errorlint/errorlint\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.ErrorLintSettings) *goanalysis.Linter {\n\tvar opts []errorlint.Option\n\n\tif settings != nil {\n\t\tae := toAllowPairs(settings.AllowedErrors)\n\t\tif len(ae) > 0 {\n\t\t\topts = append(opts, errorlint.WithAllowedErrors(ae))\n\t\t}\n\n\t\taew := toAllowPairs(settings.AllowedErrorsWildcard)\n\t\tif len(aew) > 0 {\n\t\t\topts = append(opts, errorlint.WithAllowedWildcard(aew))\n\t\t}\n\t}\n\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"errorf\":       settings.Errorf,\n\t\t\t\"errorf-multi\": settings.ErrorfMulti,\n\t\t\t\"asserts\":      settings.Asserts,\n\t\t\t\"comparison\":   settings.Comparison,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(errorlint.NewAnalyzer(opts...)).\n\t\tWithDesc(\"Find code that can cause problems with the error wrapping scheme introduced in Go 1.13.\").\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc toAllowPairs(data []config.ErrorLintAllowPair) []errorlint.AllowPair {\n\tvar pairs []errorlint.AllowPair\n\tfor _, allowedError := range data {\n\t\tpairs = append(pairs, errorlint.AllowPair(allowedError))\n\t}\n\treturn pairs\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/errorlint_integration_test.go",
    "content": "package errorlint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint.go",
    "content": "//golangcitest:args -Eerrorlint\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n)\n\nvar errLintFoo = errors.New(\"foo\")\n\ntype errLintBar struct{}\n\nfunc (*errLintBar) Error() string {\n\treturn \"bar\"\n}\n\nfunc errorLintAll() {\n\terr := func() error { return nil }()\n\tif err == errLintFoo { // want \"comparing with == will fail on wrapped errors. Use errors.Is to check for a specific error\"\n\t\tlog.Println(\"errCompare\")\n\t}\n\n\terr = errors.New(\"oops\")\n\tfmt.Errorf(\"error: %v\", err) // want \"non-wrapping format verb for fmt.Errorf. Use `%w` to format errors\"\n\n\tswitch err.(type) { // want \"type switch on error will fail on wrapped errors. Use errors.As to check for specific errors\"\n\tcase *errLintBar:\n\t\tlog.Println(\"errLintBar\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint_asserts.go",
    "content": "//golangcitest:args -Eerrorlint\n//golangcitest:config_path testdata/errorlint_asserts.yml\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"log\"\n)\n\ntype myError struct{}\n\nfunc (*myError) Error() string {\n\treturn \"foo\"\n}\n\nfunc errorLintDoAnotherThing() error {\n\treturn &myError{}\n}\n\nfunc errorLintAsserts() {\n\terr := errorLintDoAnotherThing()\n\tvar me *myError\n\tif errors.As(err, &me) {\n\t\tlog.Println(\"myError\")\n\t}\n\t_, ok := err.(*myError) // want \"type assertion on error will fail on wrapped errors. Use errors.As to check for specific errors\"\n\tif ok {\n\t\tlog.Println(\"myError\")\n\t}\n\tswitch err.(type) { // want \"type switch on error will fail on wrapped errors. Use errors.As to check for specific errors\"\n\tcase *myError:\n\t\tlog.Println(\"myError\")\n\t}\n\tswitch errorLintDoAnotherThing().(type) { // want \"type switch on error will fail on wrapped errors. Use errors.As to check for specific errors\"\n\tcase *myError:\n\t\tlog.Println(\"myError\")\n\t}\n\tswitch t := err.(type) { // want \"type switch on error will fail on wrapped errors. Use errors.As to check for specific errors\"\n\tcase *myError:\n\t\tlog.Println(\"myError\", t)\n\t}\n\tswitch t := errorLintDoAnotherThing().(type) { // want \"type switch on error will fail on wrapped errors. Use errors.As to check for specific errors\"\n\tcase *myError:\n\t\tlog.Println(\"myError\", t)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint_asserts.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    errorlint:\n      errorf: false\n      asserts: true\n      comparison: false\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint_cgo.go",
    "content": "//golangcitest:args -Eerrorlint\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nvar errLintFoo = errors.New(\"foo\")\n\ntype errLintBar struct{}\n\nfunc (*errLintBar) Error() string {\n\treturn \"bar\"\n}\n\nfunc errorLintAll() {\n\terr := func() error { return nil }()\n\tif err == errLintFoo { // want \"comparing with == will fail on wrapped errors. Use errors.Is to check for a specific error\"\n\t\tlog.Println(\"errCompare\")\n\t}\n\n\terr = errors.New(\"oops\")\n\tfmt.Errorf(\"error: %v\", err) // want \"non-wrapping format verb for fmt.Errorf. Use `%w` to format errors\"\n\n\tswitch err.(type) { // want \"type switch on error will fail on wrapped errors. Use errors.As to check for specific errors\"\n\tcase *errLintBar:\n\t\tlog.Println(\"errLintBar\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint_comparison.go",
    "content": "//golangcitest:args -Eerrorlint\n//golangcitest:config_path testdata/errorlint_comparison.yml\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"log\"\n)\n\nvar errCompare = errors.New(\"foo\")\n\nfunc errorLintDoThing() error {\n\treturn errCompare\n}\n\nfunc errorLintComparison() {\n\terr := errorLintDoThing()\n\tif errors.Is(err, errCompare) {\n\t\tlog.Println(\"errCompare\")\n\t}\n\tif err == nil {\n\t\tlog.Println(\"nil\")\n\t}\n\tif err != nil {\n\t\tlog.Println(\"nil\")\n\t}\n\tif nil == err {\n\t\tlog.Println(\"nil\")\n\t}\n\tif nil != err {\n\t\tlog.Println(\"nil\")\n\t}\n\tif err == errCompare { // want \"comparing with == will fail on wrapped errors. Use errors.Is to check for a specific error\"\n\t\tlog.Println(\"errCompare\")\n\t}\n\tif err != errCompare { // want \"comparing with != will fail on wrapped errors. Use errors.Is to check for a specific error\"\n\t\tlog.Println(\"not errCompare\")\n\t}\n\tif errCompare == err { // want \"comparing with == will fail on wrapped errors. Use errors.Is to check for a specific error\"\n\t\tlog.Println(\"errCompare\")\n\t}\n\tif errCompare != err { // want \"comparing with != will fail on wrapped errors. Use errors.Is to check for a specific error\"\n\t\tlog.Println(\"not errCompare\")\n\t}\n\tswitch err {\n\tcase errCompare: // want \"switch on an error will fail on wrapped errors. Use errors.Is to check for specific errors\"\n\t\tlog.Println(\"errCompare\")\n\t}\n\tswitch errorLintDoThing() {\n\tcase errCompare: // want \"switch on an error will fail on wrapped errors. Use errors.Is to check for specific errors\"\n\t\tlog.Println(\"errCompare\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint_comparison.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    errorlint:\n      errorf: false\n      asserts: false\n      comparison: true\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint_errorf.go",
    "content": "//golangcitest:args -Eerrorlint\n//golangcitest:config_path testdata/errorlint_errorf.yml\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\ntype customError struct{}\n\nfunc (customError) Error() string {\n\treturn \"oops\"\n}\n\nfunc errorLintErrorf() {\n\terr := errors.New(\"oops\")\n\tfmt.Errorf(\"error: %w\", err)\n\tfmt.Errorf(\"error: %v\", err)  // want \"non-wrapping format verb for fmt.Errorf. Use `%w` to format errors\"\n\tfmt.Errorf(\"%v %v\", err, err) // want \"non-wrapping format verb for fmt.Errorf. Use `%w` to format errors\"\n\tfmt.Errorf(\"error: %s\", err.Error())\n\tcustomError := customError{}\n\tfmt.Errorf(\"error: %s\", customError.Error())\n\tstrErr := \"oops\"\n\tfmt.Errorf(\"%v\", strErr)\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/errorlint_errorf.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    errorlint:\n      errorf: true\n      asserts: false\n      comparison: false\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/fix/in/errorlint.go",
    "content": "//golangcitest:args -Eerrorlint\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nfunc Good() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %w\", err)\n}\n\nfunc NonWrappingVerb() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %v\", err)\n}\n\nfunc NonWrappingTVerb() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %T\", err)\n}\n\nfunc DoubleNonWrappingVerb() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"%v %v\", err, err)\n}\n\nfunc ErrorOneWrap() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := errors.New(\"oops2\")\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%v, %w, %v\", err1, err2, err3)\n}\n\nfunc ValidNonWrappingTVerb() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := errors.New(\"oops2\")\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%w, %T, %w\", err1, err2, err3)\n}\n\nfunc ErrorMultipleWraps() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := errors.New(\"oops2\")\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%w, %w, %w\", err1, err2, err3)\n}\n\nfunc ErrorMultipleWrapsWithCustomError() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := MyError{}\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%w, %w, %w\", err1, err2, err3)\n}\n\nfunc ErrorStringFormat() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %s\", err.Error())\n}\n\nfunc ErrorStringFormatCustomError() error {\n\terr := MyError{}\n\treturn fmt.Errorf(\"error: %s\", err.Error())\n}\n\nfunc NotAnError() error {\n\terr := \"oops\"\n\treturn fmt.Errorf(\"%v\", err)\n}\n\ntype MyError struct{}\n\nfunc (MyError) Error() string {\n\treturn \"oops\"\n}\n\nfunc ErrorIndexReset() error {\n\terr := errors.New(\"oops1\")\n\treturn fmt.Errorf(\"%[1]v %d %f %[1]v, %d, %f\", err, 1, 2.2)\n}\n\nfunc ErrorIndexResetGood() error {\n\terr := errors.New(\"oops1\")\n\treturn fmt.Errorf(\"%[1]w %d %f %[1]w, %d, %f\", err, 1, 2.2)\n}\n"
  },
  {
    "path": "pkg/golinters/errorlint/testdata/fix/out/errorlint.go",
    "content": "//golangcitest:args -Eerrorlint\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nfunc Good() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %w\", err)\n}\n\nfunc NonWrappingVerb() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %w\", err)\n}\n\nfunc NonWrappingTVerb() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %T\", err)\n}\n\nfunc DoubleNonWrappingVerb() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"%w %w\", err, err)\n}\n\nfunc ErrorOneWrap() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := errors.New(\"oops2\")\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%w, %w, %w\", err1, err2, err3)\n}\n\nfunc ValidNonWrappingTVerb() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := errors.New(\"oops2\")\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%w, %T, %w\", err1, err2, err3)\n}\n\nfunc ErrorMultipleWraps() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := errors.New(\"oops2\")\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%w, %w, %w\", err1, err2, err3)\n}\n\nfunc ErrorMultipleWrapsWithCustomError() error {\n\terr1 := errors.New(\"oops1\")\n\terr2 := MyError{}\n\terr3 := errors.New(\"oops3\")\n\treturn fmt.Errorf(\"%w, %w, %w\", err1, err2, err3)\n}\n\nfunc ErrorStringFormat() error {\n\terr := errors.New(\"oops\")\n\treturn fmt.Errorf(\"error: %s\", err.Error())\n}\n\nfunc ErrorStringFormatCustomError() error {\n\terr := MyError{}\n\treturn fmt.Errorf(\"error: %s\", err.Error())\n}\n\nfunc NotAnError() error {\n\terr := \"oops\"\n\treturn fmt.Errorf(\"%v\", err)\n}\n\ntype MyError struct{}\n\nfunc (MyError) Error() string {\n\treturn \"oops\"\n}\n\nfunc ErrorIndexReset() error {\n\terr := errors.New(\"oops1\")\n\treturn fmt.Errorf(\"%[1]w %d %f %[1]w, %d, %f\", err, 1, 2.2)\n}\n\nfunc ErrorIndexResetGood() error {\n\terr := errors.New(\"oops1\")\n\treturn fmt.Errorf(\"%[1]w %d %f %[1]w, %d, %f\", err, 1, 2.2)\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/exhaustive.go",
    "content": "package exhaustive\n\nimport (\n\t\"github.com/nishanths/exhaustive\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.ExhaustiveSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\texhaustive.CheckFlag:                      settings.Check,\n\t\t\texhaustive.DefaultSignifiesExhaustiveFlag: settings.DefaultSignifiesExhaustive,\n\t\t\texhaustive.IgnoreEnumMembersFlag:          settings.IgnoreEnumMembers,\n\t\t\texhaustive.IgnoreEnumTypesFlag:            settings.IgnoreEnumTypes,\n\t\t\texhaustive.PackageScopeOnlyFlag:           settings.PackageScopeOnly,\n\t\t\texhaustive.ExplicitExhaustiveMapFlag:      settings.ExplicitExhaustiveMap,\n\t\t\texhaustive.ExplicitExhaustiveSwitchFlag:   settings.ExplicitExhaustiveSwitch,\n\t\t\texhaustive.DefaultCaseRequiredFlag:        settings.DefaultCaseRequired,\n\t\t\t// Should be managed with `linters.exclusions.generated`.\n\t\t\texhaustive.CheckGeneratedFlag: true,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(exhaustive.Analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/exhaustive_integration_test.go",
    "content": "package exhaustive\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/testdata/exhaustive.go",
    "content": "//golangcitest:args -Eexhaustive\npackage testdata\n\ntype Direction int\n\nconst (\n\tNorth Direction = iota\n\tEast\n\tSouth\n\tWest\n)\n\nfunc processDirection(d Direction) {\n\tswitch d { // want \"missing cases in switch of type testdata.Direction: testdata.East, testdata.West\"\n\tcase North, South:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/testdata/exhaustive_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Eexhaustive\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype Direction int\n\nconst (\n\tNorth Direction = iota\n\tEast\n\tSouth\n\tWest\n)\n\nfunc processDirection(d Direction) {\n\tswitch d { // want \"missing cases in switch of type testdata.Direction: testdata.East, testdata.West\"\n\tcase North, South:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/testdata/exhaustive_default.go",
    "content": "//golangcitest:args -Eexhaustive\n//golangcitest:config_path testdata/exhaustive_default.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\ntype Direction int\n\nconst (\n\tNorth Direction = iota\n\tEast\n\tSouth\n\tWest\n)\n\n// Should not report missing cases in the switch statement below even though\n// some enum members (East, West) are not listed, because the switch statement\n// has a 'default' case and the default-signifies-exhaustive setting is true.\n\nfunc processDirectionDefault(d Direction) {\n\tswitch d {\n\tcase North, South:\n\tdefault:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/testdata/exhaustive_default.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    exhaustive:\n      default-signifies-exhaustive: true\n"
  },
  {
    "path": "pkg/golinters/exhaustive/testdata/exhaustive_generated.go",
    "content": "// Code generated by some program. DO NOT EDIT.\n\n//golangcitest:args -Eexhaustive\n//golangcitest:expected_exitcode 0\npackage testdata\n\n// Should not report missing cases in the switch statement below, because this\n// is a generated file as indicated by the above comment\n// (golang.org/s/generatedcode), and check-generated setting is false.\n\ntype Direction int\n\nconst (\n\tNorth Direction = iota\n\tEast\n\tSouth\n\tWest\n)\n\nfunc processDirectionGenerated(d Direction) {\n\tswitch d {\n\tcase North, South:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/testdata/exhaustive_ignore_enum_members.go",
    "content": "//golangcitest:args -Eexhaustive\n//golangcitest:config_path testdata/exhaustive_ignore_enum_members.yml\npackage testdata\n\ntype Direction int\n\nconst (\n\tNorth Direction = iota\n\tEast\n\tSouth\n\tWest\n)\n\n// Should only report East as missing because the enum member West is ignored\n// using the ignore-enum-members setting.\n\nfunc processDirectionIgnoreEnumMembers(d Direction) {\n\tswitch d { // want \"missing cases in switch of type testdata.Direction: testdata.East\"\n\tcase North, South:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustive/testdata/exhaustive_ignore_enum_members.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    exhaustive:\n      ignore-enum-members: \"West$\"\n"
  },
  {
    "path": "pkg/golinters/exhaustruct/exhaustruct.go",
    "content": "package exhaustruct\n\nimport (\n\texhaustruct \"dev.gaijin.team/go/exhaustruct/v4/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.ExhaustructSettings) *goanalysis.Linter {\n\tcfg := exhaustruct.Config{}\n\tif settings != nil {\n\t\tcfg.IncludeRx = settings.Include\n\t\tcfg.ExcludeRx = settings.Exclude\n\t\tcfg.AllowEmpty = settings.AllowEmpty\n\t\tcfg.AllowEmptyRx = settings.AllowEmptyRx\n\t\tcfg.AllowEmptyReturns = settings.AllowEmptyReturns\n\t\tcfg.AllowEmptyDeclarations = settings.AllowEmptyDeclarations\n\t}\n\n\tanalyzer, err := exhaustruct.NewAnalyzer(cfg)\n\tif err != nil {\n\t\tinternal.LinterLogger.Fatalf(\"exhaustruct configuration: %v\", err)\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustruct/exhaustruct_integration_test.go",
    "content": "package exhaustruct\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustruct/testdata/exhaustruct.go",
    "content": "//golangcitest:args -Eexhaustruct\npackage testdata\n\nimport \"time\"\n\ntype Exhaustruct struct {\n\tA string\n\tB int\n\tc bool // private field inside the same package are not ignored\n\tD float64\n\tE time.Time\n}\n\nfunc exhaustruct() {\n\t// pass\n\t_ = Exhaustruct{\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// failPrivate\n\t_ = Exhaustruct{ // want \"testdata.Exhaustruct is missing field c\"\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// fail\n\t_ = Exhaustruct{ // want \"testdata.Exhaustruct is missing field B\"\n\t\tA: \"a\",\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// failMultiple\n\t_ = Exhaustruct{ // want \"testdata.Exhaustruct is missing fields B, D\"\n\t\tA: \"a\",\n\t\tc: false,\n\t\tE: time.Now(),\n\t}\n\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustruct/testdata/exhaustruct_cgo.go",
    "content": "//golangcitest:args -Eexhaustruct\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype Exhaustruct struct {\n\tA string\n\tB int\n\tc bool // private field inside the same package are not ignored\n\tD float64\n\tE time.Time\n}\n\nfunc exhaustruct() {\n\t// pass\n\t_ = Exhaustruct{\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// failPrivate\n\t_ = Exhaustruct{ // want \"testdata.Exhaustruct is missing field c\"\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// fail\n\t_ = Exhaustruct{ // want \"testdata.Exhaustruct is missing field B\"\n\t\tA: \"a\",\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// failMultiple\n\t_ = Exhaustruct{ // want \"testdata.Exhaustruct is missing fields B, D\"\n\t\tA: \"a\",\n\t\tc: false,\n\t\tE: time.Now(),\n\t}\n\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustruct/testdata/exhaustruct_custom.go",
    "content": "//golangcitest:args -Eexhaustruct\n//golangcitest:config_path testdata/exhaustruct_custom.yml\npackage testdata\n\nimport \"time\"\n\ntype ExhaustructCustom struct {\n\tA string\n\tB int\n\tc bool // private field inside the same package are not ignored\n\tD float64\n\tE time.Time\n}\n\nfunc exhaustructCustom() {\n\t// pass\n\t_ = ExhaustructCustom{\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// fail\n\t_ = ExhaustructCustom{ // want \"testdata.ExhaustructCustom is missing field B\"\n\t\tA: \"a\",\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// failMultiple\n\t_ = ExhaustructCustom{ // want \"testdata.ExhaustructCustom is missing fields B, D\"\n\t\tA: \"a\",\n\t\tc: false,\n\t\tE: time.Now(),\n\t}\n\n\t//  failPrivate\n\t_ = ExhaustructCustom{ // want \"testdata.ExhaustructCustom is missing field c\"\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n}\n\ntype ExhaustructCustom1 struct {\n\tA string\n\tB int\n\tc bool // private field inside the same package are not ignored\n\tD float64\n\tE time.Time\n}\n\nfunc exhaustructCustom1() {\n\t// pass\n\t_ = ExhaustructCustom{\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// fail\n\t_ = ExhaustructCustom1{\n\t\tA: \"a\",\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// failMultiple\n\t_ = ExhaustructCustom1{\n\t\tA: \"a\",\n\t\tc: false,\n\t\tE: time.Now(),\n\t}\n\n\t// failPrivate\n\t_ = ExhaustructCustom1{\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n}\n\ntype ExhaustructCustom2 struct {\n\tA string\n\tB int\n\tc bool // private field inside the same package are not ignored\n\tD float64\n\tE time.Time\n}\n\nfunc exhaustructCustom2() {\n\t// pass\n\t_ = ExhaustructCustom2{\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// fail\n\t_ = ExhaustructCustom2{\n\t\tA: \"a\",\n\t\tc: false,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n\n\t// failMultiple\n\t_ = ExhaustructCustom2{\n\t\tA: \"a\",\n\t\tc: false,\n\t\tE: time.Now(),\n\t}\n\n\t// failPrivate\n\t_ = ExhaustructCustom2{\n\t\tA: \"a\",\n\t\tB: 0,\n\t\tD: 1.0,\n\t\tE: time.Now(),\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/exhaustruct/testdata/exhaustruct_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    exhaustruct:\n      include:\n      - .*\\.ExhaustructCustom\n      exclude:\n      - .*\\.ExhaustructCustom[\\d]{1,2}\n"
  },
  {
    "path": "pkg/golinters/exptostd/exptostd.go",
    "content": "package exptostd\n\nimport (\n\t\"github.com/ldez/exptostd\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(exptostd.NewAnalyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/exptostd/exptostd_integration_test.go",
    "content": "package exptostd\n\nimport (\n\t\"testing\"\n\n\t// Without this dependency, the analyzer tests related to fix fails.\n\t// The packages `slices` have been randomly chosen to import `golang.org/x/exp`.\n\t_ \"golang.org/x/exp/slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/exptostd/testdata/exptostd.go",
    "content": "//golangcitest:args -Eexptostd\npackage testdata\n\nimport (\n\t\"fmt\"\n\n\t\"golang.org/x/exp/maps\"   // want `Import statement 'golang.org/x/exp/maps' may be replaced by 'maps'`\n\t\"golang.org/x/exp/slices\" // want `Import statement 'golang.org/x/exp/slices' may be replaced by 'slices'`\n)\n\nfunc _(m, a map[string]string) {\n\tmaps.Clone(m) // want `golang.org/x/exp/maps.Clone\\(\\) can be replaced by maps.Clone\\(\\)`\n\n\tmaps.Keys(m) // want `golang.org/x/exp/maps\\.Keys\\(\\) can be replaced by slices\\.AppendSeq\\(make\\(\\[\\]T, 0, len\\(data\\)\\), maps\\.Keys\\(data\\)\\)`\n\n\tmaps.Values(m) // want `golang.org/x/exp/maps\\.Values\\(\\) can be replaced by slices\\.AppendSeq\\(make\\(\\[\\]T, 0, len\\(data\\)\\), maps\\.Values\\(data\\)\\)`\n\n\tmaps.Equal(m, a) // want `golang.org/x/exp/maps.Equal\\(\\) can be replaced by maps.Equal\\(\\)`\n\n\tmaps.EqualFunc(m, a, func(i, j string) bool { // want `golang.org/x/exp/maps.EqualFunc\\(\\) can be replaced by maps.EqualFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tmaps.Copy(m, a) // want `golang.org/x/exp/maps.Copy\\(\\) can be replaced by maps.Copy\\(\\)`\n\n\tmaps.DeleteFunc(m, func(_, _ string) bool { // want `golang.org/x/exp/maps.DeleteFunc\\(\\) can be replaced by maps.DeleteFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tmaps.Clear(m) // want `golang.org/x/exp/maps.Clear\\(\\) can be replaced by clear\\(\\)`\n\n\tfmt.Println(\"Hello\")\n}\n\nfunc _(a, b []string) {\n\tslices.Equal(a, b)\n\tslices.EqualFunc(a, b, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\tslices.Compare(a, b)\n\tslices.CompareFunc(a, b, func(_ string, _ string) int {\n\t\treturn 0\n\t})\n\tslices.Index(a, \"a\")\n\tslices.IndexFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\tslices.Contains(a, \"a\")\n\tslices.ContainsFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\tslices.Insert(a, 0, \"a\", \"b\")\n\tslices.Delete(a, 0, 1)\n\tslices.DeleteFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\tslices.Replace(a, 0, 1, \"a\")\n\tslices.Clone(a)\n\tslices.Compact(a)\n\tslices.CompactFunc(a, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\tslices.Grow(a, 2)\n\tslices.Clip(a)\n\tslices.Reverse(a)\n\tslices.Sort(a)\n\tslices.SortFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.SortStableFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.IsSorted(a)\n\tslices.IsSortedFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.Min(a)\n\tslices.MinFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.Max(a)\n\tslices.MaxFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.BinarySearch(a, \"a\")\n\tslices.BinarySearchFunc(a, b, func(_ string, _ []string) int {\n\t\treturn 0\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/exptostd/testdata/exptostd_cgo.go",
    "content": "//golangcitest:args -Eexptostd\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"golang.org/x/exp/maps\"   // want `Import statement 'golang.org/x/exp/maps' may be replaced by 'maps'`\n\t\"golang.org/x/exp/slices\" // want `Import statement 'golang.org/x/exp/slices' may be replaced by 'slices'`\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(m, a map[string]string) {\n\tmaps.Clone(m) // want `golang.org/x/exp/maps.Clone\\(\\) can be replaced by maps.Clone\\(\\)`\n\n\tmaps.Keys(m) // want `golang.org/x/exp/maps\\.Keys\\(\\) can be replaced by slices\\.AppendSeq\\(make\\(\\[\\]T, 0, len\\(data\\)\\), maps\\.Keys\\(data\\)\\)`\n\n\tmaps.Values(m) // want `golang.org/x/exp/maps\\.Values\\(\\) can be replaced by slices\\.AppendSeq\\(make\\(\\[\\]T, 0, len\\(data\\)\\), maps\\.Values\\(data\\)\\)`\n\n\tmaps.Equal(m, a) // want `golang.org/x/exp/maps.Equal\\(\\) can be replaced by maps.Equal\\(\\)`\n\n\tmaps.EqualFunc(m, a, func(i, j string) bool { // want `golang.org/x/exp/maps.EqualFunc\\(\\) can be replaced by maps.EqualFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tmaps.Copy(m, a) // want `golang.org/x/exp/maps.Copy\\(\\) can be replaced by maps.Copy\\(\\)`\n\n\tmaps.DeleteFunc(m, func(_, _ string) bool { // want `golang.org/x/exp/maps.DeleteFunc\\(\\) can be replaced by maps.DeleteFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tmaps.Clear(m) // want `golang.org/x/exp/maps.Clear\\(\\) can be replaced by clear\\(\\)`\n\n\tfmt.Println(\"Hello\")\n}\n\nfunc _(a, b []string) {\n\tslices.Equal(a, b)\n\tslices.EqualFunc(a, b, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\tslices.Compare(a, b)\n\tslices.CompareFunc(a, b, func(_ string, _ string) int {\n\t\treturn 0\n\t})\n\tslices.Index(a, \"a\")\n\tslices.IndexFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\tslices.Contains(a, \"a\")\n\tslices.ContainsFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\tslices.Insert(a, 0, \"a\", \"b\")\n\tslices.Delete(a, 0, 1)\n\tslices.DeleteFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\tslices.Replace(a, 0, 1, \"a\")\n\tslices.Clone(a)\n\tslices.Compact(a)\n\tslices.CompactFunc(a, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\tslices.Grow(a, 2)\n\tslices.Clip(a)\n\tslices.Reverse(a)\n\tslices.Sort(a)\n\tslices.SortFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.SortStableFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.IsSorted(a)\n\tslices.IsSortedFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.Min(a)\n\tslices.MinFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.Max(a)\n\tslices.MaxFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\tslices.BinarySearch(a, \"a\")\n\tslices.BinarySearchFunc(a, b, func(_ string, _ []string) int {\n\t\treturn 0\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/exptostd/testdata/fix/in/exptostd.go",
    "content": "//golangcitest:args -Eexptostd\npackage testdata\n\nimport (\n\t\"fmt\"\n\n\t\"golang.org/x/exp/maps\"   // want `Import statement 'golang.org/x/exp/maps' may be replaced by 'maps'`\n\t\"golang.org/x/exp/slices\" // want `Import statement 'golang.org/x/exp/slices' may be replaced by 'slices'`\n)\n\nfunc _(m, a map[string]string) {\n\tmaps.Clone(m) // want `golang.org/x/exp/maps.Clone\\(\\) can be replaced by maps.Clone\\(\\)`\n\n\tmaps.Equal(m, a) // want `golang.org/x/exp/maps.Equal\\(\\) can be replaced by maps.Equal\\(\\)`\n\n\tmaps.EqualFunc(m, a, func(i, j string) bool { // want `golang.org/x/exp/maps.EqualFunc\\(\\) can be replaced by maps.EqualFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tmaps.Copy(m, a) // want `golang.org/x/exp/maps.Copy\\(\\) can be replaced by maps.Copy\\(\\)`\n\n\tmaps.DeleteFunc(m, func(_, _ string) bool { // want `golang.org/x/exp/maps.DeleteFunc\\(\\) can be replaced by maps.DeleteFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tmaps.Clear(m) // want `golang.org/x/exp/maps.Clear\\(\\) can be replaced by clear\\(\\)`\n\n\tfmt.Println(\"Hello\")\n}\n\nfunc _(a, b []string) {\n\tslices.Equal(a, b)\n\n\tslices.EqualFunc(a, b, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Compare(a, b)\n\n\tslices.CompareFunc(a, b, func(_ string, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.Index(a, \"a\")\n\n\tslices.IndexFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Contains(a, \"a\")\n\n\tslices.ContainsFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Insert(a, 0, \"a\", \"b\")\n\n\tslices.Delete(a, 0, 1)\n\n\tslices.DeleteFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Replace(a, 0, 1, \"a\")\n\n\tslices.Clone(a)\n\n\tslices.Compact(a)\n\n\tslices.CompactFunc(a, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Grow(a, 2)\n\n\tslices.Clip(a)\n\n\tslices.Reverse(a)\n\n\tslices.Sort(a)\n\n\tslices.SortFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.SortStableFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.IsSorted(a)\n\n\tslices.IsSortedFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.Min(a)\n\n\tslices.MinFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.Max(a)\n\n\tslices.MaxFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.BinarySearch(a, \"a\")\n\n\tslices.BinarySearchFunc(a, b, func(_ string, _ []string) int {\n\t\treturn 0\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/exptostd/testdata/fix/out/exptostd.go",
    "content": "//golangcitest:args -Eexptostd\npackage testdata\n\nimport (\n\t\"fmt\"\n\n\t\"maps\"   // want `Import statement 'golang.org/x/exp/maps' may be replaced by 'maps'`\n\t\"slices\" // want `Import statement 'golang.org/x/exp/slices' may be replaced by 'slices'`\n)\n\nfunc _(m, a map[string]string) {\n\tmaps.Clone(m) // want `golang.org/x/exp/maps.Clone\\(\\) can be replaced by maps.Clone\\(\\)`\n\n\tmaps.Equal(m, a) // want `golang.org/x/exp/maps.Equal\\(\\) can be replaced by maps.Equal\\(\\)`\n\n\tmaps.EqualFunc(m, a, func(i, j string) bool { // want `golang.org/x/exp/maps.EqualFunc\\(\\) can be replaced by maps.EqualFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tmaps.Copy(m, a) // want `golang.org/x/exp/maps.Copy\\(\\) can be replaced by maps.Copy\\(\\)`\n\n\tmaps.DeleteFunc(m, func(_, _ string) bool { // want `golang.org/x/exp/maps.DeleteFunc\\(\\) can be replaced by maps.DeleteFunc\\(\\)`\n\t\treturn true\n\t})\n\n\tclear(m) // want `golang.org/x/exp/maps.Clear\\(\\) can be replaced by clear\\(\\)`\n\n\tfmt.Println(\"Hello\")\n}\n\nfunc _(a, b []string) {\n\tslices.Equal(a, b)\n\n\tslices.EqualFunc(a, b, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Compare(a, b)\n\n\tslices.CompareFunc(a, b, func(_ string, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.Index(a, \"a\")\n\n\tslices.IndexFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Contains(a, \"a\")\n\n\tslices.ContainsFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Insert(a, 0, \"a\", \"b\")\n\n\tslices.Delete(a, 0, 1)\n\n\tslices.DeleteFunc(a, func(_ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Replace(a, 0, 1, \"a\")\n\n\tslices.Clone(a)\n\n\tslices.Compact(a)\n\n\tslices.CompactFunc(a, func(_ string, _ string) bool {\n\t\treturn true\n\t})\n\n\tslices.Grow(a, 2)\n\n\tslices.Clip(a)\n\n\tslices.Reverse(a)\n\n\tslices.Sort(a)\n\n\tslices.SortFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.SortStableFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.IsSorted(a)\n\n\tslices.IsSortedFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.Min(a)\n\n\tslices.MinFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.Max(a)\n\n\tslices.MaxFunc(a, func(_, _ string) int {\n\t\treturn 0\n\t})\n\n\tslices.BinarySearch(a, \"a\")\n\n\tslices.BinarySearchFunc(a, b, func(_ string, _ []string) int {\n\t\treturn 0\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/exptostd/testdata/go.mod",
    "content": "module exptostd\n\ngo 1.25.0\n\nrequire golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6\n"
  },
  {
    "path": "pkg/golinters/exptostd/testdata/go.sum",
    "content": "golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\n"
  },
  {
    "path": "pkg/golinters/fatcontext/fatcontext.go",
    "content": "package fatcontext\n\nimport (\n\t\"go.augendre.info/fatcontext/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.FatcontextSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\tanalyzer.FlagCheckStructPointers: settings.CheckStructPointers,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/fatcontext/fatcontext_integration_test.go",
    "content": "package fatcontext\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/fatcontext/testdata/fatcontext.go",
    "content": "//golangcitest:args -Efatcontext\npackage testdata\n\nimport \"context\"\n\nfunc example() {\n\tctx := context.Background()\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx := context.WithValue(ctx, \"key\", i)\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx = context.WithValue(ctx, \"key\", i) // want \"nested context in loop\"\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor item := range []string{\"one\", \"two\", \"three\"} {\n\t\tctx = wrapContext(ctx) // want \"nested context in loop\"\n\t\tctx := context.WithValue(ctx, \"key\", item)\n\t\tctx = wrapContext(ctx)\n\t}\n\n\tfor {\n\t\tctx = wrapContext(ctx) // want \"nested context in loop\"\n\t\tbreak\n\t}\n}\n\nfunc wrapContext(ctx context.Context) context.Context {\n\treturn context.WithoutCancel(ctx)\n}\n\n// storing contexts in a struct isn't recommended, but local copies of a non-pointer struct should act like local copies of a context.\nfunc inStructs(ctx context.Context) {\n\tfor i := 0; i < 10; i++ {\n\t\tc := struct{ Ctx context.Context }{ctx}\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\tc := []struct{ Ctx context.Context }{{ctx}}\n\t\tc[0].Ctx = context.WithValue(c[0].Ctx, \"key\", i)\n\t\tc[0].Ctx = context.WithValue(c[0].Ctx, \"other\", \"val\")\n\t}\n\n\tc := struct{ Ctx context.Context }{ctx}\n\tfor i := 0; i < 10; i++ {\n\t\tc := c\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tpc := &struct{ Ctx context.Context }{ctx}\n\tfor i := 0; i < 10; i++ {\n\t\tc := pc\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i) // want \"nested context in loop\"\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tr := []struct{ Ctx context.Context }{{ctx}}\n\tfor i := 0; i < 10; i++ {\n\t\tr[0].Ctx = context.WithValue(r[0].Ctx, \"key\", i) // want \"nested context in loop\"\n\t\tr[0].Ctx = context.WithValue(r[0].Ctx, \"other\", \"val\")\n\t}\n\n\trp := []*struct{ Ctx context.Context }{{ctx}}\n\tfor i := 0; i < 10; i++ {\n\t\trp[0].Ctx = context.WithValue(rp[0].Ctx, \"key\", i) // want \"nested context in loop\"\n\t\trp[0].Ctx = context.WithValue(rp[0].Ctx, \"other\", \"val\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/fatcontext/testdata/fatcontext_cgo.go",
    "content": "//golangcitest:args -Efatcontext\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tctx := context.Background()\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx := context.WithValue(ctx, \"key\", i)\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx = context.WithValue(ctx, \"key\", i) // want \"nested context in loop\"\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor item := range []string{\"one\", \"two\", \"three\"} {\n\t\tctx = wrapContext(ctx) // want \"nested context in loop\"\n\t\tctx := context.WithValue(ctx, \"key\", item)\n\t\tctx = wrapContext(ctx)\n\t}\n\n\tfor {\n\t\tctx = wrapContext(ctx) // want \"nested context in loop\"\n\t\tbreak\n\t}\n}\n\nfunc wrapContext(ctx context.Context) context.Context {\n\treturn context.WithoutCancel(ctx)\n}\n"
  },
  {
    "path": "pkg/golinters/fatcontext/testdata/fatcontext_structpointer.go",
    "content": "//golangcitest:args -Efatcontext\n//golangcitest:config_path testdata/fatcontext_structpointer.yml\npackage testdata\n\nimport (\n\t\"context\"\n)\n\ntype Container struct {\n\tCtx context.Context\n}\n\nfunc something() func(*Container) {\n\treturn func(r *Container) {\n\t\tctx := r.Ctx\n\t\tctx = context.WithValue(ctx, \"key\", \"val\")\n\t\tr.Ctx = ctx // want \"potential nested context in struct pointer\"\n\t}\n}\n\nfunc blah(r *Container) {\n\tctx := r.Ctx\n\tctx = context.WithValue(ctx, \"key\", \"val\")\n\tr.Ctx = ctx // want \"potential nested context in struct pointer\"\n}\n"
  },
  {
    "path": "pkg/golinters/fatcontext/testdata/fatcontext_structpointer.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    fatcontext:\n      check-struct-pointers: true\n"
  },
  {
    "path": "pkg/golinters/fatcontext/testdata/fix/in/fatcontext.go",
    "content": "//golangcitest:args -Efatcontext\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"context\"\n\nfunc example() {\n\tctx := context.Background()\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx := context.WithValue(ctx, \"key\", i)\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx = context.WithValue(ctx, \"key\", i)\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor item := range []string{\"one\", \"two\", \"three\"} {\n\t\tctx = wrapContext(ctx)\n\t\tctx := context.WithValue(ctx, \"key\", item)\n\t\tctx = wrapContext(ctx)\n\t}\n\n\tfor {\n\t\tctx = wrapContext(ctx)\n\t\tbreak\n\t}\n}\n\nfunc wrapContext(ctx context.Context) context.Context {\n\treturn context.WithoutCancel(ctx)\n}\n\n// storing contexts in a struct isn't recommended, but local copies of a non-pointer struct should act like local copies of a context.\nfunc inStructs(ctx context.Context) {\n\tfor i := 0; i < 10; i++ {\n\t\tc := struct{ Ctx context.Context }{ctx}\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\tc := []struct{ Ctx context.Context }{{ctx}}\n\t\tc[0].Ctx = context.WithValue(c[0].Ctx, \"key\", i)\n\t\tc[0].Ctx = context.WithValue(c[0].Ctx, \"other\", \"val\")\n\t}\n\n\tc := struct{ Ctx context.Context }{ctx}\n\tfor i := 0; i < 10; i++ {\n\t\tc := c\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tpc := &struct{ Ctx context.Context }{ctx}\n\tfor i := 0; i < 10; i++ {\n\t\tc := pc\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tr := []struct{ Ctx context.Context }{{ctx}}\n\tfor i := 0; i < 10; i++ {\n\t\tr[0].Ctx = context.WithValue(r[0].Ctx, \"key\", i)\n\t\tr[0].Ctx = context.WithValue(r[0].Ctx, \"other\", \"val\")\n\t}\n\n\trp := []*struct{ Ctx context.Context }{{ctx}}\n\tfor i := 0; i < 10; i++ {\n\t\trp[0].Ctx = context.WithValue(rp[0].Ctx, \"key\", i)\n\t\trp[0].Ctx = context.WithValue(rp[0].Ctx, \"other\", \"val\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/fatcontext/testdata/fix/out/fatcontext.go",
    "content": "//golangcitest:args -Efatcontext\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"context\"\n\nfunc example() {\n\tctx := context.Background()\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx := context.WithValue(ctx, \"key\", i)\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\tctx := context.WithValue(ctx, \"key\", i)\n\t\tctx = context.WithValue(ctx, \"other\", \"val\")\n\t}\n\n\tfor item := range []string{\"one\", \"two\", \"three\"} {\n\t\tctx := wrapContext(ctx)\n\t\tctx := context.WithValue(ctx, \"key\", item)\n\t\tctx = wrapContext(ctx)\n\t}\n\n\tfor {\n\t\tctx := wrapContext(ctx)\n\t\tbreak\n\t}\n}\n\nfunc wrapContext(ctx context.Context) context.Context {\n\treturn context.WithoutCancel(ctx)\n}\n\n// storing contexts in a struct isn't recommended, but local copies of a non-pointer struct should act like local copies of a context.\nfunc inStructs(ctx context.Context) {\n\tfor i := 0; i < 10; i++ {\n\t\tc := struct{ Ctx context.Context }{ctx}\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\tc := []struct{ Ctx context.Context }{{ctx}}\n\t\tc[0].Ctx = context.WithValue(c[0].Ctx, \"key\", i)\n\t\tc[0].Ctx = context.WithValue(c[0].Ctx, \"other\", \"val\")\n\t}\n\n\tc := struct{ Ctx context.Context }{ctx}\n\tfor i := 0; i < 10; i++ {\n\t\tc := c\n\t\tc.Ctx = context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tpc := &struct{ Ctx context.Context }{ctx}\n\tfor i := 0; i < 10; i++ {\n\t\tc := pc\n\t\tc.Ctx := context.WithValue(c.Ctx, \"key\", i)\n\t\tc.Ctx = context.WithValue(c.Ctx, \"other\", \"val\")\n\t}\n\n\tr := []struct{ Ctx context.Context }{{ctx}}\n\tfor i := 0; i < 10; i++ {\n\t\tr[0].Ctx := context.WithValue(r[0].Ctx, \"key\", i)\n\t\tr[0].Ctx = context.WithValue(r[0].Ctx, \"other\", \"val\")\n\t}\n\n\trp := []*struct{ Ctx context.Context }{{ctx}}\n\tfor i := 0; i < 10; i++ {\n\t\trp[0].Ctx := context.WithValue(rp[0].Ctx, \"key\", i)\n\t\trp[0].Ctx = context.WithValue(rp[0].Ctx, \"other\", \"val\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/forbidigo/forbidigo.go",
    "content": "package forbidigo\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ashanbrown/forbidigo/v2/forbidigo\"\n\t\"go.yaml.in/yaml/v3\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nconst linterName = \"forbidigo\"\n\nfunc New(settings *config.ForbidigoSettings) *goanalysis.Linter {\n\t// Without AnalyzeTypes, LoadModeSyntax is enough.\n\t// But we cannot make this depend on the settings and have to mirror the mode chosen in GetAllSupportedLinterConfigs,\n\t// therefore, we have to use LoadModeTypesInfo in all cases.\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Forbids identifiers\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\terr := runForbidigo(pass, settings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runForbidigo(pass *analysis.Pass, settings *config.ForbidigoSettings) error {\n\toptions := []forbidigo.Option{\n\t\tforbidigo.OptionExcludeGodocExamples(settings.ExcludeGodocExamples),\n\t\t// disable \"//permit\" directives so only \"//nolint\" directives matters within golangci-lint\n\t\tforbidigo.OptionIgnorePermitDirectives(true),\n\t\tforbidigo.OptionAnalyzeTypes(settings.AnalyzeTypes),\n\t}\n\n\t// Convert patterns back to strings because that is what NewLinter accepts.\n\tvar patterns []string\n\tfor _, pattern := range settings.Forbid {\n\t\tbuffer, err := yaml.Marshal(pattern)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tpatterns = append(patterns, string(buffer))\n\t}\n\n\tforbid, err := forbidigo.NewLinter(patterns, options...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create linter %q: %w\", linterName, err)\n\t}\n\n\tfor _, file := range pass.Files {\n\t\trunConfig := forbidigo.RunConfig{\n\t\t\tFset:     pass.Fset,\n\t\t\tDebugLog: logutils.Debug(logutils.DebugKeyForbidigo),\n\t\t}\n\n\t\tif settings.AnalyzeTypes {\n\t\t\trunConfig.TypesInfo = pass.TypesInfo\n\t\t}\n\n\t\thints, err := forbid.RunWithConfig(runConfig, file)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"forbidigo linter failed on file %q: %w\", file.Name.String(), err)\n\t\t}\n\n\t\tfor _, hint := range hints {\n\t\t\tpass.Report(analysis.Diagnostic{\n\t\t\t\tPos:     hint.Pos(),\n\t\t\t\tMessage: hint.Details(),\n\t\t\t})\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/forbidigo/forbidigo_integration_test.go",
    "content": "package forbidigo\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    forbidigo:\n      forbid:\n        - pattern: fmt\\.Print.*\n        - pattern: time.Sleep(# no sleeping!)?\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo_cgo.go",
    "content": "//golangcitest:args -Eforbidigo\n//golangcitest:config_path testdata/forbidigo.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\tfmt2 \"fmt\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc Forbidigo() {\n\tfmt.Printf(\"too noisy!!!\")  // want \"use of `fmt\\\\.Printf` forbidden by pattern `fmt\\\\\\\\.Print\\\\.\\\\*`\"\n\tfmt2.Printf(\"too noisy!!!\") // Not detected because analyze-types is false by default for backward compatibility.\n\ttime.Sleep(time.Nanosecond) // want \"no sleeping!\"\n}\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo_example.go",
    "content": "//golangcitest:args -Eforbidigo\n//golangcitest:config_path testdata/forbidigo.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n\tfmt2 \"fmt\"\n\t\"time\"\n)\n\nfunc Forbidigo() {\n\tfmt.Printf(\"too noisy!!!\")  // want \"use of `fmt\\\\.Printf` forbidden by pattern `fmt\\\\\\\\.Print\\\\.\\\\*`\"\n\tfmt2.Printf(\"too noisy!!!\") // Not detected because analyze-types is false by default for backward compatibility.\n\ttime.Sleep(time.Nanosecond) // want \"no sleeping!\"\n}\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo_example_test.go",
    "content": "//golangcitest:args -Eforbidigo\n//golangcitest:config_path testdata/forbidigo.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc ExampleForbidigo() {\n\tfmt.Printf(\"too noisy!!!\") // godoc examples are ignored (in *_test.go files only)\n}\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo_include_godoc_examples.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    forbidigo:\n     exclude-godoc-examples: false\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo_include_godoc_examples_test.go",
    "content": "//golangcitest:args -Eforbidigo\n//golangcitest:config_path testdata/forbidigo_include_godoc_examples.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc ExampleForbidigoNoGodoc() {\n\tfmt.Printf(\"too noisy!!!\") // want \"use of `fmt.Printf` forbidden by pattern.*\"\n}\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo_struct.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    forbidigo:\n      analyze-types: true\n      forbid:\n        - pattern: fmt\\.Print.*\n          pkg: ^fmt$\n        - pattern: time.Sleep\n          msg: no sleeping!\n"
  },
  {
    "path": "pkg/golinters/forbidigo/testdata/forbidigo_struct_config.go",
    "content": "//golangcitest:args -Eforbidigo\n//golangcitest:config_path testdata/forbidigo_struct.yml\npackage testdata\n\nimport (\n\tfmt2 \"fmt\"\n\t\"time\"\n)\n\nfunc Forbidigo() {\n\tfmt2.Printf(\"too noisy!!!\") // want \"use of `fmt2\\\\.Printf` forbidden by pattern `fmt\\\\\\\\.Print\\\\.\\\\*`\"\n\ttime.Sleep(time.Nanosecond) // want \"no sleeping!\"\n}\n"
  },
  {
    "path": "pkg/golinters/forcetypeassert/forcetypeassert.go",
    "content": "package forcetypeassert\n\nimport (\n\t\"github.com/gostaticanalysis/forcetypeassert\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(forcetypeassert.Analyzer).\n\t\tWithDesc(\"Find forced type assertions\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/forcetypeassert/forcetypeassert_integration_test.go",
    "content": "package forcetypeassert\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/forcetypeassert/testdata/forcetypeassert.go",
    "content": "//golangcitest:args -Eforcetypeassert\npackage testdata\n\nimport \"fmt\"\n\nfunc forcetypeassertInvalid() {\n\tvar a interface{}\n\t_ = a.(int) // want \"type assertion must be checked\"\n\n\tvar b interface{}\n\tbi := b.(int) // want \"type assertion must be checked\"\n\tfmt.Println(bi)\n}\n\nfunc forcetypeassertValid() {\n\tvar a interface{}\n\tif ai, ok := a.(int); ok {\n\t\tfmt.Println(ai)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/forcetypeassert/testdata/forcetypeassert_cgo.go",
    "content": "//golangcitest:args -Eforcetypeassert\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tvar a interface{}\n\t_ = a.(int) // want \"type assertion must be checked\"\n\n\tvar b interface{}\n\tbi := b.(int) // want \"type assertion must be checked\"\n\tfmt.Println(bi)\n}\n\nfunc _() {\n\tvar a interface{}\n\tif ai, ok := a.(int); ok {\n\t\tfmt.Println(ai)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/funcorder/funcorder.go",
    "content": "package funcorder\n\nimport (\n\t\"github.com/manuelarte/funcorder/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.FuncOrderSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\tanalyzer.ConstructorCheckName:  settings.Constructor,\n\t\t\tanalyzer.StructMethodCheckName: settings.StructMethod,\n\t\t\tanalyzer.AlphabeticalCheckName: settings.Alphabetical,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/funcorder/funcorder_integration_test.go",
    "content": "package funcorder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/funcorder/testdata/funcorder.go",
    "content": "//golangcitest:args -Efuncorder\npackage testdata\n\nimport \"time\"\n\ntype MyStruct struct {\n\tName string\n}\n\nfunc (m MyStruct) lenName() int { // want `unexported method \"lenName\" for struct \"MyStruct\" should be placed after the exported method \"SetName\"`\n\treturn len(m.Name)\n}\n\nfunc (m MyStruct) GetName() string {\n\treturn m.Name\n}\n\nfunc (m *MyStruct) SetName(name string) {\n\tm.Name = name\n}\n\ntype MyStruct2 struct {\n\tName string\n}\n\nfunc (m MyStruct2) GetName() string {\n\treturn m.Name\n}\n\nfunc (m *MyStruct2) SetName(name string) {\n\tm.Name = name\n}\n\nfunc NewMyStruct2() *MyStruct2 { // want `constructor \"NewMyStruct2\" for struct \"MyStruct2\" should be placed before struct method \"GetName\"`\n\treturn &MyStruct2{Name: \"John\"}\n}\n\nfunc NewTime() time.Time {\n\treturn time.Now()\n}\n"
  },
  {
    "path": "pkg/golinters/funcorder/testdata/funcorder_disable_constructor.go",
    "content": "//golangcitest:args -Efuncorder\n//golangcitest:config_path testdata/funcorder_disable_constructor.yml\npackage testdata\n\nimport \"time\"\n\ntype MyStruct struct {\n\tName string\n}\n\nfunc (m MyStruct) lenName() int { // want `unexported method \"lenName\" for struct \"MyStruct\" should be placed after the exported method \"SetName\"`\n\treturn len(m.Name)\n}\n\nfunc (m MyStruct) GetName() string {\n\treturn m.Name\n}\n\nfunc (m *MyStruct) SetName(name string) {\n\tm.Name = name\n}\n\ntype MyStruct2 struct {\n\tName string\n}\n\nfunc (m MyStruct2) GetName() string {\n\treturn m.Name\n}\n\nfunc (m *MyStruct2) SetName(name string) {\n\tm.Name = name\n}\n\nfunc NewMyStruct2() *MyStruct2 {\n\treturn &MyStruct2{Name: \"John\"}\n}\n\nfunc NewTime() time.Time {\n\treturn time.Now()\n}\n"
  },
  {
    "path": "pkg/golinters/funcorder/testdata/funcorder_disable_constructor.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    funcorder:\n      constructor: false\n"
  },
  {
    "path": "pkg/golinters/funcorder/testdata/funcorder_struct_method.go",
    "content": "//golangcitest:args -Efuncorder\n//golangcitest:config_path testdata/funcorder_struct_method.yml\npackage testdata\n\nimport \"time\"\n\ntype MyStruct struct {\n\tName string\n}\n\nfunc (m MyStruct) lenName() int {\n\treturn len(m.Name)\n}\n\nfunc (m MyStruct) GetName() string {\n\treturn m.Name\n}\n\nfunc (m *MyStruct) SetName(name string) {\n\tm.Name = name\n}\n\ntype MyStruct2 struct {\n\tName string\n}\n\nfunc (m MyStruct2) GetName() string {\n\treturn m.Name\n}\n\nfunc (m *MyStruct2) SetName(name string) {\n\tm.Name = name\n}\n\nfunc NewMyStruct2() *MyStruct2 { // want `constructor \"NewMyStruct2\" for struct \"MyStruct2\" should be placed before struct method \"GetName\"`\n\treturn &MyStruct2{Name: \"John\"}\n}\n\nfunc NewTime() time.Time {\n\treturn time.Now()\n}\n"
  },
  {
    "path": "pkg/golinters/funcorder/testdata/funcorder_struct_method.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    funcorder:\n      struct-method: false\n"
  },
  {
    "path": "pkg/golinters/funlen/funlen.go",
    "content": "package funlen\n\nimport (\n\t\"github.com/ultraware/funlen\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\ntype Config struct {\n\tlineLimit      int\n\tstmtLimit      int\n\tignoreComments bool\n}\n\nfunc New(settings *config.FunlenSettings) *goanalysis.Linter {\n\tcfg := Config{}\n\tif settings != nil {\n\t\tcfg.lineLimit = settings.Lines\n\t\tcfg.stmtLimit = settings.Statements\n\t\tcfg.ignoreComments = settings.IgnoreComments\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(funlen.NewAnalyzer(cfg.lineLimit, cfg.stmtLimit, cfg.ignoreComments)).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/funlen/funlen_integration_test.go",
    "content": "package funlen\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/funlen/testdata/funlen.go",
    "content": "//golangcitest:args -Efunlen\npackage testdata\n\nfunc TooManyLines() { // want `Function 'TooManyLines' is too long \\(70 > 60\\)`\n\tt := struct {\n\t\tA0  string\n\t\tA1  string\n\t\tA2  string\n\t\tA3  string\n\t\tA4  string\n\t\tA5  string\n\t\tA6  string\n\t\tA7  string\n\t\tA8  string\n\t\tA9  string\n\t\tA10 string\n\t\tA11 string\n\t\tA12 string\n\t\tA13 string\n\t\tA14 string\n\t\tA15 string\n\t\tA16 string\n\t\tA17 string\n\t\tA18 string\n\t\tA19 string\n\t\tA20 string\n\t\tA21 string\n\t\tA22 string\n\t\tA23 string\n\t\tA24 string\n\t\tA25 string\n\t\tA26 string\n\t\tA27 string\n\t\tA28 string\n\t\tA29 string\n\t\tA30 string\n\t\tA31 string\n\t\tA32 string\n\t}{\n\t\tA0:  \"a\",\n\t\tA1:  \"a\",\n\t\tA2:  \"a\",\n\t\tA3:  \"a\",\n\t\tA4:  \"a\",\n\t\tA5:  \"a\",\n\t\tA6:  \"a\",\n\t\tA7:  \"a\",\n\t\tA8:  \"a\",\n\t\tA9:  \"a\",\n\t\tA10: \"a\",\n\t\tA11: \"a\",\n\t\tA12: \"a\",\n\t\tA13: \"a\",\n\t\tA14: \"a\",\n\t\tA15: \"a\",\n\t\tA16: \"a\",\n\t\tA17: \"a\",\n\t\tA18: \"a\",\n\t\tA19: \"a\",\n\t\tA20: \"a\",\n\t\tA21: \"a\",\n\t\tA22: \"a\",\n\t\tA23: \"a\",\n\t\tA24: \"a\",\n\t\tA25: \"a\",\n\t\tA26: \"a\",\n\t\tA27: \"a\",\n\t\tA28: \"a\",\n\t\tA29: \"a\",\n\t\tA30: \"a\",\n\t\tA31: \"a\",\n\t\tA32: \"a\",\n\t}\n\t_ = t\n}\n\nfunc TooManyStatements() { // want `Function 'TooManyStatements' has too many statements \\(46 > 40\\)`\n\ta0 := 1\n\ta1 := 1\n\ta2 := 1\n\ta3 := 1\n\ta4 := 1\n\ta5 := 1\n\ta6 := 1\n\ta7 := 1\n\ta8 := 1\n\ta9 := 1\n\ta10 := 1\n\ta11 := 1\n\ta12 := 1\n\ta13 := 1\n\ta14 := 1\n\ta15 := 1\n\ta16 := 1\n\ta17 := 1\n\ta18 := 1\n\ta19 := 1\n\ta20 := 1\n\ta21 := 1\n\ta22 := 1\n\t_ = a0\n\t_ = a1\n\t_ = a2\n\t_ = a3\n\t_ = a4\n\t_ = a5\n\t_ = a6\n\t_ = a7\n\t_ = a8\n\t_ = a9\n\t_ = a10\n\t_ = a11\n\t_ = a12\n\t_ = a13\n\t_ = a14\n\t_ = a15\n\t_ = a16\n\t_ = a17\n\t_ = a18\n\t_ = a19\n\t_ = a20\n\t_ = a21\n\t_ = a22\n}\n\nfunc withComments() {\n\t// Comment 1\n\t// Comment 2\n\t// Comment 3\n\t// Comment 4\n\t// Comment 5\n\t// Comment 6\n\t// Comment 7\n\t// Comment 8\n\t// Comment 9\n\t// Comment 10\n\t// Comment 11\n\t// Comment 12\n\t// Comment 13\n\t// Comment 14\n\t// Comment 15\n\t// Comment 16\n\t// Comment 17\n\t// Comment 18\n\t// Comment 19\n\t// Comment 20\n\t// Comment 21\n\t// Comment 22\n\t// Comment 23\n\t// Comment 24\n\t// Comment 25\n\t// Comment 26\n\t// Comment 27\n\t// Comment 28\n\t// Comment 29\n\t// Comment 30\n\t// Comment 31\n\t// Comment 32\n\t// Comment 33\n\t// Comment 34\n\t// Comment 35\n\t// Comment 36\n\t// Comment 37\n\t// Comment 38\n\t// Comment 39\n\t// Comment 40\n\t// Comment 41\n\t// Comment 42\n\t// Comment 43\n\t// Comment 44\n\t// Comment 45\n\t// Comment 46\n\t// Comment 47\n\t// Comment 48\n\t// Comment 49\n\t// Comment 50\n\t// Comment 51\n\t// Comment 52\n\t// Comment 53\n\t// Comment 54\n\t// Comment 55\n\t// Comment 56\n\t// Comment 57\n\t// Comment 58\n\t// Comment 59\n\t// Comment 60\n\tprint(\"Hello, world!\")\n}\n"
  },
  {
    "path": "pkg/golinters/funlen/testdata/funlen_cgo.go",
    "content": "//golangcitest:args -Efunlen\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc TooManyLines() { // want `Function 'TooManyLines' is too long \\(70 > 60\\)`\n\tt := struct {\n\t\tA0  string\n\t\tA1  string\n\t\tA2  string\n\t\tA3  string\n\t\tA4  string\n\t\tA5  string\n\t\tA6  string\n\t\tA7  string\n\t\tA8  string\n\t\tA9  string\n\t\tA10 string\n\t\tA11 string\n\t\tA12 string\n\t\tA13 string\n\t\tA14 string\n\t\tA15 string\n\t\tA16 string\n\t\tA17 string\n\t\tA18 string\n\t\tA19 string\n\t\tA20 string\n\t\tA21 string\n\t\tA22 string\n\t\tA23 string\n\t\tA24 string\n\t\tA25 string\n\t\tA26 string\n\t\tA27 string\n\t\tA28 string\n\t\tA29 string\n\t\tA30 string\n\t\tA31 string\n\t\tA32 string\n\t}{\n\t\tA0:  \"a\",\n\t\tA1:  \"a\",\n\t\tA2:  \"a\",\n\t\tA3:  \"a\",\n\t\tA4:  \"a\",\n\t\tA5:  \"a\",\n\t\tA6:  \"a\",\n\t\tA7:  \"a\",\n\t\tA8:  \"a\",\n\t\tA9:  \"a\",\n\t\tA10: \"a\",\n\t\tA11: \"a\",\n\t\tA12: \"a\",\n\t\tA13: \"a\",\n\t\tA14: \"a\",\n\t\tA15: \"a\",\n\t\tA16: \"a\",\n\t\tA17: \"a\",\n\t\tA18: \"a\",\n\t\tA19: \"a\",\n\t\tA20: \"a\",\n\t\tA21: \"a\",\n\t\tA22: \"a\",\n\t\tA23: \"a\",\n\t\tA24: \"a\",\n\t\tA25: \"a\",\n\t\tA26: \"a\",\n\t\tA27: \"a\",\n\t\tA28: \"a\",\n\t\tA29: \"a\",\n\t\tA30: \"a\",\n\t\tA31: \"a\",\n\t\tA32: \"a\",\n\t}\n\t_ = t\n}\n\nfunc TooManyStatements() { // want `Function 'TooManyStatements' has too many statements \\(46 > 40\\)`\n\ta0 := 1\n\ta1 := 1\n\ta2 := 1\n\ta3 := 1\n\ta4 := 1\n\ta5 := 1\n\ta6 := 1\n\ta7 := 1\n\ta8 := 1\n\ta9 := 1\n\ta10 := 1\n\ta11 := 1\n\ta12 := 1\n\ta13 := 1\n\ta14 := 1\n\ta15 := 1\n\ta16 := 1\n\ta17 := 1\n\ta18 := 1\n\ta19 := 1\n\ta20 := 1\n\ta21 := 1\n\ta22 := 1\n\t_ = a0\n\t_ = a1\n\t_ = a2\n\t_ = a3\n\t_ = a4\n\t_ = a5\n\t_ = a6\n\t_ = a7\n\t_ = a8\n\t_ = a9\n\t_ = a10\n\t_ = a11\n\t_ = a12\n\t_ = a13\n\t_ = a14\n\t_ = a15\n\t_ = a16\n\t_ = a17\n\t_ = a18\n\t_ = a19\n\t_ = a20\n\t_ = a21\n\t_ = a22\n}\n\nfunc withComments() {\n\t// Comment 1\n\t// Comment 2\n\t// Comment 3\n\t// Comment 4\n\t// Comment 5\n\t// Comment 6\n\t// Comment 7\n\t// Comment 8\n\t// Comment 9\n\t// Comment 10\n\t// Comment 11\n\t// Comment 12\n\t// Comment 13\n\t// Comment 14\n\t// Comment 15\n\t// Comment 16\n\t// Comment 17\n\t// Comment 18\n\t// Comment 19\n\t// Comment 20\n\t// Comment 21\n\t// Comment 22\n\t// Comment 23\n\t// Comment 24\n\t// Comment 25\n\t// Comment 26\n\t// Comment 27\n\t// Comment 28\n\t// Comment 29\n\t// Comment 30\n\t// Comment 31\n\t// Comment 32\n\t// Comment 33\n\t// Comment 34\n\t// Comment 35\n\t// Comment 36\n\t// Comment 37\n\t// Comment 38\n\t// Comment 39\n\t// Comment 40\n\t// Comment 41\n\t// Comment 42\n\t// Comment 43\n\t// Comment 44\n\t// Comment 45\n\t// Comment 46\n\t// Comment 47\n\t// Comment 48\n\t// Comment 49\n\t// Comment 50\n\t// Comment 51\n\t// Comment 52\n\t// Comment 53\n\t// Comment 54\n\t// Comment 55\n\t// Comment 56\n\t// Comment 57\n\t// Comment 58\n\t// Comment 59\n\t// Comment 60\n\tprint(\"Hello, world!\")\n}\n"
  },
  {
    "path": "pkg/golinters/funlen/testdata/funlen_custom.go",
    "content": "//golangcitest:args -Efunlen\n//golangcitest:config_path testdata/funlen_custom.yml\npackage testdata\n\nfunc TooManyLines() { // want `Function 'TooManyLines' is too long \\(22 > 20\\)`\n\tt := struct {\n\t\tA string\n\t\tB string\n\t\tC string\n\t\tD string\n\t\tE string\n\t\tF string\n\t\tG string\n\t\tH string\n\t\tI string\n\t}{\n\t\t`a`,\n\t\t`b`,\n\t\t`c`,\n\t\t`d`,\n\t\t`e`,\n\t\t`f`,\n\t\t`g`,\n\t\t`h`,\n\t\t`i`,\n\t}\n\t_ = t\n}\n\nfunc TooManyStatements() { // want `Function 'TooManyStatements' has too many statements \\(11 > 10\\)`\n\ta := 1\n\tb := a\n\tc := b\n\td := c\n\te := d\n\tf := e\n\tg := f\n\th := g\n\ti := h\n\tj := i\n\t_ = j\n}\n"
  },
  {
    "path": "pkg/golinters/funlen/testdata/funlen_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    funlen:\n      lines: 20\n      statements: 10\n"
  },
  {
    "path": "pkg/golinters/funlen/testdata/funlen_ignore_comments.go",
    "content": "//golangcitest:args -Efunlen\n//golangcitest:config_path testdata/funlen_ignore_comments.yml\npackage testdata\n\n// want +1 \"Function 'withComments' is too long\"\nfunc withComments() {\n\t// Comment 1\n\t// Comment 2\n\t// Comment 3\n\t// Comment 4\n\t// Comment 5\n\t// Comment 6\n\t// Comment 7\n\t// Comment 8\n\t// Comment 9\n\t// Comment 10\n\t// Comment 11\n\t// Comment 12\n\t// Comment 13\n\t// Comment 14\n\t// Comment 15\n\t// Comment 16\n\t// Comment 17\n\t// Comment 18\n\t// Comment 19\n\t// Comment 20\n\t// Comment 21\n\t// Comment 22\n\t// Comment 23\n\t// Comment 24\n\t// Comment 25\n\t// Comment 26\n\t// Comment 27\n\t// Comment 28\n\t// Comment 29\n\t// Comment 30\n\t// Comment 31\n\t// Comment 32\n\t// Comment 33\n\t// Comment 34\n\t// Comment 35\n\t// Comment 36\n\t// Comment 37\n\t// Comment 38\n\t// Comment 39\n\t// Comment 40\n\t// Comment 41\n\t// Comment 42\n\t// Comment 43\n\t// Comment 44\n\t// Comment 45\n\t// Comment 46\n\t// Comment 47\n\t// Comment 48\n\t// Comment 49\n\t// Comment 50\n\t// Comment 51\n\t// Comment 52\n\t// Comment 53\n\t// Comment 54\n\t// Comment 55\n\t// Comment 56\n\t// Comment 57\n\t// Comment 58\n\t// Comment 59\n\t// Comment 60\n\tprint(\"Hello, world!\")\n}\n"
  },
  {
    "path": "pkg/golinters/funlen/testdata/funlen_ignore_comments.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    funlen:\n      ignore-comments: false\n"
  },
  {
    "path": "pkg/golinters/gci/gci.go",
    "content": "package gci\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\tgcibase \"github.com/golangci/golangci-lint/v2/pkg/goformatters/gci\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nconst linterName = \"gci\"\n\nfunc New(settings *config.GciSettings) *goanalysis.Linter {\n\tformatter, err := gcibase.New(settings)\n\tif err != nil {\n\t\tinternal.LinterLogger.Fatalf(\"%s: create analyzer: %v\", linterName, err)\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(\n\t\t\tgoformatters.NewAnalyzer(\n\t\t\t\tinternal.LinterLogger.Child(linterName),\n\t\t\t\t\"Check if code and import statements are formatted, with additional rules.\",\n\t\t\t\tformatter,\n\t\t\t),\n\t\t).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/gci/gci_integration_test.go",
    "content": "package gci\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gci/testdata/fix/in/gci.go",
    "content": "//golangcitest:config_path testdata/gci.yml\n//golangcitest:expected_exitcode 0\npackage gci\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"fmt\"\n\n\tgcicfg \"github.com/daixiang0/gci/pkg/config\"\n)\n\nfunc GoimportsLocalTest() {\n\tfmt.Print(\"x\")\n\t_ = config.Config{}\n\t_ = analysis.Analyzer{}\n\t_ = gcicfg.BoolConfig{}\n}\n"
  },
  {
    "path": "pkg/golinters/gci/testdata/fix/out/gci.go",
    "content": "//golangcitest:config_path testdata/gci.yml\n//golangcitest:expected_exitcode 0\npackage gci\n\nimport (\n\t\"fmt\"\n\n\tgcicfg \"github.com/daixiang0/gci/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\n\t\"golang.org/x/tools/go/analysis\"\n)\n\nfunc GoimportsLocalTest() {\n\tfmt.Print(\"x\")\n\t_ = config.Config{}\n\t_ = analysis.Analyzer{}\n\t_ = gcicfg.BoolConfig{}\n}\n"
  },
  {
    "path": "pkg/golinters/gci/testdata/gci.go",
    "content": "//golangcitest:config_path testdata/gci.yml\npackage testdata\n\nimport (\n\t\"golang.org/x/tools/go/analysis\" // want \"File is not properly formatted\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"fmt\"\n\t\"errors\"\n\tgcicfg \"github.com/daixiang0/gci/pkg/config\"\n)\n\nfunc GoimportsLocalTest() {\n\tfmt.Print(errors.New(\"x\"))\n\t_ = config.Config{}\n\t_ = analysis.Analyzer{}\n\t_ = gcicfg.BoolConfig{}\n}\n"
  },
  {
    "path": "pkg/golinters/gci/testdata/gci.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gci\n  settings:\n    gci:\n      sections:\n        - standard\n        - prefix(github.com/golangci/golangci-lint,github.com/daixiang0/gci)\n        - default\n      custom-order: true\n"
  },
  {
    "path": "pkg/golinters/gci/testdata/gci_cgo.go",
    "content": "//golangcitest:config_path testdata/gci.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"golang.org/x/tools/go/analysis\" // want \"File is not properly formatted\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"fmt\"\n\t\"errors\"\n\tgcicfg \"github.com/daixiang0/gci/pkg/config\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc GoimportsLocalTest() {\n\tfmt.Print(errors.New(\"x\"))\n\t_ = config.Config{}\n\t_ = analysis.Analyzer{}\n\t_ = gcicfg.BoolConfig{}\n}\n"
  },
  {
    "path": "pkg/golinters/gci/testdata/gci_go124.go",
    "content": "//go:build go1.24\n\n//golangcitest:config_path testdata/gci_go124.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"crypto/sha3\"\n\t\"errors\"\n\t\"fmt\"\n)\n\nfunc _() {\n\tfmt.Print(errors.New(\"x\"))\n\tsha3.New224()\n}\n"
  },
  {
    "path": "pkg/golinters/gci/testdata/gci_go124.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gci\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/ginkgolinter.go",
    "content": "package ginkgolinter\n\nimport (\n\t\"github.com/nunnatsa/ginkgolinter\"\n\tglconfig \"github.com/nunnatsa/ginkgolinter/config\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.GinkgoLinterSettings) *goanalysis.Linter {\n\tcfg := &glconfig.Config{}\n\n\tif settings != nil {\n\t\tcfg = &glconfig.Config{\n\t\t\tSuppressLen:               settings.SuppressLenAssertion,\n\t\t\tSuppressNil:               settings.SuppressNilAssertion,\n\t\t\tSuppressErr:               settings.SuppressErrAssertion,\n\t\t\tSuppressCompare:           settings.SuppressCompareAssertion,\n\t\t\tSuppressAsync:             settings.SuppressAsyncAssertion,\n\t\t\tForbidFocus:               settings.ForbidFocusContainer,\n\t\t\tSuppressTypeCompare:       settings.SuppressTypeCompareWarning,\n\t\t\tAllowHaveLen0:             settings.AllowHaveLenZero,\n\t\t\tForceExpectTo:             settings.ForceExpectTo,\n\t\t\tValidateAsyncIntervals:    settings.ValidateAsyncIntervals,\n\t\t\tForbidSpecPollution:       settings.ForbidSpecPollution,\n\t\t\tForceSucceedForFuncs:      settings.ForceSucceedForFuncs,\n\t\t\tForceAssertionDescription: settings.ForceAssertionDescription,\n\t\t\tForeToNot:                 settings.ForeToNot,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(ginkgolinter.NewAnalyzerWithConfig(cfg)).\n\t\tWithDesc(\"enforces standards of using ginkgo and gomega\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/ginkgolinter_integration_test.go",
    "content": "package ginkgolinter\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter.go",
    "content": "//golangcitest:args -Eginkgolinter\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc LenUsecase() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc NilUsecase() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n}\nfunc BooleanUsecase() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\nfunc ErrorUsecase() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())              // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(Equal(true))   // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(BeFalse())     // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err != nil).To(BeTrue())      // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(funcReturnsErr()).To(BeNil()) // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(funcReturnsErr\\\\(\\\\)\\\\)\\\\.To\\\\(Succeed\\\\(\\\\)\\\\)\"\n}\n\nfunc HaveLen0Usecase() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc WrongComparisonUsecase() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())    // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(Equal\\\\(8\\\\)\\\\)\"\n\tExpect(x < 9).To(BeTrue())     // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNumerically\\\\(\\\"<\\\", 9\\\\)\\\\)\"\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNumerically\\\\(\\\"<\\\", 7\\\\)\\\\)\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(p1\\\\).To\\\\(BeIdenticalTo\\\\(p2\\\\)\\\\)\"\n}\n\nfunc slowInt() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\nfunc WrongEventuallyWithFunction() {\n\tEventually(slowInt).Should(Equal(42))   // valid\n\tEventually(slowInt()).Should(Equal(42)) // want \"ginkgo-linter: use a function call in Eventually. This actually checks nothing, because Eventually receives the function returned value, instead of function itself, and this value is never changed. Consider using .Eventually\\\\(slowInt\\\\)\\\\.Should\\\\(Equal\\\\(42\\\\)\\\\)\"\n}\n\nvar _ = FDescribe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() {\n\t\tFWhen(\"should not allow FWhen\", func() {\n\t\t\tFIt(\"should not allow FIt\", func() {})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_allow_havelen0.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter:\n      allow-havelen-zero: true\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_cgo.go",
    "content": "//golangcitest:args -Eginkgolinter\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc LenUsecase() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_default.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter: {}\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_havelen0.go",
    "content": "//golangcitest:config_path testdata/ginkgolinter_allow_havelen0.yml\n//golangcitest:args -Eginkgolinter\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc LenUsecase_havelen0() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using `Expect\\\\(fakeVarUnderTest\\\\).Should\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc NilUsecase_havelen0() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n}\nfunc BooleanUsecase_havelen0() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\nfunc ErrorUsecase_havelen0() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())              // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(Equal(true))   // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(BeFalse())     // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err != nil).To(BeTrue())      // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(funcReturnsErr()).To(BeNil()) // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(funcReturnsErr\\\\(\\\\)\\\\)\\\\.To\\\\(Succeed\\\\(\\\\)\\\\)\"\n}\n\nfunc HaveLen0Usecase_havelen0() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0))\n}\n\nfunc WrongComparisonUsecase_havelen0() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())    // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(Equal\\\\(8\\\\)\\\\)\"\n\tExpect(x < 9).To(BeTrue())     // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNumerically\\\\(\\\"<\\\", 9\\\\)\\\\)\"\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNumerically\\\\(\\\"<\\\", 7\\\\)\\\\)\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(p1\\\\).To\\\\(BeIdenticalTo\\\\(p2\\\\)\\\\)\"\n}\n\nfunc slowInt_havelen0() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\nfunc WrongEventuallyWithFunction_havelen0() {\n\tEventually(slowInt_havelen0).Should(Equal(42))   // valid\n\tEventually(slowInt_havelen0()).Should(Equal(42)) // want \"ginkgo-linter: use a function call in Eventually. This actually checks nothing, because Eventually receives the function returned value, instead of function itself, and this value is never changed. Consider using .Eventually\\\\(slowInt_havelen0\\\\)\\\\.Should\\\\(Equal\\\\(42\\\\)\\\\)\"\n}\n\nvar _ = FDescribe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() {\n\t\tFWhen(\"should not allow FWhen\", func() {\n\t\t\tFIt(\"should not allow FIt\", func() {})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_async.go",
    "content": "//golangcitest:config_path testdata/ginkgolinter_suppress_async.yml\n//golangcitest:args -Eginkgolinter\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc LenUsecase_async() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(BeEmpty\\\\(\\\\)\\\\). instead\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc NilUsecase_async() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n}\nfunc BooleanUsecase_async() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\nfunc ErrorUsecase_async() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())              // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(Equal(true))   // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(BeFalse())     // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err != nil).To(BeTrue())      // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(funcReturnsErr()).To(BeNil()) // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(funcReturnsErr\\\\(\\\\)\\\\)\\\\.To\\\\(Succeed\\\\(\\\\)\\\\)\"\n}\n\nfunc HaveLen0Usecase_async() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc WrongComparisonUsecase_async() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())    // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(Equal\\\\(8\\\\)\\\\)\"\n\tExpect(x < 9).To(BeTrue())     // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNumerically\\\\(\\\"<\\\", 9\\\\)\\\\)\"\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNumerically\\\\(\\\"<\\\", 7\\\\)\\\\)\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(p1\\\\).To\\\\(BeIdenticalTo\\\\(p2\\\\)\\\\)\"\n}\n\nfunc slowInt_async() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\n// WrongEventuallyWithFunction_async Should trigger no warning\nfunc WrongEventuallyWithFunction_async() {\n\tEventually(slowInt_async).Should(Equal(42))   // valid\n\tEventually(slowInt_async()).Should(Equal(42)) // suppressed\n}\n\nvar _ = FDescribe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() {\n\t\tFWhen(\"should not allow FWhen\", func() {\n\t\t\tFIt(\"should not allow FIt\", func() {})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_async.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter:\n      suppress-async-assertion: true\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_compare.go",
    "content": "//golangcitest:config_path testdata/ginkgolinter_suppress_compare.yml\n//golangcitest:args -Eginkgolinter\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc LenUsecase_compare() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc NilUsecase_compare() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n}\nfunc BooleanUsecase_compare() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\nfunc ErrorUsecase_compare() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())              // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(Equal(true))   // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(BeFalse())     // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err != nil).To(BeTrue())      // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(funcReturnsErr()).To(BeNil()) // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(funcReturnsErr\\\\(\\\\)\\\\)\\\\.To\\\\(Succeed\\\\(\\\\)\\\\)\"\n}\n\nfunc HaveLen0Usecase_compare() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\n// WrongComparisonUsecase_compare should not trigger any warning\nfunc WrongComparisonUsecase_compare() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())\n\tExpect(x < 9).To(BeTrue())\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using `Expect\\\\(x < 7\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)`\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using `Expect\\\\(p1 == p2\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)`\"\n}\n\nfunc slowInt_compare() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\nfunc WrongEventuallyWithFunction_compare() {\n\tEventually(slowInt_compare).Should(Equal(42))   // valid\n\tEventually(slowInt_compare()).Should(Equal(42)) // want \"ginkgo-linter: use a function call in Eventually. This actually checks nothing, because Eventually receives the function returned value, instead of function itself, and this value is never changed. Consider using .Eventually\\\\(slowInt_compare\\\\)\\\\.Should\\\\(Equal\\\\(42\\\\)\\\\)\"\n}\n\nvar _ = FDescribe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() {\n\t\tFWhen(\"should not allow FWhen\", func() {\n\t\t\tFIt(\"should not allow FIt\", func() {})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_compare.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter:\n      suppress-compare-assertion: true\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_err.go",
    "content": "//golangcitest:config_path testdata/ginkgolinter_suppress_err.yml\n//golangcitest:args -Eginkgolinter\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc LenUsecase_err() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc NilUsecase_err() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n}\nfunc BooleanUsecase_err() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\n// ErrorUsecase_err should not trigger any warning\nfunc ErrorUsecase_err() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())\n\tExpect(err == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using `Expect\\\\(err\\\\).To\\\\(BeNil\\\\(\\\\)\\\\)`\"\n\tExpect(err == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using `Expect\\\\(err\\\\).ToNot\\\\(BeNil\\\\(\\\\)\\\\)`\"\n\tExpect(err != nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using `Expect\\\\(err\\\\).ToNot\\\\(BeNil\\\\(\\\\)\\\\)`\"\n\tExpect(funcReturnsErr()).To(BeNil())\n}\n\nfunc HaveLen0Usecase_err() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc WrongComparisonUsecase_err() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())    // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(Equal\\\\(8\\\\)\\\\)\"\n\tExpect(x < 9).To(BeTrue())     // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNumerically\\\\(\\\"<\\\", 9\\\\)\\\\)\"\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNumerically\\\\(\\\"<\\\", 7\\\\)\\\\)\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(p1\\\\).To\\\\(BeIdenticalTo\\\\(p2\\\\)\\\\)\"\n}\n\nfunc slowInt_err() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\nfunc WrongEventuallyWithFunction_err() {\n\tEventually(slowInt_err).Should(Equal(42))   // valid\n\tEventually(slowInt_err()).Should(Equal(42)) // want \"ginkgo-linter: use a function call in Eventually. This actually checks nothing, because Eventually receives the function returned value, instead of function itself, and this value is never changed. Consider using .Eventually\\\\(slowInt_err\\\\)\\\\.Should\\\\(Equal\\\\(42\\\\)\\\\)\"\n}\n\nvar _ = FDescribe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() {\n\t\tFWhen(\"should not allow FWhen\", func() {\n\t\t\tFIt(\"should not allow FIt\", func() {})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_err.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter:\n      suppress-err-assertion: true\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_focused_containers.go",
    "content": "//golangcitest:args -Eginkgolinter\n//golangcitest:config_path testdata/ginkgolinter_suppress_focused_containers.yml\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc LenUsecase_focus() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc NilUsecase_focus() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n}\nfunc BooleanUsecase_focus() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\nfunc ErrorUsecase_focus() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())              // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(Equal(true))   // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(BeFalse())     // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err != nil).To(BeTrue())      // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(funcReturnsErr()).To(BeNil()) // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(funcReturnsErr\\\\(\\\\)\\\\)\\\\.To\\\\(Succeed\\\\(\\\\)\\\\)\"\n}\n\nfunc HaveLen0Usecase_focus() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc WrongComparisonUsecase_focus() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())    // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(Equal\\\\(8\\\\)\\\\)\"\n\tExpect(x < 9).To(BeTrue())     // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNumerically\\\\(\\\"<\\\", 9\\\\)\\\\)\"\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNumerically\\\\(\\\"<\\\", 7\\\\)\\\\)\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(p1\\\\).To\\\\(BeIdenticalTo\\\\(p2\\\\)\\\\)\"\n}\n\nfunc slowInt_focus() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\nfunc WrongEventuallyWithFunction_focus() {\n\tEventually(slowInt_focus).Should(Equal(42))   // valid\n\tEventually(slowInt_focus()).Should(Equal(42)) // want \"ginkgo-linter: use a function call in Eventually. This actually checks nothing, because Eventually receives the function returned value, instead of function itself, and this value is never changed. Consider using .Eventually\\\\(slowInt_focus\\\\)\\\\.Should\\\\(Equal\\\\(42\\\\)\\\\)\"\n}\n\nvar _ = Describe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() { // want \"ginkgo-linter: Focus container found. This is used only for local debug and should not be part of the actual source code. Consider to replace with \\\"Context\\\"\"\n\t\tFWhen(\"should not allow FWhen\", func() { // want \"ginkgo-linter: Focus container found. This is used only for local debug and should not be part of the actual source code. Consider to replace with \\\"When\\\"\"\n\t\t\tFIt(\"should not allow FIt\", func() { // want \"ginkgo-linter: Focus container found. This is used only for local debug and should not be part of the actual source code. Consider to replace with \\\"It\\\"\"\n\n\t\t\t})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_focused_containers.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter:\n      forbid-focus-container: true\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_len.go",
    "content": "//golangcitest:config_path testdata/ginkgolinter_suppress_len.yml\n//golangcitest:args -Eginkgolinter\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\n// LenUsecase_len should not trigger any warning\nfunc LenUsecase_len() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0))\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1))\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0))\n}\n\nfunc NilUsecase_len() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeTrue())    // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNil\\\\(\\\\)\\\\)\"\n\tExpect(x == nil).To(BeFalse())   // want \"ginkgo-linter: wrong nil assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNil\\\\(\\\\)\\\\)\"\n}\nfunc BooleanUsecase_len() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\nfunc ErrorUsecase_len() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())              // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(Equal(true))   // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(BeFalse())     // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err != nil).To(BeTrue())      // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(funcReturnsErr()).To(BeNil()) // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(funcReturnsErr\\\\(\\\\)\\\\)\\\\.To\\\\(Succeed\\\\(\\\\)\\\\)\"\n}\n\nfunc HaveLen0Usecase_len() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc WrongComparisonUsecase_len() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())    // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(Equal\\\\(8\\\\)\\\\)\"\n\tExpect(x < 9).To(BeTrue())     // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNumerically\\\\(\\\"<\\\", 9\\\\)\\\\)\"\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNumerically\\\\(\\\"<\\\", 7\\\\)\\\\)\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(p1\\\\).To\\\\(BeIdenticalTo\\\\(p2\\\\)\\\\)\"\n}\n\nfunc slowInt_len() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\nfunc WrongEventuallyWithFunction_len() {\n\tEventually(slowInt_len).Should(Equal(42))   // valid\n\tEventually(slowInt_len()).Should(Equal(42)) // want \"ginkgo-linter: use a function call in Eventually. This actually checks nothing, because Eventually receives the function returned value, instead of function itself, and this value is never changed. Consider using .Eventually\\\\(slowInt_len\\\\)\\\\.Should\\\\(Equal\\\\(42\\\\)\\\\)\"\n}\n\nvar _ = FDescribe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() {\n\t\tFWhen(\"should not allow FWhen\", func() {\n\t\t\tFIt(\"should not allow FIt\", func() {})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_len.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter:\n      suppress-len-assertion: true\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_nil.go",
    "content": "//golangcitest:args -Eginkgolinter\n//golangcitest:config_path testdata/ginkgolinter_suppress_nil.yml\npackage ginkgolinter\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc LenUsecase_nil() {\n\tvar fakeVarUnderTest []int\n\tExpect(fakeVarUnderTest).Should(BeEmpty())     // valid\n\tExpect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid\n\n\tExpect(len(fakeVarUnderTest)).Should(Equal(0))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(2))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(HaveLen\\\\(2\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"==\", 0)) // // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\n\tfakeVarUnderTest = append(fakeVarUnderTest, 3)\n\tExpect(len(fakeVarUnderTest)).ShouldNot(Equal(0))        // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ShouldNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).Should(Equal(1))           // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.Should\\\\(HaveLen\\\\(1\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">\", 0))  // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\">=\", 1)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n\tExpect(len(fakeVarUnderTest)).To(BeNumerically(\"!=\", 0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(fakeVarUnderTest\\\\)\\\\.ToNot\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\n// NilUsecase_nil should not trigger any warning\nfunc NilUsecase_nil() {\n\ty := 5\n\tx := &y\n\tExpect(x == nil).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using `Expect\\\\(x == nil\\\\).To\\\\(BeTrue\\\\(\\\\)\\\\)`\"\n\tExpect(nil == x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using `Expect\\\\(nil == x\\\\).To\\\\(BeTrue\\\\(\\\\)\\\\)`\"\n\tExpect(x != nil).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using `Expect\\\\(x != nil\\\\).To\\\\(BeTrue\\\\(\\\\)\\\\)`\"\n\tExpect(x == nil).To(BeTrue())\n\tExpect(x == nil).To(BeFalse())\n}\nfunc BooleanUsecase_nil() {\n\tx := true\n\tExpect(x).To(Equal(true)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeTrue\\\\(\\\\)\\\\)\"\n\tx = false\n\tExpect(x).To(Equal(false)) // want \"ginkgo-linter: wrong boolean assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeFalse\\\\(\\\\)\\\\)\"\n}\n\nfunc ErrorUsecase_nil() {\n\terr := errors.New(\"fake error\")\n\tfuncReturnsErr := func() error { return err }\n\n\tExpect(err).To(BeNil())              // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(Equal(true))   // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.ToNot\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err == nil).To(BeFalse())     // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(err != nil).To(BeTrue())      // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(err\\\\)\\\\.To\\\\(HaveOccurred\\\\(\\\\)\\\\)\"\n\tExpect(funcReturnsErr()).To(BeNil()) // want \"ginkgo-linter: wrong error assertion. Consider using .Expect\\\\(funcReturnsErr\\\\(\\\\)\\\\)\\\\.To\\\\(Succeed\\\\(\\\\)\\\\)\"\n}\n\nfunc HaveLen0Usecase_nil() {\n\tx := make([]string, 0)\n\tExpect(x).To(HaveLen(0)) // want \"ginkgo-linter: wrong length assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeEmpty\\\\(\\\\)\\\\)\"\n}\n\nfunc WrongComparisonUsecase_nil() {\n\tx := 8\n\tExpect(x == 8).To(BeTrue())    // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(Equal\\\\(8\\\\)\\\\)\"\n\tExpect(x < 9).To(BeTrue())     // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.To\\\\(BeNumerically\\\\(\\\"<\\\", 9\\\\)\\\\)\"\n\tExpect(x < 7).To(Equal(false)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(x\\\\)\\\\.ToNot\\\\(BeNumerically\\\\(\\\"<\\\", 7\\\\)\\\\)\"\n\n\tp1, p2 := &x, &x\n\tExpect(p1 == p2).To(Equal(true)) // want \"ginkgo-linter: wrong comparison assertion. Consider using .Expect\\\\(p1\\\\).To\\\\(BeIdenticalTo\\\\(p2\\\\)\\\\)\"\n}\n\nfunc slowInt_nil() int {\n\ttime.Sleep(time.Second)\n\treturn 42\n}\n\nfunc WrongEventuallyWithFunction_nil() {\n\tEventually(slowInt_nil).Should(Equal(42))   // valid\n\tEventually(slowInt_nil()).Should(Equal(42)) // want \"ginkgo-linter: use a function call in Eventually. This actually checks nothing, because Eventually receives the function returned value, instead of function itself, and this value is never changed. Consider using .Eventually\\\\(slowInt_nil\\\\)\\\\.Should\\\\(Equal\\\\(42\\\\)\\\\)\"\n}\n\nvar _ = FDescribe(\"Should warn for focused containers\", func() {\n\tFContext(\"should not allow FContext\", func() {\n\t\tFWhen(\"should not allow FWhen\", func() {\n\t\t\tFIt(\"should not allow FIt\", func() {})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/ginkgolinter_suppress_nil.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ginkgolinter:\n      suppress-nil-assertion: true\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/go.mod",
    "content": "module ginkgolinter\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/onsi/ginkgo/v2 v2.28.1\n\tgithub.com/onsi/gomega v1.39.1\n)\n\nrequire (\n\tgithub.com/Masterminds/semver/v3 v3.4.0 // indirect\n\tgithub.com/go-logr/logr v1.4.3 // indirect\n\tgithub.com/go-task/slim-sprig/v3 v3.0.0 // indirect\n\tgithub.com/google/go-cmp v0.7.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 // indirect\n\tgo.yaml.in/yaml/v3 v3.0.4 // indirect\n\tgolang.org/x/mod v0.32.0 // indirect\n\tgolang.org/x/net v0.49.0 // indirect\n\tgolang.org/x/sync v0.19.0 // indirect\n\tgolang.org/x/sys v0.40.0 // indirect\n\tgolang.org/x/text v0.33.0 // indirect\n\tgolang.org/x/tools v0.41.0 // indirect\n)\n"
  },
  {
    "path": "pkg/golinters/ginkgolinter/testdata/go.sum",
    "content": "github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=\ngithub.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs=\ngithub.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo=\ngithub.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M=\ngithub.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk=\ngithub.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE=\ngithub.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=\ngithub.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=\ngithub.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=\ngithub.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc=\ngithub.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=\ngithub.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE=\ngithub.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=\ngithub.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg=\ngithub.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE=\ngithub.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A=\ngithub.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI=\ngithub.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE=\ngithub.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28=\ngithub.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=\ngithub.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=\ngithub.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=\ngithub.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=\ngithub.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=\ngithub.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\ngithub.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=\ngithub.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=\ngithub.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=\ngo.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\ngo.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=\ngolang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=\ngolang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=\ngolang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=\ngolang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=\ngolang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=\ngolang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=\ngolang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=\ngolang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=\ngolang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=\ngolang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=\ngolang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=\ngoogle.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=\ngoogle.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "pkg/golinters/gocheckcompilerdirectives/gocheckcompilerdirectives.go",
    "content": "package gocheckcompilerdirectives\n\nimport (\n\t\"4d63.com/gocheckcompilerdirectives/checkcompilerdirectives\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(checkcompilerdirectives.Analyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/gocheckcompilerdirectives/gocheckcompilerdirectives_integration_test.go",
    "content": "package gocheckcompilerdirectives\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gocheckcompilerdirectives/testdata/gocheckcompilerdirectives.go",
    "content": "//golangcitest:args -Egocheckcompilerdirectives\npackage testdata\n\nimport _ \"embed\"\n\n// Okay cases:\n\n//go:generate echo hello world\n\n//go:embed\nvar Value string\n\n//go:\n\n// Problematic cases:\n\n// go:embed // want \"compiler directive contains space: // go:embed\"\n\n//    go:embed // want \"compiler directive contains space: //    go:embed\"\n\n//go:genrate // want \"compiler directive unrecognized: //go:genrate\"\n"
  },
  {
    "path": "pkg/golinters/gocheckcompilerdirectives/testdata/gocheckcompilerdirectives_cgo.go",
    "content": "//golangcitest:args -Egocheckcompilerdirectives\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n\t_ \"embed\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n// Okay cases:\n\n//go:generate echo hello world\n\n//go:embed\nvar Value string\n\n//go:\n\n// Problematic cases:\n\n// go:embed // want \"compiler directive contains space: // go:embed\"\n\n//    go:embed // want \"compiler directive contains space: //    go:embed\"\n\n//go:genrate // want \"compiler directive unrecognized: //go:genrate\"\n"
  },
  {
    "path": "pkg/golinters/gochecknoglobals/gochecknoglobals.go",
    "content": "package gochecknoglobals\n\nimport (\n\t\"4d63.com/gochecknoglobals/checknoglobals\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(checknoglobals.Analyzer()).\n\t\tWithDesc(\"Check that no global variables exist.\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/gochecknoglobals/gochecknoglobals_integration_test.go",
    "content": "package gochecknoglobals\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gochecknoglobals/testdata/gochecknoglobals.go",
    "content": "//golangcitest:args -Egochecknoglobals\npackage testdata\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n)\n\nvar noGlobalsVar int // want \"noGlobalsVar is a global variable\"\nvar ErrSomeType = errors.New(\"test that global errors aren't warned\")\n\nvar (\n\tOnlyDigits  = regexp.MustCompile(`^\\d+$`)\n\tBadNamedErr = errors.New(\"this is bad\") // want \"BadNamedErr is a global variable\"\n)\n\nfunc NoGlobals() {\n\tfmt.Print(noGlobalsVar)\n}\n"
  },
  {
    "path": "pkg/golinters/gochecknoglobals/testdata/gochecknoglobals_cgo.go",
    "content": "//golangcitest:args -Egochecknoglobals\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nvar noGlobalsVar int // want \"noGlobalsVar is a global variable\"\nvar ErrSomeType = errors.New(\"test that global errors aren't warned\")\n\nvar (\n\tOnlyDigits  = regexp.MustCompile(`^\\d+$`)\n\tBadNamedErr = errors.New(\"this is bad\") // want \"BadNamedErr is a global variable\"\n)\n\nfunc NoGlobals() {\n\tfmt.Print(noGlobalsVar)\n}\n"
  },
  {
    "path": "pkg/golinters/gochecknoinits/gochecknoinits.go",
    "content": "package gochecknoinits\n\nimport (\n\t\"go/ast\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/inspect\"\n\t\"golang.org/x/tools/go/ast/inspector\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName:     \"gochecknoinits\",\n\t\t\tDoc:      \"Checks that no init functions are present in Go code\",\n\t\t\tRun:      run,\n\t\t\tRequires: []*analysis.Analyzer{inspect.Analyzer},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc run(pass *analysis.Pass) (any, error) {\n\tinsp, ok := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)\n\tif !ok {\n\t\treturn nil, nil\n\t}\n\n\tfor node := range insp.PreorderSeq((*ast.FuncDecl)(nil)) {\n\t\tfuncDecl, ok := node.(*ast.FuncDecl)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tfnName := funcDecl.Name.Name\n\t\tif fnName == \"init\" && funcDecl.Recv.NumFields() == 0 {\n\t\t\tpass.Reportf(funcDecl.Pos(), \"don't use %s function\", internal.FormatCode(fnName))\n\t\t}\n\t}\n\n\treturn nil, nil\n}\n"
  },
  {
    "path": "pkg/golinters/gochecknoinits/gochecknoinits_integration_test.go",
    "content": "package gochecknoinits\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gochecknoinits/testdata/gochecknoinits.go",
    "content": "//golangcitest:args -Egochecknoinits\npackage testdata\n\nimport \"fmt\"\n\nfunc init() { // want \"don't use `init` function\"\n\tfmt.Println()\n}\n\nfunc Init() {}\n"
  },
  {
    "path": "pkg/golinters/gochecknoinits/testdata/gochecknoinits_cgo.go",
    "content": "//golangcitest:args -Egochecknoinits\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc init() { // want \"don't use `init` function\"\n\tfmt.Println()\n}\n\nfunc Init() {}\n"
  },
  {
    "path": "pkg/golinters/gochecksumtype/gochecksumtype.go",
    "content": "package gochecksumtype\n\nimport (\n\t\"strings\"\n\t\"sync\"\n\n\tgochecksumtype \"github.com/alecthomas/go-check-sumtype\"\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"gochecksumtype\"\n\nfunc New(settings *config.GoChecksumTypeSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  `Run exhaustiveness checks on Go \"sum types\"`,\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues, err := runGoCheckSumType(pass, settings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(_ *linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runGoCheckSumType(pass *analysis.Pass, settings *config.GoChecksumTypeSettings) ([]*goanalysis.Issue, error) {\n\tvar resIssues []*goanalysis.Issue\n\n\tpkg := &packages.Package{\n\t\tFset:      pass.Fset,\n\t\tSyntax:    pass.Files,\n\t\tTypes:     pass.Pkg,\n\t\tTypesInfo: pass.TypesInfo,\n\t}\n\n\tcfg := gochecksumtype.Config{\n\t\tDefaultSignifiesExhaustive: settings.DefaultSignifiesExhaustive,\n\t\tIncludeSharedInterfaces:    settings.IncludeSharedInterfaces,\n\t}\n\n\tvar unknownError error\n\terrors := gochecksumtype.Run([]*packages.Package{pkg}, cfg)\n\tfor _, err := range errors {\n\t\terr, ok := err.(gochecksumtype.Error)\n\t\tif !ok {\n\t\t\tunknownError = err\n\t\t\tcontinue\n\t\t}\n\n\t\tresIssues = append(resIssues, goanalysis.NewIssue(&result.Issue{\n\t\t\tFromLinter: linterName,\n\t\t\tText:       strings.TrimPrefix(err.Error(), err.Pos().String()+\": \"),\n\t\t\tPos:        err.Pos(),\n\t\t}, pass))\n\t}\n\n\treturn resIssues, unknownError\n}\n"
  },
  {
    "path": "pkg/golinters/gochecksumtype/gochecksumtype_integration_test.go",
    "content": "package gochecksumtype\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gochecksumtype/testdata/gochecksumtype.go",
    "content": "//golangcitest:args -Egochecksumtype\npackage testdata\n\nimport (\n\t\"log\"\n)\n\n//sumtype:decl\ntype SumType interface{ isSumType() }\n\n//sumtype:decl\ntype One struct{} // want \"type 'One' is not an interface\"\n\nfunc (One) isSumType() {}\n\ntype Two struct{}\n\nfunc (Two) isSumType() {}\n\nfunc sumTypeTest() {\n\tvar sum SumType = One{}\n\tswitch sum.(type) { // want \"exhaustiveness check failed for sum type.*SumType.*missing cases for Two\"\n\tcase One:\n\t}\n\n\tswitch sum.(type) { // want \"exhaustiveness check failed for sum type.*SumType.*missing cases for Two\"\n\tcase One:\n\tdefault:\n\t\tpanic(\"??\")\n\t}\n\n\tswitch sum.(type) {\n\tcase *One:\n\tdefault:\n\t\tlog.Println(\"legit catch all goes here\")\n\t}\n\n\tlog.Println(\"??\")\n\n\tswitch sum.(type) {\n\tcase One:\n\tcase Two:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gochecksumtype/testdata/gochecksumtype_cgo.go",
    "content": "//golangcitest:args -Egochecksumtype\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"log\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n//sumtype:decl\ntype SumType interface{ isSumType() }\n\n//sumtype:decl\ntype One struct{} // want \"type 'One' is not an interface\"\n\nfunc (One) isSumType() {}\n\ntype Two struct{}\n\nfunc (Two) isSumType() {}\n\nfunc sumTypeTest() {\n\tvar sum SumType = One{}\n\tswitch sum.(type) { // want \"exhaustiveness check failed for sum type.*SumType.*missing cases for Two\"\n\tcase One:\n\t}\n\n\tswitch sum.(type) { // want \"exhaustiveness check failed for sum type.*SumType.*missing cases for Two\"\n\tcase One:\n\tdefault:\n\t\tpanic(\"??\")\n\t}\n\n\tswitch sum.(type) {\n\tcase *One:\n\tdefault:\n\t\tlog.Println(\"legit catch all goes here\")\n\t}\n\n\tlog.Println(\"??\")\n\n\tswitch sum.(type) {\n\tcase One:\n\tcase Two:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gochecksumtype/testdata/gochecksumtype_custom.go",
    "content": "//golangcitest:args -Egochecksumtype\n//golangcitest:config_path testdata/gochecksumtype_custom.yml\npackage testdata\n\nimport (\n\t\"log\"\n)\n\n//sumtype:decl\ntype SumType interface{ isSumType() }\n\n//sumtype:decl\ntype One struct{} // want \"type 'One' is not an interface\"\n\nfunc (One) isSumType() {}\n\ntype Two struct{}\n\nfunc (Two) isSumType() {}\n\nfunc sumTypeTest() {\n\tvar sum SumType = One{}\n\tswitch sum.(type) { // want \"exhaustiveness check failed for sum type.*SumType.*missing cases for Two\"\n\tcase One:\n\t}\n\n\tswitch sum.(type) { // want \"exhaustiveness check failed for sum type.*SumType.*missing cases for Two\"\n\tcase One:\n\tdefault:\n\t\tpanic(\"??\")\n\t}\n\n\tswitch sum.(type) { // want \"exhaustiveness check failed for sum type.*SumType.*missing cases for Two\"\n\tcase *One:\n\tdefault:\n\t\tlog.Println(\"legit catch all goes here\")\n\t}\n\n\tlog.Println(\"??\")\n\n\tswitch sum.(type) {\n\tcase One:\n\tcase Two:\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gochecksumtype/testdata/gochecksumtype_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gochecksumtype:\n      default-signifies-exhaustive: false\n"
  },
  {
    "path": "pkg/golinters/gocognit/gocognit.go",
    "content": "package gocognit\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/uudashr/gocognit\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"gocognit\"\n\nfunc New(settings *config.GocognitSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Computes and checks the cognitive complexity of functions\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues := runGocognit(pass, settings)\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runGocognit(pass *analysis.Pass, settings *config.GocognitSettings) []*goanalysis.Issue {\n\tvar stats []gocognit.Stat\n\tfor _, f := range pass.Files {\n\t\tstats = gocognit.ComplexityStats(f, pass.Fset, stats)\n\t}\n\tif len(stats) == 0 {\n\t\treturn nil\n\t}\n\n\tsort.SliceStable(stats, func(i, j int) bool {\n\t\treturn stats[i].Complexity > stats[j].Complexity\n\t})\n\n\tissues := make([]*goanalysis.Issue, 0, len(stats))\n\tfor _, s := range stats {\n\t\tif s.Complexity <= settings.MinComplexity {\n\t\t\tbreak // Break as the stats is already sorted from greatest to least\n\t\t}\n\n\t\tissues = append(issues, goanalysis.NewIssue(&result.Issue{\n\t\t\tPos: s.Pos,\n\t\t\tText: fmt.Sprintf(\"cognitive complexity %d of func %s is high (> %d)\",\n\t\t\t\ts.Complexity, internal.FormatCode(s.FuncName), settings.MinComplexity),\n\t\t\tFromLinter: linterName,\n\t\t}, pass))\n\t}\n\n\treturn issues\n}\n"
  },
  {
    "path": "pkg/golinters/gocognit/gocognit_integration_test.go",
    "content": "package gocognit\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gocognit/testdata/gocognit.go",
    "content": "//golangcitest:args -Egocognit\n//golangcitest:config_path testdata/gocognit.yml\npackage testdata\n\nfunc GoCognit_CC4_GetWords(number int) string { // want \"cognitive complexity 4 of func .* is high .*\"\n\tif number == 1 { // +1\n\t\treturn \"one\"\n\t} else if number == 2 { // +1\n\t\treturn \"a couple\"\n\t} else if number == 3 { // +1\n\t\treturn \"a few\"\n\t} else { // +1\n\t\treturn \"lots\"\n\t}\n} // total complexity = 4\n\nfunc GoCognit_CC1_GetWords(number int) string {\n\tswitch number { // +1\n\tcase 1:\n\t\treturn \"one\"\n\tcase 2:\n\t\treturn \"a couple\"\n\tcase 3:\n\t\treturn \"a few\"\n\tdefault:\n\t\treturn \"lots\"\n\t}\n} // Cognitive complexity = 1\n\nfunc GoCognit_CC3_Fact(n int) int { // want \"cognitive complexity 3 of func .* is high .*\"\n\tif n <= 1 { // +1\n\t\treturn 1\n\t} else { // +1\n\t\treturn n + GoCognit_CC3_Fact(n-1) // +1\n\t}\n} // total complexity = 3\n\nfunc GoCognit_CC7_SumOfPrimes(max int) int { // want \"cognitive complexity 7 of func .* is high .*\"\n\tvar total int\n\nOUT:\n\tfor i := 1; i < max; i++ { // +1\n\t\tfor j := 2; j < i; j++ { // +2 (nesting = 1)\n\t\t\tif i%j == 0 { // +3 (nesting = 2)\n\t\t\t\tcontinue OUT // +1\n\t\t\t}\n\t\t}\n\t\ttotal += i\n\t}\n\n\treturn total\n} // Cognitive complexity = 7\n"
  },
  {
    "path": "pkg/golinters/gocognit/testdata/gocognit.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gocognit:\n      min-complexity: 2\n"
  },
  {
    "path": "pkg/golinters/gocognit/testdata/gocognit_cgo.go",
    "content": "//golangcitest:args -Egocognit\n//golangcitest:config_path testdata/gocognit.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(number int) string { // want \"cognitive complexity 4 of func .* is high .*\"\n\tif number == 1 {          // +1\n\t\treturn \"one\"\n\t} else if number == 2 { // +1\n\t\treturn \"a couple\"\n\t} else if number == 3 { // +1\n\t\treturn \"a few\"\n\t} else { // +1\n\t\treturn \"lots\"\n\t}\n} // total complexity = 4\n"
  },
  {
    "path": "pkg/golinters/goconst/goconst.go",
    "content": "package goconst\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tgoconstAPI \"github.com/jgautheron/goconst\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"goconst\"\n\nfunc New(settings *config.GoConstSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Finds repeated strings that could be replaced by a constant\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues, err := runGoconst(pass, settings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runGoconst(pass *analysis.Pass, settings *config.GoConstSettings) ([]*goanalysis.Issue, error) {\n\tcfg := goconstAPI.Config{\n\t\tIgnoreStrings:        settings.IgnoreStringValues,\n\t\tMatchWithConstants:   settings.MatchWithConstants,\n\t\tMinStringLength:      settings.MinStringLen,\n\t\tMinOccurrences:       settings.MinOccurrencesCount,\n\t\tParseNumbers:         settings.ParseNumbers,\n\t\tNumberMin:            settings.NumberMin,\n\t\tNumberMax:            settings.NumberMax,\n\t\tExcludeTypes:         map[goconstAPI.Type]bool{},\n\t\tFindDuplicates:       settings.FindDuplicates,\n\t\tEvalConstExpressions: settings.EvalConstExpressions,\n\n\t\t// Should be managed with `linters.exclusions.rules`.\n\t\tIgnoreTests: false,\n\t}\n\n\tif settings.IgnoreCalls {\n\t\tcfg.ExcludeTypes[goconstAPI.Call] = true\n\t}\n\n\tlintIssues, err := goconstAPI.Run(pass.Files, pass.Fset, pass.TypesInfo, &cfg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(lintIssues) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tres := make([]*goanalysis.Issue, 0, len(lintIssues))\n\tfor i := range lintIssues {\n\t\tissue := &lintIssues[i]\n\n\t\tvar text string\n\n\t\tswitch {\n\t\tcase issue.OccurrencesCount > 0:\n\t\t\ttext = fmt.Sprintf(\"string %s has %d occurrences\", internal.FormatCode(issue.Str), issue.OccurrencesCount)\n\n\t\t\tif issue.MatchingConst == \"\" {\n\t\t\t\ttext += \", make it a constant\"\n\t\t\t} else {\n\t\t\t\ttext += fmt.Sprintf(\", but such constant %s already exists\", internal.FormatCode(issue.MatchingConst))\n\t\t\t}\n\n\t\tcase issue.DuplicateConst != \"\":\n\t\t\ttext = fmt.Sprintf(\"This constant is a duplicate of %s at %s\",\n\t\t\t\tinternal.FormatCode(issue.DuplicateConst),\n\t\t\t\tissue.DuplicatePos.String())\n\n\t\tdefault:\n\t\t\tcontinue\n\t\t}\n\n\t\tres = append(res, goanalysis.NewIssue(&result.Issue{\n\t\t\tPos:        issue.Pos,\n\t\t\tText:       text,\n\t\t\tFromLinter: linterName,\n\t\t}, pass))\n\t}\n\n\treturn res, nil\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/goconst_integration_test.go",
    "content": "package goconst\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst.go",
    "content": "//golangcitest:args -Egoconst\npackage testdata\n\nimport \"fmt\"\n\nfunc GoconstA() {\n\ta := \"needconst\" // want \"string `needconst` has 5 occurrences, make it a constant\"\n\tfmt.Print(a)\n\tb := \"needconst\"\n\tfmt.Print(b)\n\tc := \"needconst\"\n\tfmt.Print(c)\n}\n\nfunc GoconstB() {\n\ta := \"needconst\"\n\tfmt.Print(a)\n\tb := \"needconst\"\n\tfmt.Print(b)\n}\n\nconst AlreadyHasConst = \"alreadyhasconst\"\n\nfunc GoconstC() {\n\ta := \"alreadyhasconst\" // want \"string `alreadyhasconst` has 3 occurrences, but such constant `AlreadyHasConst` already exists\"\n\tfmt.Print(a)\n\tb := \"alreadyhasconst\"\n\tfmt.Print(b)\n\tc := \"alreadyhasconst\"\n\tfmt.Print(c)\n\tfmt.Print(\"alreadyhasconst\")\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_calls_enabled.go",
    "content": "//golangcitest:args -Egoconst\n//golangcitest:config_path testdata/goconst_calls_enabled.yml\npackage testdata\n\nimport \"fmt\"\n\nconst FooBar = \"foobar\"\n\nfunc Baz() {\n\ta := \"foobar\" // want \"string `foobar` has 4 occurrences, but such constant `FooBar` already exists\"\n\tfmt.Print(a)\n\tb := \"foobar\"\n\tfmt.Print(b)\n\tc := \"foobar\"\n\tfmt.Print(c)\n\tfmt.Print(\"foobar\")\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_calls_enabled.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    goconst:\n      ignore-calls: false\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_cgo.go",
    "content": "//golangcitest:args -Egoconst\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\ta := \"needconst\" // want \"string `needconst` has 5 occurrences, make it a constant\"\n\tfmt.Print(a)\n\tb := \"needconst\"\n\tfmt.Print(b)\n\tc := \"needconst\"\n\tfmt.Print(c)\n}\n\nfunc _() {\n\ta := \"needconst\"\n\tfmt.Print(a)\n\tb := \"needconst\"\n\tfmt.Print(b)\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_dont_ignore_test.go",
    "content": "//golangcitest:args -Egoconst\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestGoConstA(t *testing.T) {\n\ta := \"needconst\" // want \"string `needconst` has 5 occurrences, make it a constant\"\n\tfmt.Print(a)\n\tb := \"needconst\"\n\tfmt.Print(b)\n\tc := \"needconst\"\n\tfmt.Print(c)\n}\n\nfunc TestGoConstB(t *testing.T) {\n\ta := \"needconst\"\n\tfmt.Print(a)\n\tb := \"needconst\"\n\tfmt.Print(b)\n}\n\nconst AlreadyHasConst = \"alreadyhasconst\"\n\nfunc TestGoConstC(t *testing.T) {\n\ta := \"alreadyhasconst\" // want \"string `alreadyhasconst` has 3 occurrences, but such constant `AlreadyHasConst` already exists\"\n\tfmt.Print(a)\n\tb := \"alreadyhasconst\"\n\tfmt.Print(b)\n\tc := \"alreadyhasconst\"\n\tfmt.Print(c)\n\tfmt.Print(\"alreadyhasconst\")\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_eval_and_find_duplicates.go",
    "content": "//golangcitest:args -Egoconst\n//golangcitest:config_path testdata/goconst_eval_and_find_duplicates.yml\npackage testdata\n\nimport \"fmt\"\n\nconst (\n\tenvPrefix   = \"FOO_\"\n\tEnvUser     = envPrefix + \"USER\"\n\tEnvPassword = envPrefix + \"PASSWORD\"\n)\n\nconst EnvUserFull = \"FOO_USER\" // want \"This constant is a duplicate of `EnvUser` at .*goconst_eval_and_find_duplicates.go:9:16\"\n\nconst KiB = 1 << 10\n\nfunc _() {\n\tfmt.Println(envPrefix, EnvUser, EnvPassword, EnvUserFull)\n\n\tconst kilobytes = 1024 // want \"This constant is a duplicate of `KiB` at .*goconst_eval_and_find_duplicates.go:15:13\"\n\tfmt.Println(kilobytes)\n\n\tkib := 1024\n\tfmt.Println(kib)\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_eval_and_find_duplicates.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    goconst:\n      find-duplicates: true\n      eval-const-expressions: true\n      numbers: true\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_eval_const_expressions.go",
    "content": "//golangcitest:args -Egoconst\n//golangcitest:config_path testdata/goconst_eval_const_expressions.yml\npackage testdata\n\nconst (\n\tprefix = \"example.com/\"\n\tAPI    = prefix + \"api\"\n\tWeb    = prefix + \"web\"\n)\n\nconst Full = \"example.com/api\"\n\nfunc _() {\n\ta0 := \"example.com/api\" // want \"string `example.com/api` has 3 occurrences, but such constant `API` already exists\"\n\ta1 := \"example.com/api\"\n\ta2 := \"example.com/api\"\n\n\t_ = a0\n\t_ = a1\n\t_ = a2\n\n\tb0 := \"example.com/web\" // want \"string `example.com/web` has 3 occurrences, but such constant `Web` already exists\"\n\tb1 := \"example.com/web\"\n\tb2 := \"example.com/web\"\n\n\t_ = b0\n\t_ = b1\n\t_ = b2\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_eval_const_expressions.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    goconst:\n      eval-const-expressions: true\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_find_duplicates.go",
    "content": "//golangcitest:args -Egoconst\n//golangcitest:config_path testdata/goconst_find_duplicates.yml\npackage testdata\n\nconst SingleConst = \"single constant\"\n\nconst (\n\tGroupedConst1 = \"grouped constant\"\n\tGroupedConst2 = \"another grouped\"\n)\n\nconst (\n\tGroupedDuplicateConst1 = \"grouped duplicate value\"\n\tGroupedDuplicateConst2 = \"grouped duplicate value\" // want \"This constant is a duplicate of `GroupedDuplicateConst1` at .*goconst_find_duplicates.go:13:2\"\n)\n\nconst DuplicateConst1 = \"duplicate value\"\n\nconst DuplicateConst2 = \"duplicate value\" // want \"This constant is a duplicate of `DuplicateConst1` at .*goconst_find_duplicates.go:17:7\"\n\nconst (\n\tSpecialDuplicateConst1 = \"special\\nvalue\\twith\\rchars\"\n\tSpecialDuplicateConst2 = \"special\\nvalue\\twith\\rchars\" // want \"This constant is a duplicate of `SpecialDuplicateConst1` at .*goconst_find_duplicates.go:22:2\"\n)\n\nfunc _() {\n\tconst DuplicateScopedConst1 = \"duplicate scoped value\"\n\tconst DuplicateScopedConst2 = \"duplicate scoped value\" // want \"This constant is a duplicate of `DuplicateScopedConst1` at .*goconst_find_duplicates.go:27:8\"\n}\n"
  },
  {
    "path": "pkg/golinters/goconst/testdata/goconst_find_duplicates.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    goconst:\n      find-duplicates: true\n"
  },
  {
    "path": "pkg/golinters/gocritic/gocritic.go",
    "content": "package gocritic\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/types\"\n\t\"runtime\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/go-critic/go-critic/checkers\"\n\tgocriticlinter \"github.com/go-critic/go-critic/linter\"\n\t_ \"github.com/quasilyte/go-ruleguard/dsl\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nconst linterName = \"gocritic\"\n\nvar (\n\tdebugf  = logutils.Debug(logutils.DebugKeyGoCritic)\n\tisDebug = logutils.HaveDebugTag(logutils.DebugKeyGoCritic)\n)\n\nfunc New(settings *config.GoCriticSettings, replacer *strings.Replacer) *goanalysis.Linter {\n\twrapper := &goCriticWrapper{\n\t\tsizes: types.SizesFor(\"gc\", runtime.GOARCH),\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc: `Provides diagnostics that check for bugs, performance and style issues.\nExtensible without recompilation through dynamic rules.\nDynamic rules are written declaratively with AST patterns, filters, report message and optional suggestion.`,\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\terr := wrapper.run(pass)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithContextSetter(func(context *linter.Context) {\n\t\t\twrapper.init(context.Log, settings, replacer)\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\ntype goCriticWrapper struct {\n\tsettingsWrapper *settingsWrapper\n\tsizes           types.Sizes\n\tonce            sync.Once\n}\n\nfunc (w *goCriticWrapper) init(logger logutils.Log, settings *config.GoCriticSettings, replacer *strings.Replacer) {\n\tif settings == nil {\n\t\treturn\n\t}\n\n\tw.once.Do(func() {\n\t\terr := checkers.InitEmbeddedRules()\n\t\tif err != nil {\n\t\t\tlogger.Fatalf(\"%s: %v: setting an explicit GOROOT can fix this problem\", linterName, err)\n\t\t}\n\t})\n\n\tsettingsWrapper := newSettingsWrapper(logger, settings, replacer)\n\n\tif err := settingsWrapper.Load(); err != nil {\n\t\tlogger.Fatalf(\"%s: invalid settings: %s\", linterName, err)\n\t}\n\n\tw.settingsWrapper = settingsWrapper\n}\n\nfunc (w *goCriticWrapper) run(pass *analysis.Pass) error {\n\tif w.settingsWrapper == nil {\n\t\treturn errors.New(\"the settings wrapper is nil\")\n\t}\n\n\tlinterCtx := gocriticlinter.NewContext(pass.Fset, w.sizes)\n\n\tlinterCtx.SetGoVersion(w.settingsWrapper.Go)\n\n\tenabledCheckers, err := w.buildEnabledCheckers(linterCtx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlinterCtx.SetPackageInfo(pass.TypesInfo, pass.Pkg)\n\n\tneedFileInfo := slices.ContainsFunc(enabledCheckers, func(c *gocriticlinter.Checker) bool {\n\t\t// Related to https://github.com/go-critic/go-critic/blob/440ff466685b41e67d231a1c4a8f5e093374ee93/checkers/importShadow_checker.go#L23\n\t\treturn strings.EqualFold(c.Info.Name, \"importShadow\")\n\t})\n\n\tfor _, f := range pass.Files {\n\t\tif needFileInfo {\n\t\t\t// Related to https://github.com/go-critic/go-critic/blob/440ff466685b41e67d231a1c4a8f5e093374ee93/checkers/importShadow_checker.go#L23\n\t\t\tlinterCtx.SetFileInfo(f.Name.Name, f)\n\t\t}\n\n\t\trunOnFile(pass, f, enabledCheckers)\n\t}\n\n\treturn nil\n}\n\nfunc (w *goCriticWrapper) buildEnabledCheckers(linterCtx *gocriticlinter.Context) ([]*gocriticlinter.Checker, error) {\n\tallLowerCasedParams := w.settingsWrapper.GetLowerCasedParams()\n\n\tvar enabledCheckers []*gocriticlinter.Checker\n\tfor _, info := range gocriticlinter.GetCheckersInfo() {\n\t\tif !w.settingsWrapper.IsCheckEnabled(info.Name) {\n\t\t\tcontinue\n\t\t}\n\n\t\terr := w.settingsWrapper.setCheckerParams(info, allLowerCasedParams)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tc, err := gocriticlinter.NewChecker(linterCtx, info)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tenabledCheckers = append(enabledCheckers, c)\n\t}\n\n\treturn enabledCheckers, nil\n}\n\nfunc runOnFile(pass *analysis.Pass, f *ast.File, checks []*gocriticlinter.Checker) {\n\tfor _, c := range checks {\n\t\t// All checkers are expected to use *lint.Context\n\t\t// as read-only structure, so no copying is required.\n\t\tfor _, warn := range c.Check(f) {\n\t\t\tdiag := analysis.Diagnostic{\n\t\t\t\tPos:      warn.Pos,\n\t\t\t\tCategory: c.Info.Name,\n\t\t\t\tMessage:  fmt.Sprintf(\"%s: %s\", c.Info.Name, warn.Text),\n\t\t\t}\n\n\t\t\tif warn.HasQuickFix() {\n\t\t\t\tdiag.SuggestedFixes = []analysis.SuggestedFix{{\n\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\tPos:     warn.Suggestion.From,\n\t\t\t\t\t\tEnd:     warn.Suggestion.To,\n\t\t\t\t\t\tNewText: warn.Suggestion.Replacement,\n\t\t\t\t\t}},\n\t\t\t\t}}\n\t\t\t}\n\n\t\t\tpass.Report(diag)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/gocritic_integration_test.go",
    "content": "package gocritic\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/gocritic_settings.go",
    "content": "package gocritic\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"maps\"\n\t\"reflect\"\n\t\"slices\"\n\t\"strings\"\n\n\tgocriticlinter \"github.com/go-critic/go-critic/linter\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype settingsWrapper struct {\n\t*config.GoCriticSettings\n\n\treplacer *strings.Replacer\n\n\tlogger logutils.Log\n\n\tallCheckers []*gocriticlinter.CheckerInfo\n\n\tallChecks             goCriticChecks[struct{}]\n\tallChecksByTag        goCriticChecks[[]string]\n\tallTagsSorted         []string\n\tinferredEnabledChecks goCriticChecks[struct{}]\n\n\t// *LowerCased fields are used for GoCriticSettings.SettingsPerCheck validation only.\n\n\tallChecksLowerCased             goCriticChecks[struct{}]\n\tinferredEnabledChecksLowerCased goCriticChecks[struct{}]\n}\n\nfunc newSettingsWrapper(logger logutils.Log, settings *config.GoCriticSettings, replacer *strings.Replacer) *settingsWrapper {\n\tallCheckers := gocriticlinter.GetCheckersInfo()\n\n\tallChecks := make(goCriticChecks[struct{}], len(allCheckers))\n\tallChecksLowerCased := make(goCriticChecks[struct{}], len(allCheckers))\n\tallChecksByTag := make(goCriticChecks[[]string])\n\n\tfor _, checker := range allCheckers {\n\t\tallChecks[checker.Name] = struct{}{}\n\t\tallChecksLowerCased[strings.ToLower(checker.Name)] = struct{}{}\n\n\t\tfor _, tag := range checker.Tags {\n\t\t\tallChecksByTag[tag] = append(allChecksByTag[tag], checker.Name)\n\t\t}\n\t}\n\n\treturn &settingsWrapper{\n\t\tGoCriticSettings: settings,\n\t\treplacer:         replacer,\n\t\tlogger:           logger,\n\n\t\tallCheckers:           allCheckers,\n\t\tallChecks:             allChecks,\n\t\tallChecksByTag:        allChecksByTag,\n\t\tallTagsSorted:         slices.Sorted(maps.Keys(allChecksByTag)),\n\t\tinferredEnabledChecks: make(goCriticChecks[struct{}]),\n\n\t\tallChecksLowerCased:             allChecksLowerCased,\n\t\tinferredEnabledChecksLowerCased: make(goCriticChecks[struct{}]),\n\t}\n}\n\nfunc (s *settingsWrapper) IsCheckEnabled(name string) bool {\n\treturn s.inferredEnabledChecks.has(name)\n}\n\nfunc (s *settingsWrapper) GetLowerCasedParams() map[string]config.GoCriticCheckSettings {\n\treturn normalizeMap(s.SettingsPerCheck)\n}\n\nfunc (s *settingsWrapper) Load() error {\n\ts.inferEnabledChecks()\n\n\t// validate must be after inferEnabledChecks, not before.\n\t// Because it uses gathered information about tags set and finally enabled checks.\n\treturn s.validate()\n}\n\nfunc (s *settingsWrapper) inferEnabledChecks() {\n\ts.debugChecksInitialState()\n\n\tenabledByDefaultChecks, disabledByDefaultChecks := s.buildEnabledAndDisabledByDefaultChecks()\n\n\tdebugChecksListf(enabledByDefaultChecks, \"Enabled by default\")\n\tdebugChecksListf(disabledByDefaultChecks, \"Disabled by default\")\n\n\tvar enabledChecks goCriticChecks[struct{}]\n\n\tswitch {\n\tcase s.DisableAll:\n\t\t// disable-all revokes the default settings.\n\t\tenabledChecks = make(goCriticChecks[struct{}])\n\n\tcase s.EnableAll:\n\t\t// enable-all revokes the default settings.\n\t\tenabledChecks = make(goCriticChecks[struct{}], len(s.allCheckers))\n\n\t\tfor _, info := range s.allCheckers {\n\t\t\tenabledChecks[info.Name] = struct{}{}\n\t\t}\n\n\tdefault:\n\t\tenabledChecks = make(goCriticChecks[struct{}], len(enabledByDefaultChecks))\n\n\t\tfor _, check := range enabledByDefaultChecks {\n\t\t\tenabledChecks[check] = struct{}{}\n\t\t}\n\t}\n\n\tif len(s.EnabledTags) > 0 {\n\t\tenabledFromTags := s.expandTagsToChecks(s.EnabledTags)\n\n\t\tdebugChecksListf(enabledFromTags, \"Enabled by config tags %s\", s.EnabledTags)\n\n\t\tfor _, check := range enabledFromTags {\n\t\t\tenabledChecks[check] = struct{}{}\n\t\t}\n\t}\n\n\tif len(s.EnabledChecks) > 0 {\n\t\tdebugChecksListf(s.EnabledChecks, \"Enabled by config\")\n\n\t\tfor _, check := range s.EnabledChecks {\n\t\t\tif enabledChecks.has(check) {\n\t\t\t\ts.logger.Warnf(\"%s: no need to enable check %q: it's already enabled\", linterName, check)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tenabledChecks[check] = struct{}{}\n\t\t}\n\t}\n\n\tif len(s.DisabledTags) > 0 {\n\t\tdisabledFromTags := s.expandTagsToChecks(s.DisabledTags)\n\n\t\tdebugChecksListf(disabledFromTags, \"Disabled by config tags %s\", s.DisabledTags)\n\n\t\tfor _, check := range disabledFromTags {\n\t\t\tdelete(enabledChecks, check)\n\t\t}\n\t}\n\n\tif len(s.DisabledChecks) > 0 {\n\t\tdebugChecksListf(s.DisabledChecks, \"Disabled by config\")\n\n\t\tfor _, check := range s.DisabledChecks {\n\t\t\tif !enabledChecks.has(check) {\n\t\t\t\ts.logger.Warnf(\"%s: no need to disable check %q: it's already disabled\", linterName, check)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tdelete(enabledChecks, check)\n\t\t}\n\t}\n\n\ts.inferredEnabledChecks = enabledChecks\n\ts.inferredEnabledChecksLowerCased = normalizeMap(s.inferredEnabledChecks)\n\n\ts.debugChecksFinalState()\n}\n\nfunc (s *settingsWrapper) buildEnabledAndDisabledByDefaultChecks() (enabled, disabled []string) {\n\tfor _, info := range s.allCheckers {\n\t\tif isEnabledByDefaultGoCriticChecker(info) {\n\t\t\tenabled = append(enabled, info.Name)\n\t\t} else {\n\t\t\tdisabled = append(disabled, info.Name)\n\t\t}\n\t}\n\n\treturn enabled, disabled\n}\n\nfunc (s *settingsWrapper) expandTagsToChecks(tags []string) []string {\n\tvar checks []string\n\n\tfor _, tag := range tags {\n\t\tchecks = append(checks, s.allChecksByTag[tag]...)\n\t}\n\n\treturn checks\n}\n\nfunc (s *settingsWrapper) setCheckerParams(\n\tinfo *gocriticlinter.CheckerInfo,\n\tallLowerCasedParams map[string]config.GoCriticCheckSettings,\n) error {\n\tparams := allLowerCasedParams[strings.ToLower(info.Name)]\n\tif params == nil { // no config for this checker\n\t\treturn nil\n\t}\n\n\t// To lowercase info param keys here because golangci-lint's config parser lowercases all strings.\n\tinfoParams := normalizeMap(info.Params)\n\tfor k, p := range params {\n\t\tv, ok := infoParams[k]\n\t\tif ok {\n\t\t\tv.Value = s.normalizeCheckerParamsValue(p)\n\t\t\tcontinue\n\t\t}\n\n\t\t// param `k` isn't supported\n\t\tif len(info.Params) == 0 {\n\t\t\treturn fmt.Errorf(\"checker %s config param %s doesn't exist: checker doesn't have params\",\n\t\t\t\tinfo.Name, k)\n\t\t}\n\n\t\treturn fmt.Errorf(\"checker %s config param %s doesn't exist, all existing: %s\",\n\t\t\tinfo.Name, k, slices.Sorted(maps.Keys(info.Params)))\n\t}\n\n\treturn nil\n}\n\nfunc (s *settingsWrapper) debugChecksInitialState() {\n\tif !isDebug {\n\t\treturn\n\t}\n\n\tdebugf(\"All gocritic existing tags and checks:\")\n\n\tfor _, tag := range s.allTagsSorted {\n\t\tdebugChecksListf(s.allChecksByTag[tag], \"  tag %q\", tag)\n\t}\n}\n\nfunc (s *settingsWrapper) debugChecksFinalState() {\n\tif !isDebug {\n\t\treturn\n\t}\n\n\tvar enabledChecks []string\n\tvar disabledChecks []string\n\n\tfor _, checker := range s.allCheckers {\n\t\tif s.IsCheckEnabled(checker.Name) {\n\t\t\tenabledChecks = append(enabledChecks, checker.Name)\n\t\t} else {\n\t\t\tdisabledChecks = append(disabledChecks, checker.Name)\n\t\t}\n\t}\n\n\tdebugChecksListf(enabledChecks, \"Final used\")\n\n\tif len(disabledChecks) == 0 {\n\t\tdebugf(\"All checks are enabled\")\n\t} else {\n\t\tdebugChecksListf(disabledChecks, \"Final not used\")\n\t}\n}\n\n// normalizeCheckerParamsValue normalizes value types.\n// go-critic asserts that CheckerParam.Value has some specific types,\n// but the file parsers (TOML, YAML, JSON) don't create the same representation for raw type.\n// then we have to convert value types into the expected value types.\n// Maybe in the future, this kind of conversion will be done in go-critic itself.\nfunc (s *settingsWrapper) normalizeCheckerParamsValue(p any) any {\n\trv := reflect.ValueOf(p)\n\n\tswitch rv.Type().Kind() {\n\tcase reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int:\n\t\treturn int(rv.Int())\n\n\tcase reflect.Bool:\n\t\treturn rv.Bool()\n\n\tcase reflect.String:\n\t\t// Perform variable substitution.\n\t\treturn s.replacer.Replace(rv.String())\n\n\tdefault:\n\t\treturn p\n\t}\n}\n\n// validate tries to be consistent with (lintersdb.Validator).validateEnabledDisabledLintersConfig.\nfunc (s *settingsWrapper) validate() error {\n\tfor _, v := range []func() error{\n\t\ts.validateOptionsCombinations,\n\t\ts.validateCheckerTags,\n\t\ts.validateCheckerNames,\n\t\ts.validateDisabledAndEnabledAtOneMoment,\n\t\ts.validateAtLeastOneCheckerEnabled,\n\t} {\n\t\tif err := v(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (s *settingsWrapper) validateOptionsCombinations() error {\n\tif s.EnableAll && s.DisableAll {\n\t\treturn errors.New(\"enable-all and disable-all options must not be combined\")\n\t}\n\n\tswitch {\n\tcase s.EnableAll:\n\t\tif len(s.EnabledTags) > 0 {\n\t\t\treturn errors.New(\"enable-all and enabled-tags options must not be combined\")\n\t\t}\n\n\t\tif len(s.EnabledChecks) > 0 {\n\t\t\treturn errors.New(\"enable-all and enabled-checks options must not be combined\")\n\t\t}\n\n\tcase s.DisableAll:\n\t\tif len(s.DisabledTags) > 0 {\n\t\t\treturn errors.New(\"disable-all and disabled-tags options must not be combined\")\n\t\t}\n\n\t\tif len(s.DisabledChecks) > 0 {\n\t\t\treturn errors.New(\"disable-all and disabled-checks options must not be combined\")\n\t\t}\n\n\t\tif len(s.EnabledTags) == 0 && len(s.EnabledChecks) == 0 {\n\t\t\treturn errors.New(\"all checks were disabled, but no one check was enabled: at least one must be enabled\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *settingsWrapper) validateCheckerTags() error {\n\tfor _, tag := range s.EnabledTags {\n\t\tif !s.allChecksByTag.has(tag) {\n\t\t\treturn fmt.Errorf(\"enabled tag %q doesn't exist, see %s's documentation\", tag, linterName)\n\t\t}\n\t}\n\n\tfor _, tag := range s.DisabledTags {\n\t\tif !s.allChecksByTag.has(tag) {\n\t\t\treturn fmt.Errorf(\"disabled tag %q doesn't exist, see %s's documentation\", tag, linterName)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *settingsWrapper) validateCheckerNames() error {\n\tfor _, check := range s.EnabledChecks {\n\t\tif !s.allChecks.has(check) {\n\t\t\treturn fmt.Errorf(\"enabled check %q doesn't exist, see %s's documentation\", check, linterName)\n\t\t}\n\t}\n\n\tfor _, check := range s.DisabledChecks {\n\t\tif !s.allChecks.has(check) {\n\t\t\treturn fmt.Errorf(\"disabled check %q doesn't exist, see %s documentation\", check, linterName)\n\t\t}\n\t}\n\n\tfor check := range s.SettingsPerCheck {\n\t\tlcName := strings.ToLower(check)\n\n\t\tif !s.allChecksLowerCased.has(lcName) {\n\t\t\treturn fmt.Errorf(\"invalid check settings: check %q doesn't exist, see %s documentation\", check, linterName)\n\t\t}\n\n\t\tif !s.inferredEnabledChecksLowerCased.has(lcName) {\n\t\t\ts.logger.Warnf(\"%s: settings were provided for disabled check %q\", check, linterName)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *settingsWrapper) validateDisabledAndEnabledAtOneMoment() error {\n\tfor _, tag := range s.DisabledTags {\n\t\tif slices.Contains(s.EnabledTags, tag) {\n\t\t\treturn fmt.Errorf(\"tag %q disabled and enabled at one moment\", tag)\n\t\t}\n\t}\n\n\tfor _, check := range s.DisabledChecks {\n\t\tif slices.Contains(s.EnabledChecks, check) {\n\t\t\treturn fmt.Errorf(\"check %q disabled and enabled at one moment\", check)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *settingsWrapper) validateAtLeastOneCheckerEnabled() error {\n\tif len(s.inferredEnabledChecks) == 0 {\n\t\treturn errors.New(\"eventually all checks were disabled: at least one must be enabled\")\n\t}\n\n\treturn nil\n}\n\ntype goCriticChecks[T any] map[string]T\n\nfunc (m goCriticChecks[T]) has(name string) bool {\n\t_, ok := m[name]\n\treturn ok\n}\n\nfunc debugChecksListf(checks []string, format string, args ...any) {\n\tif !isDebug {\n\t\treturn\n\t}\n\n\tv := slices.Sorted(slices.Values(checks))\n\n\tdebugf(\"%s checks (%d): %s\", fmt.Sprintf(format, args...), len(checks), strings.Join(v, \", \"))\n}\n\nfunc normalizeMap[ValueT any](in map[string]ValueT) map[string]ValueT {\n\tret := make(map[string]ValueT, len(in))\n\n\tfor k, v := range in {\n\t\tret[strings.ToLower(k)] = v\n\t}\n\n\treturn ret\n}\n\nfunc isEnabledByDefaultGoCriticChecker(info *gocriticlinter.CheckerInfo) bool {\n\t// https://github.com/go-critic/go-critic/blob/5b67cfd487ae9fe058b4b19321901b3131810f65/cmd/gocritic/check.go#L342-L345\n\treturn !info.HasTag(gocriticlinter.ExperimentalTag) &&\n\t\t!info.HasTag(gocriticlinter.OpinionatedTag) &&\n\t\t!info.HasTag(gocriticlinter.PerformanceTag) &&\n\t\t!info.HasTag(gocriticlinter.SecurityTag)\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/gocritic_settings_test.go",
    "content": "package gocritic\n\nimport (\n\t\"maps\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/go-critic/go-critic/checkers\"\n\tgocriticlinter \"github.com/go-critic/go-critic/linter\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\n// https://go-critic.com/overview.html\nfunc Test_settingsWrapper_inferEnabledChecks(t *testing.T) {\n\terr := checkers.InitEmbeddedRules()\n\trequire.NoError(t, err)\n\n\tallCheckersInfo := gocriticlinter.GetCheckersInfo()\n\n\tallChecksByTag := make(map[string]Slicer)\n\tallChecks := make(Slicer, 0, len(allCheckersInfo))\n\n\tfor _, checker := range allCheckersInfo {\n\t\tallChecks = append(allChecks, checker.Name)\n\t\tfor _, tag := range checker.Tags {\n\t\t\tallChecksByTag[tag] = append(allChecksByTag[tag], checker.Name)\n\t\t}\n\t}\n\n\tenabledByDefaultChecks := make(Slicer, 0, len(allCheckersInfo))\n\n\tfor _, info := range allCheckersInfo {\n\t\tif isEnabledByDefaultGoCriticChecker(info) {\n\t\t\tenabledByDefaultChecks = append(enabledByDefaultChecks, info.Name)\n\t\t}\n\t}\n\n\tt.Logf(\"enabled by default checks:\\n%s\", strings.Join(enabledByDefaultChecks, \"\\n\"))\n\n\ttestCases := []struct {\n\t\tname                  string\n\t\tsettings              *config.GoCriticSettings\n\t\texpectedEnabledChecks []string\n\t}{\n\t\t{\n\t\t\tname:                  \"no configuration\",\n\t\t\tsettings:              &config.GoCriticSettings{},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks,\n\t\t},\n\t\t{\n\t\t\tname: \"enable checks\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks: []string{\"assignOp\", \"badCall\", \"emptyDecl\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.add(\"emptyDecl\"),\n\t\t},\n\t\t{\n\t\t\tname: \"disable checks\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledChecks: []string{\"assignOp\", \"emptyDecl\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.remove(\"assignOp\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledTags: []string{\"style\", \"experimental\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tadd(allChecksByTag[\"style\"]...).\n\t\t\t\tadd(allChecksByTag[\"experimental\"]...).\n\t\t\t\tuniq(),\n\t\t},\n\t\t{\n\t\t\tname: \"disable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledTags: []string{\"diagnostic\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.remove(allChecksByTag[\"diagnostic\"]...),\n\t\t},\n\t\t{\n\t\t\tname: \"enable checks disable checks\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks:  []string{\"badCall\", \"badLock\"},\n\t\t\t\tDisabledChecks: []string{\"assignOp\", \"badSorting\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tremove(\"assignOp\").\n\t\t\t\tadd(\"badLock\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable checks enable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks: []string{\"badCall\", \"badLock\", \"hugeParam\"},\n\t\t\t\tEnabledTags:   []string{\"diagnostic\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tadd(allChecksByTag[\"diagnostic\"]...).\n\t\t\t\tadd(\"hugeParam\").\n\t\t\t\tuniq(),\n\t\t},\n\t\t{\n\t\t\tname: \"enable checks disable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks: []string{\"badCall\", \"badLock\", \"boolExprSimplify\", \"hugeParam\"},\n\t\t\t\tDisabledTags:  []string{\"style\", \"diagnostic\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tremove(allChecksByTag[\"style\"]...).\n\t\t\t\tremove(allChecksByTag[\"diagnostic\"]...).\n\t\t\t\tadd(\"hugeParam\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable all checks via tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledTags: []string{\"diagnostic\", \"experimental\", \"opinionated\", \"performance\", \"style\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecks,\n\t\t},\n\t\t{\n\t\t\tname: \"disable checks enable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledChecks: []string{\"assignOp\", \"badCall\", \"badLock\", \"hugeParam\"},\n\t\t\t\tEnabledTags:    []string{\"style\", \"diagnostic\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tadd(allChecksByTag[\"style\"]...).\n\t\t\t\tadd(allChecksByTag[\"diagnostic\"]...).\n\t\t\t\tuniq().\n\t\t\t\tremove(\"assignOp\", \"badCall\", \"badLock\"),\n\t\t},\n\t\t{\n\t\t\tname: \"disable checks disable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledChecks: []string{\"badCall\", \"badLock\", \"codegenComment\", \"hugeParam\"},\n\t\t\t\tDisabledTags:   []string{\"style\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tremove(allChecksByTag[\"style\"]...).\n\t\t\t\tremove(\"badCall\", \"codegenComment\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable tags disable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledTags:  []string{\"experimental\"},\n\t\t\t\tDisabledTags: []string{\"style\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tadd(allChecksByTag[\"experimental\"]...).\n\t\t\t\tuniq().\n\t\t\t\tremove(allChecksByTag[\"style\"]...),\n\t\t},\n\t\t{\n\t\t\tname: \"enable checks disable checks enable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks:  []string{\"badCall\", \"badLock\", \"boolExprSimplify\", \"indexAlloc\", \"hugeParam\"},\n\t\t\t\tDisabledChecks: []string{\"deprecatedComment\", \"typeSwitchVar\"},\n\t\t\t\tEnabledTags:    []string{\"experimental\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tadd(allChecksByTag[\"experimental\"]...).\n\t\t\t\tadd(\"indexAlloc\", \"hugeParam\").\n\t\t\t\tuniq().\n\t\t\t\tremove(\"deprecatedComment\", \"typeSwitchVar\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable checks disable checks enable tags disable tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks:  []string{\"badCall\", \"badCond\", \"badLock\", \"indexAlloc\", \"hugeParam\"},\n\t\t\t\tDisabledChecks: []string{\"deprecatedComment\", \"typeSwitchVar\"},\n\t\t\t\tEnabledTags:    []string{\"experimental\"},\n\t\t\t\tDisabledTags:   []string{\"performance\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: enabledByDefaultChecks.\n\t\t\t\tadd(allChecksByTag[\"experimental\"]...).\n\t\t\t\tadd(\"badCond\").\n\t\t\t\tuniq().\n\t\t\t\tremove(allChecksByTag[\"performance\"]...).\n\t\t\t\tremove(\"deprecatedComment\", \"typeSwitchVar\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable single tag only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisableAll:  true,\n\t\t\t\tEnabledTags: []string{\"experimental\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecksByTag[\"experimental\"],\n\t\t},\n\t\t{\n\t\t\tname: \"enable two tags only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisableAll:  true,\n\t\t\t\tEnabledTags: []string{\"experimental\", \"performance\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecksByTag[\"experimental\"].\n\t\t\t\tadd(allChecksByTag[\"performance\"]...).\n\t\t\t\tuniq(),\n\t\t},\n\t\t{\n\t\t\tname: \"disable single tag only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:    true,\n\t\t\t\tDisabledTags: []string{\"style\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecks.remove(allChecksByTag[\"style\"]...),\n\t\t},\n\t\t{\n\t\t\tname: \"disable two tags only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:    true,\n\t\t\t\tDisabledTags: []string{\"style\", \"diagnostic\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecks.\n\t\t\t\tremove(allChecksByTag[\"style\"]...).\n\t\t\t\tremove(allChecksByTag[\"diagnostic\"]...),\n\t\t},\n\t\t{\n\t\t\tname: \"enable some checks only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisableAll:    true,\n\t\t\t\tEnabledChecks: []string{\"deferInLoop\", \"dupImport\", \"ifElseChain\", \"mapKey\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: []string{\"deferInLoop\", \"dupImport\", \"ifElseChain\", \"mapKey\"},\n\t\t},\n\t\t{\n\t\t\tname: \"disable some checks only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:      true,\n\t\t\t\tDisabledChecks: []string{\"deferInLoop\", \"dupImport\", \"ifElseChain\", \"mapKey\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecks.\n\t\t\t\tremove(\"deferInLoop\", \"dupImport\", \"ifElseChain\", \"mapKey\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable single tag and some checks from another tag only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisableAll:    true,\n\t\t\t\tEnabledTags:   []string{\"experimental\"},\n\t\t\t\tEnabledChecks: []string{\"importShadow\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecksByTag[\"experimental\"].add(\"importShadow\"),\n\t\t},\n\t\t{\n\t\t\tname: \"disable single tag and some checks from another tag only\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:      true,\n\t\t\t\tDisabledTags:   []string{\"experimental\"},\n\t\t\t\tDisabledChecks: []string{\"importShadow\"},\n\t\t\t},\n\t\t\texpectedEnabledChecks: allChecks.\n\t\t\t\tremove(allChecksByTag[\"experimental\"]...).\n\t\t\t\tremove(\"importShadow\"),\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tlg := logutils.NewStderrLog(t.Name())\n\t\t\twr := newSettingsWrapper(lg, test.settings, nil)\n\n\t\t\twr.inferEnabledChecks()\n\n\t\t\tassert.ElementsMatch(t, test.expectedEnabledChecks, slices.Collect(maps.Keys(wr.inferredEnabledChecks)))\n\n\t\t\tassert.NoError(t, wr.validate())\n\t\t})\n\t}\n}\n\nfunc Test_settingsWrapper_Load(t *testing.T) {\n\ttestCases := []struct {\n\t\tname        string\n\t\tsettings    *config.GoCriticSettings\n\t\texpectedErr bool\n\t}{\n\t\t{\n\t\t\tname: \"combine enable-all and disable-all\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:  true,\n\t\t\t\tDisableAll: true,\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"combine enable-all and enabled-tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:   true,\n\t\t\t\tEnabledTags: []string{\"experimental\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"combine enable-all and enabled-checks\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:     true,\n\t\t\t\tEnabledChecks: []string{\"dupImport\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"combine disable-all and disabled-tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisableAll:   true,\n\t\t\t\tDisabledTags: []string{\"style\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"combine disable-all and disable-checks\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisableAll:     true,\n\t\t\t\tDisabledChecks: []string{\"appendAssign\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"disable-all and no one check enabled\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisableAll: true,\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"unknown enabled tag\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledTags: []string{\"diagnostic\", \"go-proverbs\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"unknown disabled tag\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledTags: []string{\"style\", \"go-proverbs\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"unknown enabled check\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks: []string{\"appendAssign\", \"noExitAfterDefer\", \"underef\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"unknown disabled check\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledChecks: []string{\"dupSubExpr\", \"noExitAfterDefer\", \"returnAfterHttpError\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"settings for unknown check\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tSettingsPerCheck: map[string]config.GoCriticCheckSettings{\n\t\t\t\t\t\"captLocall\":    {\"paramsOnly\": false},\n\t\t\t\t\t\"unnamedResult\": {\"checkExported\": true},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"settings for disabled check\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledChecks: []string{\"elseif\"},\n\t\t\t\tSettingsPerCheck: map[string]config.GoCriticCheckSettings{\n\t\t\t\t\t\"elseif\": {\"skipBalanced\": true},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedErr: false, // Just logging.\n\t\t},\n\t\t{\n\t\t\tname: \"settings by lower-cased checker name\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks: []string{\"tooManyResultsChecker\"},\n\t\t\t\tSettingsPerCheck: map[string]config.GoCriticCheckSettings{\n\t\t\t\t\t\"toomanyresultschecker\": {\"maxResults\": 3},\n\t\t\t\t\t\"unnamedResult\":         {\"checkExported\": true},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"enabled and disabled at one moment check\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledChecks:  []string{\"appendAssign\", \"codegenComment\", \"underef\"},\n\t\t\t\tDisabledChecks: []string{\"elseif\", \"underef\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"enabled and disabled at one moment tag\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledTags:  []string{\"performance\", \"style\"},\n\t\t\t\tDisabledTags: []string{\"style\", \"diagnostic\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"disable all checks via tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tDisabledTags: []string{\"diagnostic\", \"experimental\", \"opinionated\", \"performance\", \"style\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"enable-all and disable all checks via tags\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnableAll:    true,\n\t\t\t\tDisabledTags: []string{\"diagnostic\", \"experimental\", \"opinionated\", \"performance\", \"style\"},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"valid configuration\",\n\t\t\tsettings: &config.GoCriticSettings{\n\t\t\t\tEnabledTags:    []string{\"performance\"},\n\t\t\t\tDisabledChecks: []string{\"dupImport\", \"ifElseChain\", \"octalLiteral\", \"whyNoLint\"},\n\t\t\t\tSettingsPerCheck: map[string]config.GoCriticCheckSettings{\n\t\t\t\t\t\"hugeParam\":    {\"sizeThreshold\": 100},\n\t\t\t\t\t\"rangeValCopy\": {\"skipTestFuncs\": true},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedErr: false,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tlg := logutils.NewStderrLog(t.Name())\n\t\t\twr := newSettingsWrapper(lg, test.settings, nil)\n\n\t\t\terr := wr.Load()\n\t\t\tif test.expectedErr {\n\t\t\t\tif assert.Error(t, err) {\n\t\t\t\t\tt.Log(err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassert.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype Slicer []string\n\nfunc (s Slicer) add(toAdd ...string) Slicer {\n\treturn slices.Concat(s, toAdd)\n}\n\nfunc (s Slicer) remove(toRemove ...string) Slicer {\n\tresult := slices.Clone(s)\n\n\tfor _, v := range toRemove {\n\t\tif i := slices.Index(result, v); i != -1 {\n\t\t\tresult = slices.Delete(result, i, i+1)\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunc (s Slicer) uniq() Slicer {\n\treturn slices.Compact(slices.Sorted(slices.Values(s)))\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/fix/in/gocritic.go",
    "content": "//golangcitest:args -Egocritic\n//golangcitest:config_path testdata/gocritic-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport (\n\t\"strings\"\n)\n\nfunc gocritic() {\n\tvar xs [2048]byte\n\n\t// xs -> &xs\n\tfor _, x := range xs {\n\t\tprint(x)\n\t}\n\n\t// strings.Count(\"foo\", \"bar\") == 0 -> !strings.Contains(\"foo\", \"bar\")\n\tif strings.Count(\"foo\", \"bar\") == 0 {\n\t\tprint(\"qu\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/fix/out/gocritic.go",
    "content": "//golangcitest:args -Egocritic\n//golangcitest:config_path testdata/gocritic-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport (\n\t\"strings\"\n)\n\nfunc gocritic() {\n\tvar xs [2048]byte\n\n\t// xs -> &xs\n\tfor _, x := range &xs {\n\t\tprint(x)\n\t}\n\n\t// strings.Count(\"foo\", \"bar\") == 0 -> !strings.Contains(\"foo\", \"bar\")\n\tif !strings.Contains(\"foo\", \"bar\") {\n\t\tprint(\"qu\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/gocritic-fix.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gocritic:\n      enabled-checks:\n        - ruleguard\n      settings:\n        ruleguard:\n          failOn: dsl,import\n          rules: '${base-path}/ruleguard/rangeExprCopy.go,${base-path}/ruleguard/stringsSimplify.go'\n\nrun:\n  relative-path-mode: cfg\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/gocritic.go",
    "content": "//golangcitest:args -Egocritic\n//golangcitest:config_path testdata/gocritic.yml\npackage testdata\n\nimport (\n\t\"flag\"\n\t\"io\"\n\t\"log\"\n\t\"strings\"\n)\n\nvar _ = *flag.Bool(\"global1\", false, \"\") // want `flagDeref: immediate deref in \\*flag.Bool\\(.global1., false, ..\\) is most likely an error; consider using flag\\.BoolVar`\n\ntype size1 struct {\n\ta [12]bool\n}\n\ntype size2 struct {\n\tsize1\n\tb [12]bool\n}\n\nfunc gocriticAppendAssign() {\n\tvar positives, negatives []int\n\tpositives = append(negatives, 1)\n\tnegatives = append(negatives, -1)\n\tlog.Print(positives, negatives)\n}\n\nfunc gocriticDupSubExpr(x bool) {\n\tif x && x { // want \"dupSubExpr: suspicious identical LHS and RHS.*\"\n\t\tlog.Print(\"x is true\")\n\t}\n}\n\nfunc gocriticHugeParamSize1(ss size1) {\n\tlog.Print(ss)\n}\n\nfunc gocriticHugeParamSize2(ss size2) { // want \"hugeParam: ss is heavy \\\\(24 bytes\\\\); consider passing it by pointer\"\n\tlog.Print(ss)\n}\n\nfunc gocriticHugeParamSize2Ptr(ss *size2) {\n\tlog.Print(*ss)\n}\n\nfunc gocriticSwitchTrue() {\n\tswitch true {\n\tcase false:\n\t\tlog.Print(\"false\")\n\tdefault:\n\t\tlog.Print(\"default\")\n\t}\n}\n\nfunc goCriticPreferStringWriter(w interface {\n\tio.Writer\n\tio.StringWriter\n}) {\n\tw.Write([]byte(\"test\")) // want \"ruleguard: w\\\\.WriteString\\\\(\\\"test\\\"\\\\) should be preferred.*\"\n}\n\nfunc gocriticStringSimplify() {\n\ts := \"Most of the time, travellers worry about their luggage.\"\n\ts = strings.Replace(s, \",\", \"\", -1) // want \"ruleguard: this Replace call can be simplified.*\"\n\tlog.Print(s)\n}\n\nfunc gocriticRuleWrapperFunc() {\n\tstrings.Replace(\"abcabc\", \"a\", \"d\", -1) // want \"ruleguard: this Replace call can be simplified.*\"\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/gocritic.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gocritic:\n      disabled-checks:\n        - appendAssign\n        - switchTrue\n      enabled-checks:\n        - hugeParam\n        - ruleguard\n      settings:\n        hugeParam:\n          sizeThreshold: 24\n        ruleguard:\n          failOn: dsl,import\n          rules: '${base-path}/ruleguard/preferWriteString.go,${config-path}/ruleguard/stringsSimplify.go'\n\nrun:\n  relative-path-mode: cfg\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/gocritic_cgo.go",
    "content": "//golangcitest:args -Egocritic\n//golangcitest:config_path testdata/gocritic.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"flag\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nvar _ = *flag.Bool(\"global1\", false, \"\") // want `flagDeref: immediate deref in \\*flag.Bool\\(.global1., false, ..\\) is most likely an error; consider using flag\\.BoolVar`\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/gocritic_importShadow.go",
    "content": "//golangcitest:args -Egocritic\n//golangcitest:config_path testdata/gocritic_inportShadow.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n)\n\nfunc Bar() {\n\tfilepath.Join(\"a\", \"b\")\n}\n\nfunc foo() {\n\tfilepath := \"foo.txt\" // want \"importShadow: shadow of imported package 'filepath'\"\n\tfmt.Printf(\"File path: %s\\n\", filepath)\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/gocritic_inportShadow.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gocritic:\n      disable-all: true\n      enabled-checks:\n        - importShadow\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/ruleguard/README.md",
    "content": "This directory contains ruleguard files that are used in functional tests.\n\nHelpful:\n\n- https://go-critic.com/overview.html\n- https://github.com/go-critic/go-critic/blob/HEAD/checkers/rules/rules.go\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/ruleguard/preferWriteString.go",
    "content": "//go:build ruleguard\n\npackage ruleguard\n\nimport \"github.com/quasilyte/go-ruleguard/dsl\"\n\nfunc preferWriteString(m dsl.Matcher) {\n\tm.Match(`$w.Write([]byte($s))`).\n\t\tWhere(m[\"w\"].Type.Implements(\"io.StringWriter\")).\n\t\tSuggest(\"$w.WriteString($s)\").\n\t\tReport(`$w.WriteString($s) should be preferred to the $$`)\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/ruleguard/rangeExprCopy.go",
    "content": "//go:build ruleguard\n\npackage ruleguard\n\nimport (\n\t\"github.com/quasilyte/go-ruleguard/dsl\"\n)\n\nfunc rangeExprCopy(m dsl.Matcher) {\n\tm.Match(`for _, $_ := range $x { $*_ }`, `for _, $_ = range $x { $*_ }`).\n\t\tWhere(m[\"x\"].Addressable && m[\"x\"].Type.Size >= 512).\n\t\tReport(`$x copy can be avoided with &$x`).\n\t\tAt(m[\"x\"]).\n\t\tSuggest(`&$x`)\n}\n"
  },
  {
    "path": "pkg/golinters/gocritic/testdata/ruleguard/stringsSimplify.go",
    "content": "//go:build ruleguard\n\npackage ruleguard\n\nimport \"github.com/quasilyte/go-ruleguard/dsl\"\n\nfunc stringsSimplify(m dsl.Matcher) {\n\t// Some issues have simple fixes that can be expressed as\n\t// a replacement pattern. Rules can use Suggest() function\n\t// to add a quickfix action for such issues.\n\tm.Match(`strings.Replace($s, $old, $new, -1)`).\n\t\tReport(`this Replace call can be simplified`).\n\t\tSuggest(`strings.ReplaceAll($s, $old, $new)`)\n\n\t// Suggest() can be used without Report().\n\t// It'll print the suggested template to the user.\n\tm.Match(`strings.Count($s1, $s2) == 0`).\n\t\tSuggest(`!strings.Contains($s1, $s2)`)\n}\n"
  },
  {
    "path": "pkg/golinters/gocyclo/gocyclo.go",
    "content": "package gocyclo\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/fzipp/gocyclo\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"gocyclo\"\n\nfunc New(settings *config.GoCycloSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Computes and checks the cyclomatic complexity of functions\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues := runGoCyclo(pass, settings)\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runGoCyclo(pass *analysis.Pass, settings *config.GoCycloSettings) []*goanalysis.Issue {\n\tvar stats gocyclo.Stats\n\tfor _, f := range pass.Files {\n\t\tstats = gocyclo.AnalyzeASTFile(f, pass.Fset, stats)\n\t}\n\tif len(stats) == 0 {\n\t\treturn nil\n\t}\n\n\tstats = stats.SortAndFilter(-1, settings.MinComplexity)\n\n\tissues := make([]*goanalysis.Issue, 0, len(stats))\n\n\tfor _, s := range stats {\n\t\ttext := fmt.Sprintf(\"cyclomatic complexity %d of func %s is high (> %d)\",\n\t\t\ts.Complexity, internal.FormatCode(s.FuncName), settings.MinComplexity)\n\n\t\tissues = append(issues, goanalysis.NewIssue(&result.Issue{\n\t\t\tPos:        s.Pos,\n\t\t\tText:       text,\n\t\t\tFromLinter: linterName,\n\t\t}, pass))\n\t}\n\n\treturn issues\n}\n"
  },
  {
    "path": "pkg/golinters/gocyclo/gocyclo_integration_test.go",
    "content": "package gocyclo\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gocyclo/testdata/gocyclo.go",
    "content": "//golangcitest:args -Egocyclo\n//golangcitest:config_path testdata/gocyclo.yml\npackage testdata\n\nimport \"net/http\"\n\nfunc GocycloBigComplexity(s string) { // want \"cyclomatic complexity .* of func .* is high .*\"\n\tif s == http.MethodGet || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gocyclo/testdata/gocyclo.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gocyclo:\n      min-complexity: 20\n"
  },
  {
    "path": "pkg/golinters/gocyclo/testdata/gocyclo_cgo.go",
    "content": "//golangcitest:args -Egocyclo\n//golangcitest:config_path testdata/gocyclo.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"net/http\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(s string) { // want \"cyclomatic complexity .* of func .* is high .*\"\n\tif s == http.MethodGet || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/godoclint/godoclint.go",
    "content": "package godoclint\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"slices\"\n\n\tglcompose \"github.com/godoc-lint/godoc-lint/pkg/compose\"\n\tglconfig \"github.com/godoc-lint/godoc-lint/pkg/config\"\n\t\"github.com/godoc-lint/godoc-lint/pkg/model\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.GodoclintSettings) *goanalysis.Linter {\n\tvar pcfg glconfig.PlainConfig\n\n\tif settings != nil {\n\t\terr := checkSettings(settings)\n\t\tif err != nil {\n\t\t\tinternal.LinterLogger.Fatalf(\"godoclint: %v\", err)\n\t\t}\n\n\t\t// The following options are explicitly ignored: they must be handled globally with exclusions or nolint directives.\n\t\t// - Include\n\t\t// - Exclude\n\n\t\t// The following options are explicitly ignored: these options cannot work as expected because the global configuration about tests.\n\t\t// - Options.MaxLenIncludeTests\n\t\t// - Options.PkgDocIncludeTests\n\t\t// - Options.SinglePkgDocIncludeTests\n\t\t// - Options.RequirePkgDocIncludeTests\n\t\t// - Options.RequireDocIncludeTests\n\t\t// - Options.StartWithNameIncludeTests\n\t\t// - Options.NoUnusedLinkIncludeTests\n\t\t// - Options.RequireStdlibDoclinkIncludeTests\n\n\t\t// Also, Options.MaxLenIgnorePatterns is ignored because the Golangci-lint's idiomatic way to ignore such issues\n\t\t// is exclusion by source text patterns.\n\n\t\tpcfg = glconfig.PlainConfig{\n\t\t\tDefault: settings.Default,\n\t\t\tEnable:  settings.Enable,\n\t\t\tDisable: settings.Disable,\n\t\t\tOptions: &glconfig.PlainRuleOptions{\n\t\t\t\tMaxLenLength:                     settings.Options.MaxLen.Length,\n\t\t\t\tMaxLenIncludeTests:               pointer(true),\n\t\t\t\tMaxLenIgnorePatterns:             []string{`^\\+kubebuilder:`},\n\t\t\t\tPkgDocIncludeTests:               pointer(false),\n\t\t\t\tSinglePkgDocIncludeTests:         pointer(true),\n\t\t\t\tRequirePkgDocIncludeTests:        pointer(false),\n\t\t\t\tRequireDocIncludeTests:           pointer(true),\n\t\t\t\tRequireDocIgnoreExported:         settings.Options.RequireDoc.IgnoreExported,\n\t\t\t\tRequireDocIgnoreUnexported:       settings.Options.RequireDoc.IgnoreUnexported,\n\t\t\t\tStartWithNameIncludeTests:        pointer(false),\n\t\t\t\tStartWithNameIncludeUnexported:   settings.Options.StartWithName.IncludeUnexported,\n\t\t\t\tRequireStdlibDoclinkIncludeTests: pointer(true),\n\t\t\t\tNoUnusedLinkIncludeTests:         pointer(true),\n\t\t\t},\n\t\t}\n\n\t\tif err := pcfg.Validate(); err != nil {\n\t\t\tinternal.LinterLogger.Fatalf(\"godoclint: %v\", err)\n\t\t}\n\t}\n\n\tcomposition := glcompose.Compose(glcompose.CompositionConfig{\n\t\tBaseDirPlainConfig: &pcfg,\n\t\tExitFunc: func(_ int, err error) {\n\t\t\tinternal.LinterLogger.Errorf(\"godoclint: %v\", err)\n\t\t},\n\t})\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(composition.Analyzer.GetAnalyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc checkSettings(settings *config.GodoclintSettings) error {\n\tswitch deref(settings.Default) {\n\tcase string(model.DefaultSetAll):\n\t\tif len(settings.Enable) > 0 {\n\t\t\treturn errors.New(\"cannot use 'enable' with 'default=all'\")\n\t\t}\n\n\tcase string(model.DefaultSetNone):\n\t\tif len(settings.Disable) > 0 {\n\t\t\treturn errors.New(\"cannot use 'disable' with 'default=none'\")\n\t\t}\n\n\tdefault:\n\t\tfor _, rule := range settings.Enable {\n\t\t\tif slices.Contains(settings.Disable, rule) {\n\t\t\t\treturn fmt.Errorf(\"a rule cannot be enabled and disabled at the same time: '%s'\", rule)\n\t\t\t}\n\t\t}\n\n\t\tfor _, rule := range settings.Disable {\n\t\t\tif slices.Contains(settings.Enable, rule) {\n\t\t\t\treturn fmt.Errorf(\"a rule cannot be enabled and disabled at the same time: '%s'\", rule)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc pointer[T any](v T) *T { return &v }\n\nfunc deref[T any](v *T) T {\n\tif v == nil {\n\t\tvar zero T\n\t\treturn zero\n\t}\n\n\treturn *v\n}\n"
  },
  {
    "path": "pkg/golinters/godoclint/godoclint_integration_test.go",
    "content": "package godoclint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/godoclint/testdata/godoclint.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    godoclint:\n      default: none\n      enable:\n        - pkg-doc\n        - require-pkg-doc\n        - start-with-name\n        - require-doc\n        - deprecated\n        - max-len\n        - no-unused-link\n        - require-stdlib-doclink\n      options:\n        start-with-name:\n          include-unexported: true\n        require-doc:\n          ignore-exported: false\n          ignore-unexported: false\n        max-len:\n          length: 127\n"
  },
  {
    "path": "pkg/golinters/godoclint/testdata/godoclint_default_fail.go",
    "content": "//golangcitest:args -Egodoclint\n\n// bad godoc // want `package godoc should start with \"Package testdata \"`\npackage testdata\n\n// This is a special stdlib import because the package itself has issues that\n// godoclint can, but must not, detect.\nimport \"go/ast\"\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooType\"\\)`\ntype FooType struct{}\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooAlias\"\\)`\ntype FooAlias = ast.Comment\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooConst\"\\)`\nconst FooConst = 1\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooVar\"\\)`\nvar FooVar = 1\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooFunc\"\\)`\nfunc FooFunc() {}\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooFunc\"\\)`\nfunc (FooType) FooFunc() {}\n\n// DeprecatedConstA is... // want `deprecation note should be formatted as \"Deprecated: \"`\n//\n// DEPRECATED: do not use\nconst DeprecatedConstA = 1\n\n// DeprecatedConstB is... // want `deprecation note should be formatted as \"Deprecated: \"`\n//\n// DEPRECATED:do not use\nconst DeprecatedConstB = 1\n\n// DeprecatedConstC is... // want `deprecation note should be formatted as \"Deprecated: \"`\n//\n// deprecated:do not use\nconst DeprecatedConstC = 1\n"
  },
  {
    "path": "pkg/golinters/godoclint/testdata/godoclint_default_pass.go",
    "content": "//golangcitest:args -Egodoclint\n//golangcitest:expected_exitcode 0\n\n// Package testdata has good godoc.\npackage testdata\n\n// This is a special stdlib import because the package itself has issues that\n// godoclint can, but must not, detect.\nimport \"go/ast\"\n\n// FooType is a type.\ntype FooType struct{}\n\n// FooAlias is an alias.\ntype FooAlias = ast.Comment\n\n// FooConst is a constant.\nconst FooConst = 1\n\n// FooVar is a variable.\nvar FooVar = 1\n\n// FooFunc is a function.\nfunc FooFunc() {}\n\n// FooFunc is a method.\nfunc (FooType) FooFunc() {}\n\n// bad godoc on unexported symbol\ntype fooType struct{}\n\n// bad godoc on unexported symbol\ntype fooAlias = ast.Comment\n\n// bad godoc on unexported symbol\nconst fooConst = 1\n\n// bad godoc on unexported symbol\nvar fooVar = 1\n\n// bad godoc on unexported symbol\nfunc fooFunc() {}\n\n// bad godoc on unexported symbol\nfunc (FooType) fooFunc() {}\n\n// DeprecatedConstA is...\n//\n// Deprecated: do not use\nconst DeprecatedConstA = 1\n\n// Deprecated: do not use\nconst DeprecatedConstB = 1\n\n// deprecatedConstC is...\n//\n// DEPRECATED: invalid deprecation note but okay since the symbol is not exported\nconst deprecatedConstC = 1\n\n// constWithStdlibDoclink has a potential doc link to encoding/json.Encoder but\n// should be ignored since the rule is not enabled by default.\nconst constWithStdlibDoclink = 1\n"
  },
  {
    "path": "pkg/golinters/godoclint/testdata/godoclint_full_fail.go",
    "content": "//golangcitest:args -Egodoclint\n//golangcitest:config_path testdata/godoclint.yml\n\n// Asserting rule \"pkg-doc\"\n\n// bad godoc // want `package godoc should start with \"Package testdata \"`\npackage testdata\n\n// This is a special stdlib import because the package itself has issues that\n// godoclint can, but must not, detect.\nimport \"go/ast\"\n\n// Asserting rule \"start-with-name\"\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooType\"\\)`\ntype FooType struct{}\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooAlias\"\\)`\ntype FooAlias = ast.Comment\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooConst\"\\)`\nconst FooConst = 1\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooVar\"\\)`\nvar FooVar = 1\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooFunc\"\\)`\nfunc FooFunc() {}\n\n// bad godoc // want `godoc should start with symbol name \\(\"FooFunc\"\\)`\nfunc (FooType) FooFunc() {}\n\n// bad godoc // want `godoc should start with symbol name \\(\"fooType\"\\)`\ntype fooType struct{}\n\n// bad godoc // want `godoc should start with symbol name \\(\"fooAlias\"\\)`\ntype fooAlias = ast.Comment\n\n// bad godoc // want `godoc should start with symbol name \\(\"fooConst\"\\)`\nconst fooConst = 1\n\n// bad godoc // want `godoc should start with symbol name \\(\"fooVar\"\\)`\nvar fooVar = 1\n\n// bad godoc // want `godoc should start with symbol name \\(\"fooFunc\"\\)`\nfunc fooFunc() {}\n\n// bad godoc // want `godoc should start with symbol name \\(\"fooFunc\"\\)`\nfunc (FooType) fooFunc() {}\n\n// Asserting rule \"require-doc\"\n\n// The //foo:bar directives mark the trailing comment as a directive so they're\n// not parsed as a normal trailing comment group.\n\ntype BarType struct{} //foo:bar // want `symbol should have a godoc \\(\"BarType\"\\)`\n\ntype BarAlias = ast.Comment //foo:bar // want `symbol should have a godoc \\(\"BarAlias\"\\)`\n\nconst BarConst = 1 //foo:bar // want `symbol should have a godoc \\(\"BarConst\"\\)`\n\nvar BarVar = 1 //foo:bar // want `symbol should have a godoc \\(\"BarVar\"\\)`\n\nfunc BarFunc() {} //foo:bar // want `symbol should have a godoc \\(\"BarFunc\"\\)`\n\nfunc (BarType) BarFunc() {} //foo:bar // want `symbol should have a godoc \\(\"BarFunc\"\\)`\n\ntype barType struct{} //foo:bar // want `symbol should have a godoc \\(\"barType\"\\)`\n\ntype barAlias = ast.Comment //foo:bar // want `symbol should have a godoc \\(\"barAlias\"\\)`\n\nconst barConst = 1 //foo:bar // want `symbol should have a godoc \\(\"barConst\"\\)`\n\nvar barVar = 1 //foo:bar // want `symbol should have a godoc \\(\"barVar\"\\)`\n\nfunc barFunc() {} //foo:bar // want `symbol should have a godoc \\(\"barFunc\"\\)`\n\nfunc (BarType) barFunc() {} //foo:bar // want `symbol should have a godoc \\(\"barFunc\"\\)`\n\n// Asserting rule \"no-unused-link\"\n\n// constWithUnusedLink point to [used] and unused links. // want `godoc has unused link \\(\"unused\"\\)`\n//\n// [used]: https://example.com\n//\n// [unused]: https://example.com\nconst constWithUnusedLink = 1\n\n// Asserting rule \"max-len\"\n\n// constWithTooLongGodoc has a very long godoc that exceeds the maximum allowed length for godoc comments in this test setup. // want `godoc line is too long \\(169 > 127\\)`\nconst constWithTooLongGodoc = 1\n\n// DeprecatedConstA is... // want `deprecation note should be formatted as \"Deprecated: \"`\n//\n// DEPRECATED: do not use\nconst DeprecatedConstA = 1\n\n// DeprecatedConstB is... // want `deprecation note should be formatted as \"Deprecated: \"`\n//\n// DEPRECATED:do not use\nconst DeprecatedConstB = 1\n\n// DeprecatedConstC is... // want `deprecation note should be formatted as \"Deprecated: \"`\n//\n// deprecated:do not use\nconst DeprecatedConstC = 1\n\n// constWithStdlibDoclink has a potential doc link to encoding/json.Encoder. // want `text \"encoding/json\\.Encoder\" should be replaced with \"\\[encoding/json\\.Encoder\\]\" to link to stdlib type`\n//\n//godoclint:disable max-len\nconst constWithStdlibDoclink = 1\n"
  },
  {
    "path": "pkg/golinters/godoclint/testdata/godoclint_full_pass.go",
    "content": "//golangcitest:args -Egodoclint\n//golangcitest:config_path testdata/godoclint.yml\n//golangcitest:expected_exitcode 0\n\n// Asserting rule \"pkg-doc\" and \"require-pkg-doc\" since the package has a godoc.\n\n// Package testdata\npackage testdata\n\n// This is a special stdlib import because the package itself has issues that\n// godoclint can, but must not, detect.\nimport \"go/ast\"\n\n// Asserting rule \"start-with-name\" and \"require-doc\" (since all have godocs)\n\n// FooType is...\ntype FooType struct{}\n\n// FooAlias is...\ntype FooAlias = ast.Comment\n\n// FooConst is...\nconst FooConst = 1\n\n// FooVar is...\nvar FooVar = 1\n\n// FooFunc is...\nfunc FooFunc() {}\n\n// FooFunc is...\nfunc (FooType) FooFunc() {}\n\n// fooType is...\ntype fooType struct{}\n\n// fooAlias is...\ntype fooAlias = ast.Comment\n\n// fooConst is...\nconst fooConst = 1\n\n// fooVar is...\nvar fooVar = 1\n\n// fooFunc is...\nfunc fooFunc() {}\n\n// fooFunc is...\nfunc (FooType) fooFunc() {}\n\n// Asserting rule \"no-unused-link\"\n\n// constWithUnusedLink point to a [used] link and has no unused one.\n//\n// [used]: https://example.com\nconst constWithUnusedLink = 1\n\n// Asserting rule \"max-len\"\n\n// constWithTooLongGodoc has a very long godoc that does not exceed the maximum allowed length for godoc comments.\nconst constWithTooLongGodoc = 1\n\n// DeprecatedConstA is...\n//\n// Deprecated: do not use\nconst DeprecatedConstA = 1\n\n// Deprecated: do not use\nconst DeprecatedConstB = 1\n\n// deprecatedConstC is...\n//\n// DEPRECATED: invalid deprecation note but okay since the symbol is not exported\nconst deprecatedConstC = 1\n\n// constWithStdlibDoclink has a doc link to [encoding/json.Encoder].\nconst constWithStdlibDoclink = 1\n"
  },
  {
    "path": "pkg/golinters/godoclint/testdata/godoclint_full_pass_test.go",
    "content": "//golangcitest:args -Egodoclint\n//golangcitest:config_path testdata/godoclint.yml\n//golangcitest:expected_exitcode 0\n\n// Asserting rule \"pkg-doc\" and \"require-pkg-doc\" since the package has a godoc.\n\n// Package testdata\npackage testdata\n\n// This is a special stdlib import because the package itself has issues that\n// godoclint can, but must not, detect.\nimport \"go/ast\"\n\n// Asserting rule \"start-with-name\" and \"require-doc\" (since all have godocs)\n\n// FooType is...\ntype FooType struct{}\n\n// FooAlias is...\ntype FooAlias = ast.Comment\n\n// FooConst is...\nconst FooConst = 1\n\n// FooVar is...\nvar FooVar = 1\n\n// FooFunc is...\nfunc FooFunc() {}\n\n// FooFunc is...\nfunc (FooType) FooFunc() {}\n\n// fooType is...\ntype fooType struct{}\n\n// fooAlias is...\ntype fooAlias = ast.Comment\n\n// fooConst is...\nconst fooConst = 1\n\n// fooVar is...\nvar fooVar = 1\n\n// fooFunc is...\nfunc fooFunc() {}\n\n// fooFunc is...\nfunc (FooType) fooFunc() {}\n\n// Asserting rule \"no-unused-link\"\n\n// constWithUnusedLink point to a [used] link and has no unused one.\n//\n// [used]: https://example.com\nconst constWithUnusedLink = 1\n\n// Asserting rule \"max-len\"\n\n// constWithTooLongGodoc has a very long godoc that does not exceed the maximum allowed length for godoc comments.\nconst constWithTooLongGodoc = 1\n\n// DeprecatedConstA is...\n//\n// Deprecated: do not use\nconst DeprecatedConstA = 1\n\n// Deprecated: do not use\nconst DeprecatedConstB = 1\n\n// constWithStdlibDoclink has a doc link to [encoding/json.Encoder].\nconst constWithStdlibDoclink = 1\n"
  },
  {
    "path": "pkg/golinters/godot/godot.go",
    "content": "package godot\n\nimport (\n\t\"cmp\"\n\n\t\"github.com/tetafro/godot\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.GodotSettings) *goanalysis.Linter {\n\tvar dotSettings godot.Settings\n\n\tif settings != nil {\n\t\tdotSettings = godot.Settings{\n\t\t\tScope:   godot.Scope(settings.Scope),\n\t\t\tExclude: settings.Exclude,\n\t\t\tPeriod:  settings.Period,\n\t\t\tCapital: settings.Capital,\n\t\t}\n\t}\n\n\tdotSettings.Scope = cmp.Or(dotSettings.Scope, godot.DeclScope)\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"godot\",\n\t\t\tDoc:  \"Check if comments end in a period\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\terr := runGodot(pass, dotSettings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runGodot(pass *analysis.Pass, settings godot.Settings) error {\n\tfor _, file := range pass.Files {\n\t\tiss, err := godot.Run(file, pass.Fset, settings)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif len(iss) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tf := pass.Fset.File(file.Pos())\n\n\t\tfor _, i := range iss {\n\t\t\tstart := f.Pos(i.Pos.Offset)\n\t\t\tend := goanalysis.EndOfLinePos(f, i.Pos.Line)\n\n\t\t\tpass.Report(analysis.Diagnostic{\n\t\t\t\tPos:     start,\n\t\t\t\tEnd:     end,\n\t\t\t\tMessage: i.Message,\n\t\t\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\tPos:     start,\n\t\t\t\t\t\tEnd:     end,\n\t\t\t\t\t\tNewText: []byte(i.Replacement),\n\t\t\t\t\t}},\n\t\t\t\t}},\n\t\t\t})\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/godot/godot_integration_test.go",
    "content": "package godot\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/godot/testdata/fix/in/godot.go",
    "content": "//golangcitest:args -Egodot\n//golangcitest:expected_exitcode 0\npackage p\n\n/*\nThis comment won't be checked in default mode\n*/\n\n// This comment will be fixed\nfunc godot(a, b int) int {\n\t// Nothing to do here\n\treturn a + b\n}\n\n// Foo Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n// Aenean rhoncus odio enim, et pulvinar libero ultrices quis.\n// Nulla at erat tellus. Maecenas id dapibus velit, ut porttitor ipsum\nfunc Foo() {\n\t// nothing to do here\n}\n"
  },
  {
    "path": "pkg/golinters/godot/testdata/fix/out/godot.go",
    "content": "//golangcitest:args -Egodot\n//golangcitest:expected_exitcode 0\npackage p\n\n/*\nThis comment won't be checked in default mode\n*/\n\n// This comment will be fixed.\nfunc godot(a, b int) int {\n\t// Nothing to do here\n\treturn a + b\n}\n\n// Foo Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n// Aenean rhoncus odio enim, et pulvinar libero ultrices quis.\n// Nulla at erat tellus. Maecenas id dapibus velit, ut porttitor ipsum.\nfunc Foo() {\n\t// nothing to do here\n}\n"
  },
  {
    "path": "pkg/golinters/godot/testdata/godot.go",
    "content": "//golangcitest:args -Egodot\npackage testdata\n\n// want +2 \"Comment should end in a period\"\n\n// Godot checks top-level comments\nfunc Godot() {\n\t// nothing to do here\n}\n\n// want +4 \"Comment should end in a period\"\n\n// Foo Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n// Aenean rhoncus odio enim, et pulvinar libero ultrices quis.\n// Nulla at erat tellus. Maecenas id dapibus velit, ut porttitor ipsum\nfunc Foo() {\n\t// nothing to do here\n}\n"
  },
  {
    "path": "pkg/golinters/godot/testdata/godot_cgo.go",
    "content": "//golangcitest:args -Egodot\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n// want +2 \"Comment should end in a period\"\n\n// Godot checks top-level comments\nfunc Godot() {\n\t// nothing to do here\n}\n"
  },
  {
    "path": "pkg/golinters/godox/godox.go",
    "content": "package godox\n\nimport (\n\t\"go/token\"\n\t\"strings\"\n\n\t\"github.com/matoous/godox\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.GodoxSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"godox\",\n\t\t\tDoc:  \"Detects usage of FIXME, TODO and other keywords inside comments\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\treturn run(pass, settings), nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc run(pass *analysis.Pass, settings *config.GodoxSettings) error {\n\tfor _, file := range pass.Files {\n\t\tposition, isGoFile := goanalysis.GetGoFilePosition(pass, file)\n\t\tif !isGoFile {\n\t\t\tcontinue\n\t\t}\n\n\t\tmessages, err := godox.Run(file, pass.Fset, settings.Keywords...)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif len(messages) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tnonAdjPosition := pass.Fset.PositionFor(file.Pos(), false)\n\n\t\tft := pass.Fset.File(file.Pos())\n\n\t\tfor _, i := range messages {\n\t\t\tmsg := strings.TrimRight(i.Message, \"\\n\")\n\n\t\t\t// https://github.com/matoous/godox/blob/1d6ac9d899726279072e1c4d2b10f1eb52f22878/godox.go#L56\n\t\t\tindex := strings.Index(msg, \"Line contains\")\n\n\t\t\tpass.Report(analysis.Diagnostic{\n\t\t\t\tPos:     ft.LineStart(goanalysis.AdjustPos(i.Pos.Line, nonAdjPosition.Line, position.Line)) + token.Pos(i.Pos.Column),\n\t\t\t\tMessage: msg[index:],\n\t\t\t})\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/godox/godox_integration_test.go",
    "content": "package godox\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/godox/testdata/godox.go",
    "content": "//golangcitest:args -Egodox\n//golangcitest:config_path testdata/godox.yml\npackage testdata\n\nfunc todoLeftInCode() {\n\t// TODO implement me // want `Line contains FIXME/TODO: \"TODO implement me`\n\t//TODO no space // want `Line contains FIXME/TODO: \"TODO no space`\n\t// TODO(author): 123 // want `Line contains FIXME/TODO: \"TODO\\(author\\): 123`\n\t//TODO(author): 123 // want `Line contains FIXME/TODO: \"TODO\\(author\\): 123`\n\t//TODO(author) 456 // want `Line contains FIXME/TODO: \"TODO\\(author\\) 456`\n\t// TODO: qwerty // want `Line contains FIXME/TODO: \"TODO: qwerty`\n\t// todo 789 // want `Line contains FIXME/TODO: \"todo 789`\n}\n"
  },
  {
    "path": "pkg/golinters/godox/testdata/godox.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    godox:\n      keywords:\n        - FIXME\n        - TODO\n"
  },
  {
    "path": "pkg/golinters/godox/testdata/godox_cgo.go",
    "content": "//golangcitest:args -Egodox\n//golangcitest:config_path testdata/godox.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc todoLeftInCode() {\n\t// TODO implement me // want `Line contains FIXME/TODO: \"TODO implement me`\n\t//TODO no space // want `Line contains FIXME/TODO: \"TODO no space`\n\t// TODO(author): 123 // want `Line contains FIXME/TODO: \"TODO\\(author\\): 123`\n\t//TODO(author): 123 // want `Line contains FIXME/TODO: \"TODO\\(author\\): 123`\n\t//TODO(author) 456 // want `Line contains FIXME/TODO: \"TODO\\(author\\) 456`\n\t// TODO: qwerty // want `Line contains FIXME/TODO: \"TODO: qwerty`\n\t// todo 789 // want `Line contains FIXME/TODO: \"todo 789`\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/gofmt.go",
    "content": "package gofmt\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\tgofmtbase \"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofmt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.GoFmtSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(\n\t\t\tgoformatters.NewAnalyzer(\n\t\t\t\tinternal.LinterLogger.Child(gofmtbase.Name),\n\t\t\t\t\"Check if the code is formatted according to 'gofmt' command.\",\n\t\t\t\tgofmtbase.New(settings),\n\t\t\t),\n\t\t).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/gofmt_integration_test.go",
    "content": "package gofmt\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/fix/in/gofmt.go",
    "content": "//golangcitest:config_path testdata/gofmt.yml\n//golangcitest:expected_exitcode 0\npackage p\n\n func gofmt(a, b int) int {\n \tif a != b {\n \t\treturn 1 \n\t}\n \treturn 2\n}"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/fix/in/gofmt_rewrite_rules.go",
    "content": "//golangcitest:config_path testdata/gofmt_rewrite_rules.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc GofmtRewriteRule() {\n\tvalues := make([]int, 0)\n\n\tvalues = append(values, 1)\n\tvalues = append(values, 2)\n\tvalues = append(values, 3)\n\n\tslice := values[1:len(values)]\n\n\tfmt.Println(slice)\n}\n\nfunc GofmtRewriteRule2() {\n\tvar to interface{}\n\n\tfmt.Println(to)\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/fix/out/gofmt.go",
    "content": "//golangcitest:config_path testdata/gofmt.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nfunc gofmt(a, b int) int {\n\tif a != b {\n\t\treturn 1\n\t}\n\treturn 2\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/fix/out/gofmt_rewrite_rules.go",
    "content": "//golangcitest:config_path testdata/gofmt_rewrite_rules.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc GofmtRewriteRule() {\n\tvalues := make([]int, 0)\n\n\tvalues = append(values, 1)\n\tvalues = append(values, 2)\n\tvalues = append(values, 3)\n\n\tslice := values[1:]\n\n\tfmt.Println(slice)\n}\n\nfunc GofmtRewriteRule2() {\n\tvar to any\n\n\tfmt.Println(to)\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt.go",
    "content": "//golangcitest:config_path testdata/gofmt.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc GofmtNotSimplified() {\n\tvar x []string\n\tfmt.Print(x[1:len(x)]) // want \"File is not properly formatted\"\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gofmt\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt_cgo.go",
    "content": "//golangcitest:config_path testdata/gofmt.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc GofmtNotSimplified() {\n\tvar x []string\n\tfmt.Print(x[1:len(x)]) // want \"File is not properly formatted\"\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt_no_simplify.go",
    "content": "//golangcitest:config_path testdata/gofmt_no_simplify.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc GofmtNotSimplifiedOk() {\n\tvar x []string\n\tfmt.Print(x[1:len(x)])\n}\n\nfunc GofmtBadFormat(){  // want \"File is not properly formatted\"\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt_no_simplify.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gofmt\n  settings:\n    gofmt:\n      simplify: false\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt_rewrite_rules.go",
    "content": "//golangcitest:config_path testdata/gofmt_rewrite_rules.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc GofmtRewriteRule() {\n\tvals := make([]int, 0)\n\n\tvals = append(vals, 1)\n\tvals = append(vals, 2)\n\tvals = append(vals, 3)\n\n\tslice := vals[1:len(vals)] // want \"File is not properly formatted\"\n\n\tfmt.Println(slice)\n}\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt_rewrite_rules.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gofmt\n  settings:\n    gofmt:\n      rewrite-rules:\n        - pattern: 'interface{}'\n          replacement: 'any'\n        - pattern: 'a[b:len(a)]'\n          replacement: 'a[b:]'\n"
  },
  {
    "path": "pkg/golinters/gofmt/testdata/gofmt_too_many_empty_lines.go",
    "content": "//golangcitest:config_path testdata/gofmt.yml\npackage testdata\n\nimport \"fmt\"\n\n// want +4 \"File is not properly formatted\"\nfunc _() {\n\tfmt.Println(\"foo\")\n}\n\n"
  },
  {
    "path": "pkg/golinters/gofumpt/gofumpt.go",
    "content": "package gofumpt\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\tgofumptbase \"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofumpt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.GoFumptSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(\n\t\t\tgoformatters.NewAnalyzer(\n\t\t\t\tinternal.LinterLogger.Child(gofumptbase.Name),\n\t\t\t\t\"Check if code and import statements are formatted, with additional rules.\",\n\t\t\t\tgofumptbase.New(settings, settings.LangVersion),\n\t\t\t),\n\t\t).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/gofumpt_integration_test.go",
    "content": "package gofumpt\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/fix/in/gofumpt.go",
    "content": "//golangcitest:config_path testdata/gofumpt-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc GofmtNotExtra(bar string, baz string) {\n\tfmt.Print(bar, baz)\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/fix/in/gofumpt_cgo.go",
    "content": "//golangcitest:config_path testdata/gofumpt-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport \"fmt\"\n\nfunc GofmtNotExtra(bar string, baz string) {\n\tfmt.Print(bar, baz)\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/fix/out/gofumpt.go",
    "content": "//golangcitest:config_path testdata/gofumpt-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc GofmtNotExtra(bar, baz string) {\n\tfmt.Print(bar, baz)\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/fix/out/gofumpt_cgo.go",
    "content": "//golangcitest:config_path testdata/gofumpt-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport \"fmt\"\n\nfunc GofmtNotExtra(bar, baz string) {\n\tfmt.Print(bar, baz)\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/gofumpt-fix.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gofumpt\n  settings:\n    gofumpt:\n      extra-rules: true\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/gofumpt.go",
    "content": "//golangcitest:config_path testdata/gofumpt.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc GofumptNewLine() {\n\tfmt.Println( \"foo\" ) // want \"File is not properly formatted\"\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/gofumpt.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gofumpt\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/gofumpt_cgo.go",
    "content": "//golangcitest:config_path testdata/gofumpt.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc GofumptNewLine() {\n\tfmt.Println( \"foo\" ) // want \"File is not properly formatted\"\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/gofumpt_too_many_empty_lines.go",
    "content": "//golangcitest:config_path testdata/gofumpt.yml\npackage testdata\n\nimport \"fmt\"\n\n// want +4 \"File is not properly formatted\"\nfunc _() {\n\tfmt.Println(\"foo\")\n}\n\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/gofumpt_with_extra.go",
    "content": "//golangcitest:config_path testdata/gofumpt_with_extra.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc GofmtNotExtra(bar string, baz string) { // want \"File is not properly formatted\"\n\tfmt.Print(\"foo\")\n}\n"
  },
  {
    "path": "pkg/golinters/gofumpt/testdata/gofumpt_with_extra.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gofumpt\n  settings:\n    gofumpt:\n      extra-rules: true\n"
  },
  {
    "path": "pkg/golinters/goheader/goheader.go",
    "content": "package goheader\n\nimport (\n\t\"go/token\"\n\t\"strings\"\n\n\tgoheader \"github.com/denis-tingaikin/go-header\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nconst linterName = \"goheader\"\n\nfunc New(settings *config.GoHeaderSettings, replacer *strings.Replacer) *goanalysis.Linter {\n\tconf := &goheader.Configuration{}\n\tif settings != nil {\n\t\tconf = &goheader.Configuration{\n\t\t\tValues:       settings.Values,\n\t\t\tTemplate:     settings.Template,\n\t\t\tTemplatePath: replacer.Replace(settings.TemplatePath),\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Check if file header matches to pattern\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\terr := runGoHeader(pass, conf)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runGoHeader(pass *analysis.Pass, conf *goheader.Configuration) error {\n\tif conf.TemplatePath == \"\" && conf.Template == \"\" {\n\t\t// User did not pass template, so then do not run go-header linter\n\t\treturn nil\n\t}\n\n\ttemplate, err := conf.GetTemplate()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvalues, err := conf.GetValues()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ta := goheader.New(goheader.WithTemplate(template), goheader.WithValues(values))\n\n\tfor _, file := range pass.Files {\n\t\tposition, isGoFile := goanalysis.GetGoFilePosition(pass, file)\n\t\tif !isGoFile {\n\t\t\tcontinue\n\t\t}\n\n\t\tissue := a.Analyze(&goheader.Target{File: file, Path: position.Filename})\n\t\tif issue == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tf := pass.Fset.File(file.Pos())\n\n\t\tcommentLine := 1\n\t\tvar offset int\n\n\t\t// Inspired by https://github.com/denis-tingaikin/go-header/blob/4c75a6a2332f025705325d6c71fff4616aedf48f/analyzer.go#L85-L92\n\t\tif len(file.Comments) > 0 && file.Comments[0].Pos() < file.Package {\n\t\t\tif !strings.HasPrefix(file.Comments[0].List[0].Text, \"/*\") {\n\t\t\t\t// When the comment is \"//\" there is a one character offset.\n\t\t\t\toffset = 1\n\t\t\t}\n\t\t\tcommentLine = goanalysis.GetFilePositionFor(pass.Fset, file.Comments[0].Pos()).Line\n\t\t}\n\n\t\t// Skip issues related to build directives.\n\t\t// https://github.com/denis-tingaikin/go-header/issues/18\n\t\tif issue.Location().Position-offset < 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tdiag := analysis.Diagnostic{\n\t\t\tPos:     f.LineStart(issue.Location().Line+1) + token.Pos(issue.Location().Position-offset), // The position of the first divergence.\n\t\t\tMessage: issue.Message(),\n\t\t}\n\n\t\tif fix := issue.Fix(); fix != nil {\n\t\t\tcurrent := len(fix.Actual)\n\t\t\tfor _, s := range fix.Actual {\n\t\t\t\tcurrent += len(s)\n\t\t\t}\n\n\t\t\tstart := f.LineStart(commentLine)\n\n\t\t\tend := start + token.Pos(current)\n\n\t\t\theader := strings.Join(fix.Expected, \"\\n\") + \"\\n\"\n\n\t\t\t// Adds an extra line between the package and the header.\n\t\t\tif end == file.Package {\n\t\t\t\theader += \"\\n\"\n\t\t\t}\n\n\t\t\tdiag.SuggestedFixes = []analysis.SuggestedFix{{\n\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\tPos:     start,\n\t\t\t\t\tEnd:     end,\n\t\t\t\t\tNewText: []byte(header),\n\t\t\t\t}},\n\t\t\t}}\n\t\t}\n\n\t\tpass.Report(diag)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/goheader/goheader_integration_test.go",
    "content": "package goheader\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/in/goheader_1.go",
    "content": "// Copyright 1999 The Awesome Project Authors\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/in/goheader_2.go",
    "content": "/* Copyright 1999 The Awesome Project Authors\n\nUse of this source code is governed */\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/in/goheader_3.go",
    "content": "/*\nCopyright 1999 The Awesome\n\nUse of this source code is governed by LICENSE\n*/\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/in/goheader_4.go",
    "content": "/*\n\tCopyright 2024 The Awesome Project Authors\n\n\tUse of this source code is governed by LICENSE.md\n*/\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/out/goheader_1.go",
    "content": "// Copyright 2024 The Awesome Project Authors\n//\n// Use of this source code is governed by LICENSE\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/out/goheader_2.go",
    "content": "/* Copyright 2024 The Awesome Project Authors\n\nUse of this source code is governed by LICENSE */\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/out/goheader_3.go",
    "content": "/*\nCopyright 2024 The Awesome Project Authors\n\nUse of this source code is governed by LICENSE\n*/\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/fix/out/goheader_4.go",
    "content": "/*\n\tCopyright 2024 The Awesome Project Authors\n\n\tUse of this source code is governed by LICENSE\n*/\n\n//golangcitest:args -Egoheader\n//golangcitest:expected_exitcode 0\n//golangcitest:config_path testdata/goheader-fix.yml\npackage p\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/goheader-fix.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    goheader:\n      values:\n        const:\n          AUTHOR: The Awesome Project Authors\n      template: |-\n        Copyright 2024 {{ AUTHOR }}\n  \n        Use of this source code is governed by LICENSE\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/goheader.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    goheader:\n      template: MY {{title}}\n      values:\n        const:\n          title: TITLE.\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/goheader_bad.go",
    "content": "/*MY TITLE!*/ // want `Expected:TITLE\\., Actual: TITLE!`\n\n//golangcitest:args -Egoheader\n//golangcitest:config_path testdata/goheader.yml\npackage testdata\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/goheader_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n/*MY TITLE!*/ // want `Expected:TITLE\\., Actual: TITLE!`\n\n//golangcitest:args -Egoheader\n//golangcitest:config_path testdata/goheader.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n"
  },
  {
    "path": "pkg/golinters/goheader/testdata/goheader_good.go",
    "content": "/*MY TITLE.*/\n\n//golangcitest:args -Egoheader\n//golangcitest:config_path testdata/goheader.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n"
  },
  {
    "path": "pkg/golinters/goimports/goimports.go",
    "content": "package goimports\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\tgoimportsbase \"github.com/golangci/golangci-lint/v2/pkg/goformatters/goimports\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.GoImportsSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(\n\t\t\tgoformatters.NewAnalyzer(\n\t\t\t\tinternal.LinterLogger.Child(goimportsbase.Name),\n\t\t\t\t\"Checks if the code and import statements are formatted according to the 'goimports' command.\",\n\t\t\t\tgoimportsbase.New(settings),\n\t\t\t),\n\t\t).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/goimports_integration_test.go",
    "content": "package goimports\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/fix/in/goimports.go",
    "content": "//golangcitest:config_path testdata/goimports.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport (\n    \"os\"\n    \"fmt\"\n)\n\n func goimports(a, b int) int {\n \tif a != b {\n \t\treturn 1 \n\t}\n \treturn 2\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/fix/in/goimports_cgo.go",
    "content": "//golangcitest:config_path testdata/goimports.yml\n//golangcitest:expected_exitcode 0\npackage p\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n    \"os\"\n    \"fmt\"\n)\n\n func goimports(a, b int) int {\n \tif a != b {\n \t\treturn 1 \n\t}\n \treturn 2\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/fix/out/goimports.go",
    "content": "//golangcitest:config_path testdata/goimports.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nfunc goimports(a, b int) int {\n\tif a != b {\n\t\treturn 1\n\t}\n\treturn 2\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/fix/out/goimports_cgo.go",
    "content": "//golangcitest:config_path testdata/goimports.yml\n//golangcitest:expected_exitcode 0\npackage p\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nfunc goimports(a, b int) int {\n\tif a != b {\n\t\treturn 1\n\t}\n\treturn 2\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/goimports.go",
    "content": "//golangcitest:config_path testdata/goimports.yml\npackage testdata\n\nimport (\n\t\"fmt\" // want \"File is not properly formatted\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nfunc Bar() {\n\tfmt.Print(\"x\")\n\t_ = config.Config{}\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/goimports.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - goimports\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/goimports_cgo.go",
    "content": "//golangcitest:config_path testdata/goimports.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\" // want \"File is not properly formatted\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc Bar() {\n\tfmt.Print(\"x\")\n\t_ = config.Config{}\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/goimports_local.go",
    "content": "//golangcitest:config_path testdata/goimports_local.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\" // want \"File is not properly formatted\"\n\t\"golang.org/x/tools/go/analysis\"\n)\n\nfunc GoimportsLocalPrefixTest() {\n\tfmt.Print(\"x\")\n\t_ = config.Config{}\n\t_ = analysis.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/goimports/testdata/goimports_local.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - goimports\n  settings:\n    goimports:\n      local-prefixes:\n        - github.com/golangci/golangci-lint\n"
  },
  {
    "path": "pkg/golinters/golines/golines.go",
    "content": "package golines\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\tgolinesbase \"github.com/golangci/golangci-lint/v2/pkg/goformatters/golines\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.GoLinesSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(\n\t\t\tgoformatters.NewAnalyzer(\n\t\t\t\tinternal.LinterLogger.Child(golinesbase.Name),\n\t\t\t\t\"Checks if code is formatted, and fixes long lines\",\n\t\t\t\tgolinesbase.New(settings),\n\t\t\t),\n\t\t).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/golines/golines_integration_test.go",
    "content": "package golines\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/golines/testdata/fix/in/golines-custom.go",
    "content": "//golangcitest:config_path testdata/golines-custom.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\n// the struct tags should not be reformatted here\ntype Foo struct {\n\tBar `a:\"b=\\\"c\\\"\" d:\"e\"`\n\tBaz `a:\"f\" d:\"g\"`\n}\n\nvar (\n\t// this ends at 80 columns with tab size 2, and would only be a little wider\n\t// with tab size 8, not failing the default line-len, so it checks both\n\t// settings are applied properly\n\tabc = []string{\"a string that is only wrapped at narrow widths and wide tabs\"}\n)\n"
  },
  {
    "path": "pkg/golinters/golines/testdata/fix/in/golines.go",
    "content": "//golangcitest:config_path testdata/golines.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nvar (\n\tabc = []string{\"a really long string\", \"another really long string\", \"a third really long string\", \"a fourth really long string\", fmt.Sprintf(\"%s %s %s %s >>>>> %s %s\", \"first argument\", \"second argument\", \"third argument\", \"fourth argument\", \"fifth argument\", \"sixth argument\")}\n)\n\ntype MyStruct struct {\n\taLongProperty       int `help:\"This is a really long string for this property\"`\n\tanotherLongProperty int `help:\"This is a really long string for this property, part 2\"`\n\tathirdLongProperty  int `help:\"This is a really long string for this property, part 3....\"`\n}\n\ntype MyInterface interface {\n\taReallyLongFunctionName(argument1 string, argument2 string, argument3 string, argument4 string, argument5 string, argument6 string) (string, error)\n}\n\n// Something here\n\n// Another comment\n// A third comment\n// This is a really really long comment that needs to be split up into multiple lines. I don't know how easy it will be to do, but I think we can do it!\nfunc longLine(aReallyLongName string, anotherLongName string, aThirdLongName string) (string, error) {\n\targument1 := \"argument1\"\n\targument2 := \"argument2\"\n\targument3 := \"argument3\"\n\targument4 := \"argument4\"\n\n\tfmt.Printf(\"This is a really long string with a bunch of arguments: %s %s %s %s >>>>>>>>>>>>>>>>>>>>>>\", argument1, argument2, argument3, argument4)\n\tfmt.Printf(\"This is a short statement: %d %d %d\", 1, 2, 3)\n\n\tz := argument1 + argument2 + fmt.Sprintf(\"This is a really long statement that should be broken up %s %s %s\", argument1, argument2, argument3)\n\n\tfmt.Printf(\"This is a really long line that can be broken up twice %s %s\", fmt.Sprintf(\"This is a really long sub-line that should be broken up more because %s %s\", argument1, argument2), fmt.Sprintf(\"A short one %d\", 3))\n\n\tfmt.Print(\"This is a function with a really long single argument. We want to see if it's properly split\")\n\n\tfmt.Println(z)\n\n\t// This is a really long comment on an indented line. Do you think we can split it up or should we just leave it as is?\n\tif argument4 == \"5\" {\n\t\treturn \"\", fmt.Errorf(\"a very long query with ID %d failed. Check Query History in AWS UI\", 12341251)\n\t}\n\n\tgo func() {\n\t\tfmt.Printf(\"This is a really long line inside of a go routine call. It should be split if at all possible.\")\n\t}()\n\n\tif \"hello this is a big string\" == \"this is a small string\" && \"this is another big string\" == \"this is an even bigger string >>>\" {\n\t\tfmt.Print(\"inside if statement\")\n\t}\n\n\tfmt.Println(map[string]string{\"key1\": \"a very long value\", \"key2\": \"a very long value\", \"key3\": \"another very long value\"})\n\n\treturn \"\", nil\n}\n\nfunc shortFunc(a int, b int) error {\n\tc := make(chan int)\n\n\tfor {\n\t\tselect {\n\t\tcase <-c:\n\t\t\tswitch a {\n\t\t\tcase 1:\n\t\t\t\treturn fmt.Errorf(\"This is a really long line that can be broken up twice %s %s\", fmt.Sprintf(\"This is a really long sub-line that should be broken up more because %s %s\", \"xxxx\", \"yyyy\"), fmt.Sprintf(\"A short one %d\", 3))\n\t\t\tcase 2:\n\t\t\t}\n\t\t}\n\n\t\tbreak\n\t}\n\n\tif a > 5 {\n\t\tpanic(fmt.Sprintf(\">>>>>>>>>>>>>>>>>>> %s %s %s %s\", \"really long argument\", \"another really long argument\", \"a third really long arguement\", abc[1:2]))\n\t}\n\n\treturn nil\n\t// This is an end decoration\n}\n"
  },
  {
    "path": "pkg/golinters/golines/testdata/fix/out/golines-custom.go",
    "content": "//golangcitest:config_path testdata/golines-custom.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\n// the struct tags should not be reformatted here\ntype Foo struct {\n\tBar `a:\"b=\\\"c\\\"\" d:\"e\"`\n\tBaz `a:\"f\" d:\"g\"`\n}\n\nvar (\n\t// this ends at 80 columns with tab size 2, and would only be a little wider\n\t// with tab size 8, not failing the default line-len, so it checks both\n\t// settings are applied properly\n\tabc = []string{\n\t\t\"a string that is only wrapped at narrow widths and wide tabs\",\n\t}\n)\n"
  },
  {
    "path": "pkg/golinters/golines/testdata/fix/out/golines.go",
    "content": "//golangcitest:config_path testdata/golines.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nvar (\n\tabc = []string{\n\t\t\"a really long string\",\n\t\t\"another really long string\",\n\t\t\"a third really long string\",\n\t\t\"a fourth really long string\",\n\t\tfmt.Sprintf(\n\t\t\t\"%s %s %s %s >>>>> %s %s\",\n\t\t\t\"first argument\",\n\t\t\t\"second argument\",\n\t\t\t\"third argument\",\n\t\t\t\"fourth argument\",\n\t\t\t\"fifth argument\",\n\t\t\t\"sixth argument\",\n\t\t),\n\t}\n)\n\ntype MyStruct struct {\n\taLongProperty       int `help:\"This is a really long string for this property\"`\n\tanotherLongProperty int `help:\"This is a really long string for this property, part 2\"`\n\tathirdLongProperty  int `help:\"This is a really long string for this property, part 3....\"`\n}\n\ntype MyInterface interface {\n\taReallyLongFunctionName(\n\t\targument1 string,\n\t\targument2 string,\n\t\targument3 string,\n\t\targument4 string,\n\t\targument5 string,\n\t\targument6 string,\n\t) (string, error)\n}\n\n// Something here\n\n// Another comment\n// A third comment\n// This is a really really long comment that needs to be split up into multiple lines. I don't know how easy it will be to do, but I think we can do it!\nfunc longLine(\n\taReallyLongName string,\n\tanotherLongName string,\n\taThirdLongName string,\n) (string, error) {\n\targument1 := \"argument1\"\n\targument2 := \"argument2\"\n\targument3 := \"argument3\"\n\targument4 := \"argument4\"\n\n\tfmt.Printf(\n\t\t\"This is a really long string with a bunch of arguments: %s %s %s %s >>>>>>>>>>>>>>>>>>>>>>\",\n\t\targument1,\n\t\targument2,\n\t\targument3,\n\t\targument4,\n\t)\n\tfmt.Printf(\"This is a short statement: %d %d %d\", 1, 2, 3)\n\n\tz := argument1 + argument2 + fmt.Sprintf(\n\t\t\"This is a really long statement that should be broken up %s %s %s\",\n\t\targument1,\n\t\targument2,\n\t\targument3,\n\t)\n\n\tfmt.Printf(\n\t\t\"This is a really long line that can be broken up twice %s %s\",\n\t\tfmt.Sprintf(\n\t\t\t\"This is a really long sub-line that should be broken up more because %s %s\",\n\t\t\targument1,\n\t\t\targument2,\n\t\t),\n\t\tfmt.Sprintf(\"A short one %d\", 3),\n\t)\n\n\tfmt.Print(\n\t\t\"This is a function with a really long single argument. We want to see if it's properly split\",\n\t)\n\n\tfmt.Println(z)\n\n\t// This is a really long comment on an indented line. Do you think we can split it up or should we just leave it as is?\n\tif argument4 == \"5\" {\n\t\treturn \"\", fmt.Errorf(\n\t\t\t\"a very long query with ID %d failed. Check Query History in AWS UI\",\n\t\t\t12341251,\n\t\t)\n\t}\n\n\tgo func() {\n\t\tfmt.Printf(\n\t\t\t\"This is a really long line inside of a go routine call. It should be split if at all possible.\",\n\t\t)\n\t}()\n\n\tif \"hello this is a big string\" == \"this is a small string\" &&\n\t\t\"this is another big string\" == \"this is an even bigger string >>>\" {\n\t\tfmt.Print(\"inside if statement\")\n\t}\n\n\tfmt.Println(\n\t\tmap[string]string{\n\t\t\t\"key1\": \"a very long value\",\n\t\t\t\"key2\": \"a very long value\",\n\t\t\t\"key3\": \"another very long value\",\n\t\t},\n\t)\n\n\treturn \"\", nil\n}\n\nfunc shortFunc(a int, b int) error {\n\tc := make(chan int)\n\n\tfor {\n\t\tselect {\n\t\tcase <-c:\n\t\t\tswitch a {\n\t\t\tcase 1:\n\t\t\t\treturn fmt.Errorf(\n\t\t\t\t\t\"This is a really long line that can be broken up twice %s %s\",\n\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t\"This is a really long sub-line that should be broken up more because %s %s\",\n\t\t\t\t\t\t\"xxxx\",\n\t\t\t\t\t\t\"yyyy\",\n\t\t\t\t\t),\n\t\t\t\t\tfmt.Sprintf(\"A short one %d\", 3),\n\t\t\t\t)\n\t\t\tcase 2:\n\t\t\t}\n\t\t}\n\n\t\tbreak\n\t}\n\n\tif a > 5 {\n\t\tpanic(\n\t\t\tfmt.Sprintf(\n\t\t\t\t\">>>>>>>>>>>>>>>>>>> %s %s %s %s\",\n\t\t\t\t\"really long argument\",\n\t\t\t\t\"another really long argument\",\n\t\t\t\t\"a third really long arguement\",\n\t\t\t\tabc[1:2],\n\t\t\t),\n\t\t)\n\t}\n\n\treturn nil\n\t// This is an end decoration\n}\n"
  },
  {
    "path": "pkg/golinters/golines/testdata/golines-custom.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - golines\n  settings:\n    golines:\n      # override many settings\n      max-len: 80\n      tab-len: 8\n      reformat-tags: false\n"
  },
  {
    "path": "pkg/golinters/golines/testdata/golines.go",
    "content": "//golangcitest:config_path testdata/golines.yml\npackage testdata\n\nimport \"fmt\"\n\nvar (\n\t// want +1 \"File is not properly formatted\"\n\tabc = []string{\"a really long string\", \"another really long string\", \"a third really long string\", \"a fourth really long string\", fmt.Sprintf(\"%s %s %s %s >>>>> %s %s\", \"first argument\", \"second argument\", \"third argument\", \"fourth argument\", \"fifth argument\", \"sixth argument\")}\n)\n\ntype MyStruct struct {\n\taLongProperty       int `help:\"This is a really long string for this property\"`\n\tanotherLongProperty int `help:\"This is a really long string for this property, part 2\"`\n\tathirdLongProperty  int `help:\"This is a really long string for this property, part 3....\"`\n}\n\ntype MyInterface interface {\n\taReallyLongFunctionName(argument1 string, argument2 string, argument3 string, argument4 string, argument5 string, argument6 string) (string, error)\n}\n\n// Something here\n\n// Another comment\n// A third comment\n// This is a really really long comment that needs to be split up into multiple lines. I don't know how easy it will be to do, but I think we can do it!\nfunc longLine(aReallyLongName string, anotherLongName string, aThirdLongName string) (string, error) {\n\targument1 := \"argument1\"\n\targument2 := \"argument2\"\n\targument3 := \"argument3\"\n\targument4 := \"argument4\"\n\n\tfmt.Printf(\"This is a really long string with a bunch of arguments: %s %s %s %s >>>>>>>>>>>>>>>>>>>>>>\", argument1, argument2, argument3, argument4)\n\tfmt.Printf(\"This is a short statement: %d %d %d\", 1, 2, 3)\n\n\tz := argument1 + argument2 + fmt.Sprintf(\"This is a really long statement that should be broken up %s %s %s\", argument1, argument2, argument3)\n\n\tfmt.Printf(\"This is a really long line that can be broken up twice %s %s\", fmt.Sprintf(\"This is a really long sub-line that should be broken up more because %s %s\", argument1, argument2), fmt.Sprintf(\"A short one %d\", 3))\n\n\tfmt.Print(\"This is a function with a really long single argument. We want to see if it's properly split\")\n\n\tfmt.Println(z)\n\n\t// This is a really long comment on an indented line. Do you think we can split it up or should we just leave it as is?\n\tif argument4 == \"5\" {\n\t\treturn \"\", fmt.Errorf(\"a very long query with ID %d failed. Check Query History in AWS UI\", 12341251)\n\t}\n\n\tgo func() {\n\t\tfmt.Printf(\"This is a really long line inside of a go routine call. It should be split if at all possible.\")\n\t}()\n\n\tif \"hello this is a big string\" == \"this is a small string\" && \"this is another big string\" == \"this is an even bigger string >>>\" {\n\t\tfmt.Print(\"inside if statement\")\n\t}\n\n\tfmt.Println(map[string]string{\"key1\": \"a very long value\", \"key2\": \"a very long value\", \"key3\": \"another very long value\"})\n\n\treturn \"\", nil\n}\n\nfunc shortFunc(a int, b int) error {\n\tc := make(chan int)\n\n\tfor {\n\t\tselect {\n\t\tcase <-c:\n\t\t\tswitch a {\n\t\t\tcase 1:\n\t\t\t\treturn fmt.Errorf(\"This is a really long line that can be broken up twice %s %s\", fmt.Sprintf(\"This is a really long sub-line that should be broken up more because %s %s\", \"xxxx\", \"yyyy\"), fmt.Sprintf(\"A short one %d\", 3))\n\t\t\tcase 2:\n\t\t\t}\n\t\t}\n\n\t\tbreak\n\t}\n\n\tif a > 5 {\n\t\tpanic(fmt.Sprintf(\">>>>>>>>>>>>>>>>>>> %s %s %s %s\", \"really long argument\", \"another really long argument\", \"a third really long arguement\", abc[1:2]))\n\t}\n\n\treturn nil\n\t// This is an end decoration\n}\n"
  },
  {
    "path": "pkg/golinters/golines/testdata/golines.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - golines\n"
  },
  {
    "path": "pkg/golinters/gomoddirectives/gomoddirectives.go",
    "content": "package gomoddirectives\n\nimport (\n\t\"regexp\"\n\t\"sync\"\n\n\t\"github.com/ldez/gomoddirectives\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"gomoddirectives\"\n\nfunc New(settings *config.GoModDirectivesSettings) *goanalysis.Linter {\n\tvar issues []*goanalysis.Issue\n\tvar once sync.Once\n\n\tvar opts gomoddirectives.Options\n\tif settings != nil {\n\t\topts.ReplaceAllowLocal = settings.ReplaceLocal\n\t\topts.ReplaceAllowList = settings.ReplaceAllowList\n\t\topts.RetractAllowNoExplanation = settings.RetractAllowNoExplanation\n\t\topts.ExcludeForbidden = settings.ExcludeForbidden\n\t\topts.ToolchainForbidden = settings.ToolchainForbidden\n\t\topts.ToolForbidden = settings.ToolForbidden\n\t\topts.GoDebugForbidden = settings.GoDebugForbidden\n\t\topts.CheckModulePath = settings.CheckModulePath\n\n\t\tif settings.ToolchainPattern != \"\" {\n\t\t\texp, err := regexp.Compile(settings.ToolchainPattern)\n\t\t\tif err != nil {\n\t\t\t\tinternal.LinterLogger.Fatalf(\"%s: invalid toolchain pattern: %v\", linterName, err)\n\t\t\t} else {\n\t\t\t\topts.ToolchainPattern = exp\n\t\t\t}\n\t\t}\n\n\t\tif settings.GoVersionPattern != \"\" {\n\t\t\texp, err := regexp.Compile(settings.GoVersionPattern)\n\t\t\tif err != nil {\n\t\t\t\tinternal.LinterLogger.Fatalf(\"%s: invalid Go version pattern: %v\", linterName, err)\n\t\t\t} else {\n\t\t\t\topts.GoVersionPattern = exp\n\t\t\t}\n\t\t}\n\t}\n\n\tanalyzer := &analysis.Analyzer{\n\t\tName: linterName,\n\t\tDoc:  \"Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.\",\n\t\tRun:  goanalysis.DummyRun,\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\tanalyzer.Run = func(pass *analysis.Pass) (any, error) {\n\t\t\t\tonce.Do(func() {\n\t\t\t\t\tresults, err := gomoddirectives.AnalyzePass(pass, opts)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tlintCtx.Log.Warnf(\"running %s failed: %s: \"+\n\t\t\t\t\t\t\t\"if you are not using go modules it is suggested to disable this linter\", linterName, err)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tfor _, p := range results {\n\t\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(&result.Issue{\n\t\t\t\t\t\t\tFromLinter: linterName,\n\t\t\t\t\t\t\tPos:        p.Start,\n\t\t\t\t\t\t\tText:       p.Reason,\n\t\t\t\t\t\t}, pass))\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn issues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/gomodguard/gomodguard.go",
    "content": "package gomodguard\n\nimport (\n\t\"sync\"\n\n\t\"github.com/ryancurrah/gomodguard\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"gomodguard\"\n\nfunc New(settings *config.GoModGuardSettings) *goanalysis.Linter {\n\tvar issues []*goanalysis.Issue\n\tvar mu sync.Mutex\n\n\tprocessorCfg := &gomodguard.Configuration{}\n\tif settings != nil {\n\t\tprocessorCfg.Allowed.Modules = settings.Allowed.Modules\n\t\tprocessorCfg.Allowed.Domains = settings.Allowed.Domains\n\t\tprocessorCfg.Blocked.LocalReplaceDirectives = settings.Blocked.LocalReplaceDirectives\n\n\t\tfor n := range settings.Blocked.Modules {\n\t\t\tfor k, v := range settings.Blocked.Modules[n] {\n\t\t\t\tm := map[string]gomodguard.BlockedModule{k: {\n\t\t\t\t\tRecommendations: v.Recommendations,\n\t\t\t\t\tReason:          v.Reason,\n\t\t\t\t}}\n\t\t\t\tprocessorCfg.Blocked.Modules = append(processorCfg.Blocked.Modules, m)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tfor n := range settings.Blocked.Versions {\n\t\t\tfor k, v := range settings.Blocked.Versions[n] {\n\t\t\t\tm := map[string]gomodguard.BlockedVersion{k: {\n\t\t\t\t\tVersion: v.Version,\n\t\t\t\t\tReason:  v.Reason,\n\t\t\t\t}}\n\t\t\t\tprocessorCfg.Blocked.Versions = append(processorCfg.Blocked.Versions, m)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tanalyzer := &analysis.Analyzer{\n\t\tName: linterName,\n\t\tDoc: \"Allow and blocklist linter for direct Go module dependencies. \" +\n\t\t\t\"This is different from depguard where there are different block \" +\n\t\t\t\"types for example version constraints and module recommendations.\",\n\t\tRun: goanalysis.DummyRun,\n\t}\n\n\treturn goanalysis.NewLinterFromAnalyzer(analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\tprocessor, err := gomodguard.NewProcessor(processorCfg)\n\t\t\tif err != nil {\n\t\t\t\tlintCtx.Log.Warnf(\"running gomodguard failed: %s: if you are not using go modules \"+\n\t\t\t\t\t\"it is suggested to disable this linter\", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tanalyzer.Run = func(pass *analysis.Pass) (any, error) {\n\t\t\t\tgomodguardIssues := processor.ProcessFiles(internal.GetGoFileNames(pass))\n\n\t\t\t\tmu.Lock()\n\t\t\t\tdefer mu.Unlock()\n\n\t\t\t\tfor _, gomodguardIssue := range gomodguardIssues {\n\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(&result.Issue{\n\t\t\t\t\t\tFromLinter: linterName,\n\t\t\t\t\t\tPos:        gomodguardIssue.Position,\n\t\t\t\t\t\tText:       gomodguardIssue.Reason,\n\t\t\t\t\t}, pass))\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn issues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/gomodguard/gomodguard_integration_test.go",
    "content": "package gomodguard\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gomodguard/testdata/go.mod",
    "content": "module gomodguard\n\ngo 1.25.0\n\nrequire (\n\tgolang.org/x/mod v0.24.0\n\tgopkg.in/yaml.v3 v3.0.1\n)\n"
  },
  {
    "path": "pkg/golinters/gomodguard/testdata/go.sum",
    "content": "golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=\ngolang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=\ngolang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=\ngolang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "pkg/golinters/gomodguard/testdata/gomodguard.go",
    "content": "//golangcitest:args -Egomodguard\n//golangcitest:config_path testdata/gomodguard.yml\npackage testdata\n\nimport (\n\t\"log\"\n\n\t\"golang.org/x/mod/modfile\"\n\t\"gopkg.in/yaml.v3\" // want \"import of package `gopkg.in/yaml.v3` is blocked because the module is in the blocked modules list. `github.com/kylelemons/go-gypsy` is a recommended module. This is an example of recommendations.\"\n)\n\n// Something just some struct\ntype Something struct{}\n\nfunc aAllowedImport() { //nolint:unused\n\tmfile, _ := modfile.Parse(\"go.mod\", []byte{}, nil)\n\n\tlog.Println(mfile)\n}\n\nfunc aBlockedImport() { //nolint:unused\n\tdata := []byte{}\n\tsomething := Something{}\n\t_ = yaml.Unmarshal(data, &something)\n\n\tlog.Println(data)\n}\n"
  },
  {
    "path": "pkg/golinters/gomodguard/testdata/gomodguard.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gomodguard:\n      allowed:\n        modules:                                                      # List of allowed modules\n          - golang.org/x/mod\n      blocked:\n        modules:                                                      # List of blocked modules\n          - gopkg.in/yaml.v3:                                         # Blocked module\n              recommendations:                                        # Recommended modules that should be used instead (Optional)\n                - github.com/kylelemons/go-gypsy\n              reason: \"This is an example of recommendations.\"        # Reason why the recommended module should be used (Optional)\n"
  },
  {
    "path": "pkg/golinters/gomodguard/testdata/gomodguard_cgo.go",
    "content": "//golangcitest:args -Egomodguard\n//golangcitest:config_path testdata/gomodguard.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"log\"\n\t\"unsafe\"\n\n\t\"golang.org/x/mod/modfile\"\n\t\"gopkg.in/yaml.v3\" // want \"import of package `gopkg.in/yaml.v3` is blocked because the module is in the blocked modules list. `github.com/kylelemons/go-gypsy` is a recommended module. This is an example of recommendations.\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n// Something just some struct\ntype Something struct{}\n\nfunc aAllowedImport() { //nolint:unused\n\tmfile, _ := modfile.Parse(\"go.mod\", []byte{}, nil)\n\n\tlog.Println(mfile)\n}\n\nfunc aBlockedImport() { //nolint:unused\n\tdata := []byte{}\n\tsomething := Something{}\n\t_ = yaml.Unmarshal(data, &something)\n\n\tlog.Println(data)\n}\n"
  },
  {
    "path": "pkg/golinters/goprintffuncname/goprintffuncname.go",
    "content": "package goprintffuncname\n\nimport (\n\t\"github.com/golangci/go-printf-func-name/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/goprintffuncname/goprintffuncname_integration_test.go",
    "content": "package goprintffuncname\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/goprintffuncname/testdata/goprintffuncname.go",
    "content": "//golangcitest:args -Egoprintffuncname\npackage testdata\n\nfunc PrintfLikeFuncWithBadName(format string, args ...interface{}) { // want \"printf-like formatting function 'PrintfLikeFuncWithBadName' should be named 'PrintfLikeFuncWithBadNamef'\"\n}\n"
  },
  {
    "path": "pkg/golinters/goprintffuncname/testdata/goprintffuncname_cgo.go",
    "content": "//golangcitest:args -Egoprintffuncname\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc PrintfLikeFuncWithBadName(format string, args ...interface{}) { // want \"printf-like formatting function 'PrintfLikeFuncWithBadName' should be named 'PrintfLikeFuncWithBadNamef'\"\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/gosec.go",
    "content": "package gosec\n\nimport (\n\t\"fmt\"\n\t\"go/token\"\n\t\"io\"\n\t\"log\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/securego/gosec/v2\"\n\t\"github.com/securego/gosec/v2/analyzers\"\n\t\"github.com/securego/gosec/v2/issue\"\n\t\"github.com/securego/gosec/v2/rules\"\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"gosec\"\n\nfunc New(settings *config.GoSecSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\tconf := gosec.NewConfig()\n\n\tvar ruleFilters []rules.RuleFilter\n\tvar analyzerFilters []analyzers.AnalyzerFilter\n\tif settings != nil {\n\t\t// TODO(ldez) to remove when the problem will be fixed by gosec.\n\t\t// https://github.com/securego/gosec/issues/1211\n\t\t// https://github.com/securego/gosec/issues/1209\n\t\tsettings.Excludes = append(settings.Excludes, \"G407\")\n\n\t\truleFilters = createRuleFilters(settings.Includes, settings.Excludes)\n\t\tanalyzerFilters = createAnalyzerFilters(settings.Includes, settings.Excludes)\n\t\tconf = toGosecConfig(settings)\n\t}\n\n\tlogger := log.New(io.Discard, \"\", 0)\n\n\truleDefinitions := rules.Generate(false, ruleFilters...)\n\tanalyzerDefinitions := analyzers.Generate(false, analyzerFilters...)\n\n\tanalyzer := &analysis.Analyzer{\n\t\tName: linterName,\n\t\tDoc:  \"Inspects source code for security problems\",\n\t\tRun:  goanalysis.DummyRun,\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\tanalyzer.Run = func(pass *analysis.Pass) (any, error) {\n\t\t\t\t// The `gosecAnalyzer` is here because of concurrency issue.\n\t\t\t\tgosecAnalyzer := gosec.NewAnalyzer(conf, true, false, false, settings.Concurrency, logger)\n\n\t\t\t\tgosecAnalyzer.LoadRules(ruleDefinitions.RulesInfo())\n\t\t\t\tgosecAnalyzer.LoadAnalyzers(analyzerDefinitions.AnalyzersInfo())\n\n\t\t\t\tissues := runGoSec(lintCtx, pass, settings, gosecAnalyzer)\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runGoSec(lintCtx *linter.Context, pass *analysis.Pass, settings *config.GoSecSettings, analyzer *gosec.Analyzer) []*goanalysis.Issue {\n\tpkg := &packages.Package{\n\t\tFset:      pass.Fset,\n\t\tSyntax:    pass.Files,\n\t\tTypes:     pass.Pkg,\n\t\tTypesInfo: pass.TypesInfo,\n\t}\n\n\tanalyzer.CheckRules(pkg)\n\tanalyzer.CheckAnalyzers(pkg)\n\n\tsecIssues, _, _ := analyzer.Report()\n\tif len(secIssues) == 0 {\n\t\treturn nil\n\t}\n\n\tseverity, err := convertToScore(settings.Severity)\n\tif err != nil {\n\t\tlintCtx.Log.Warnf(\"The provided severity %v\", err)\n\t}\n\n\tconfidence, err := convertToScore(settings.Confidence)\n\tif err != nil {\n\t\tlintCtx.Log.Warnf(\"The provided confidence %v\", err)\n\t}\n\n\tsecIssues = filterIssues(secIssues, severity, confidence)\n\n\tissues := make([]*goanalysis.Issue, 0, len(secIssues))\n\tfor _, i := range secIssues {\n\t\ttext := fmt.Sprintf(\"%s: %s\", i.RuleID, i.What)\n\n\t\tvar r *result.Range\n\n\t\tline, err := strconv.Atoi(i.Line)\n\t\tif err != nil {\n\t\t\tr = &result.Range{}\n\t\t\tif n, rerr := fmt.Sscanf(i.Line, \"%d-%d\", &r.From, &r.To); rerr != nil || n != 2 {\n\t\t\t\tlintCtx.Log.Warnf(\"Can't convert gosec line number %q of %v to int: %s\", i.Line, i, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tline = r.From\n\t\t}\n\n\t\tcolumn, err := strconv.Atoi(i.Col)\n\t\tif err != nil {\n\t\t\tlintCtx.Log.Warnf(\"Can't convert gosec column number %q of %v to int: %s\", i.Col, i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tissues = append(issues, goanalysis.NewIssue(&result.Issue{\n\t\t\tSeverity: convertScoreToString(i.Severity),\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: i.File,\n\t\t\t\tLine:     line,\n\t\t\t\tColumn:   column,\n\t\t\t},\n\t\t\tText:       text,\n\t\t\tLineRange:  r,\n\t\t\tFromLinter: linterName,\n\t\t}, pass))\n\t}\n\n\treturn issues\n}\n\nfunc toGosecConfig(settings *config.GoSecSettings) gosec.Config {\n\tconf := gosec.NewConfig()\n\n\tfor k, v := range settings.Config {\n\t\tif k == gosec.Globals {\n\t\t\tconvertGosecGlobals(v, conf)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Uses ToUpper because the parsing of the map's key change the key to lowercase.\n\t\t// The value is not impacted by that: the case is respected.\n\t\tconf.Set(strings.ToUpper(k), v)\n\t}\n\n\treturn conf\n}\n\nfunc convertScoreToString(score issue.Score) string {\n\tswitch score {\n\tcase issue.Low:\n\t\treturn \"low\"\n\tcase issue.Medium:\n\t\treturn \"medium\"\n\tcase issue.High:\n\t\treturn \"high\"\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n\n// based on https://github.com/securego/gosec/blob/47bfd4eb6fc7395940933388550b547538b4c946/config.go#L52-L62\nfunc convertGosecGlobals(globalOptionFromConfig any, conf gosec.Config) {\n\tglobalOptionMap, ok := globalOptionFromConfig.(map[string]any)\n\tif !ok {\n\t\treturn\n\t}\n\n\tfor k, v := range globalOptionMap {\n\t\toption := gosec.GlobalOption(k)\n\n\t\t// Set nosec global option only if the value is true\n\t\t// https://github.com/securego/gosec/blob/v2.21.4/analyzer.go#L572\n\t\tif option == gosec.Nosec && v == false {\n\t\t\tcontinue\n\t\t}\n\n\t\tconf.SetGlobal(option, fmt.Sprintf(\"%v\", v))\n\t}\n}\n\n// based on https://github.com/securego/gosec/blob/81cda2f91fbe1bf4735feb55febcae03e697a92b/cmd/gosec/main.go#L258-L275\nfunc createAnalyzerFilters(includes, excludes []string) []analyzers.AnalyzerFilter {\n\tvar filters []analyzers.AnalyzerFilter\n\n\tif len(includes) > 0 {\n\t\tfilters = append(filters, analyzers.NewAnalyzerFilter(false, includes...))\n\t}\n\n\tif len(excludes) > 0 {\n\t\tfilters = append(filters, analyzers.NewAnalyzerFilter(true, excludes...))\n\t}\n\n\treturn filters\n}\n\n// based on https://github.com/securego/gosec/blob/569328eade2ccbad4ce2d0f21ee158ab5356a5cf/cmd/gosec/main.go#L170-L188\nfunc createRuleFilters(includes, excludes []string) []rules.RuleFilter {\n\tvar filters []rules.RuleFilter\n\n\tif len(includes) > 0 {\n\t\tfilters = append(filters, rules.NewRuleFilter(false, includes...))\n\t}\n\n\tif len(excludes) > 0 {\n\t\tfilters = append(filters, rules.NewRuleFilter(true, excludes...))\n\t}\n\n\treturn filters\n}\n\n// code borrowed from https://github.com/securego/gosec/blob/69213955dacfd560562e780f723486ef1ca6d486/cmd/gosec/main.go#L250-L262\nfunc convertToScore(str string) (issue.Score, error) {\n\tstr = strings.ToLower(str)\n\tswitch str {\n\tcase \"\", \"low\":\n\t\treturn issue.Low, nil\n\tcase \"medium\":\n\t\treturn issue.Medium, nil\n\tcase \"high\":\n\t\treturn issue.High, nil\n\tdefault:\n\t\treturn issue.Low, fmt.Errorf(\"'%s' is invalid, use low instead. Valid options: low, medium, high\", str)\n\t}\n}\n\n// code borrowed from https://github.com/securego/gosec/blob/69213955dacfd560562e780f723486ef1ca6d486/cmd/gosec/main.go#L264-L276\nfunc filterIssues(issues []*issue.Issue, severity, confidence issue.Score) []*issue.Issue {\n\tres := make([]*issue.Issue, 0)\n\n\tfor _, i := range issues {\n\t\tif i.Severity >= severity && i.Confidence >= confidence {\n\t\t\tres = append(res, i)\n\t\t}\n\t}\n\n\treturn res\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/gosec_integration_test.go",
    "content": "package gosec\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/gosec_test.go",
    "content": "package gosec\n\nimport (\n\t\"testing\"\n\n\t\"github.com/securego/gosec/v2\"\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nfunc Test_toGosecConfig(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tsettings *config.GoSecSettings\n\t\texpected gosec.Config\n\t}{\n\t\t{\n\t\t\tdesc:     \"empty config map\",\n\t\t\tsettings: &config.GoSecSettings{},\n\t\t\texpected: gosec.Config{\n\t\t\t\t\"global\": map[gosec.GlobalOption]string{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"with global settings\",\n\t\t\tsettings: &config.GoSecSettings{\n\t\t\t\tConfig: map[string]any{\n\t\t\t\t\tgosec.Globals: map[string]any{\n\t\t\t\t\t\tstring(gosec.Nosec): true,\n\t\t\t\t\t\tstring(gosec.Audit): \"true\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: gosec.Config{\n\t\t\t\t\"global\": map[gosec.GlobalOption]string{\n\t\t\t\t\t\"audit\": \"true\",\n\t\t\t\t\t\"nosec\": \"true\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"with global settings nosec enabled\",\n\t\t\tsettings: &config.GoSecSettings{\n\t\t\t\tConfig: map[string]any{\n\t\t\t\t\tgosec.Globals: map[string]any{\n\t\t\t\t\t\tstring(gosec.Nosec): false,\n\t\t\t\t\t\tstring(gosec.Audit): \"true\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: gosec.Config{\n\t\t\t\t\"global\": map[gosec.GlobalOption]string{\n\t\t\t\t\t\"audit\": \"true\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"rule specified setting\",\n\t\t\tsettings: &config.GoSecSettings{\n\t\t\t\tConfig: map[string]any{\n\t\t\t\t\t\"g101\": map[string]any{\n\t\t\t\t\t\t\"pattern\": \"(?i)example\",\n\t\t\t\t\t},\n\t\t\t\t\t\"G301\": \"0750\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: gosec.Config{\n\t\t\t\t\"G101\":   map[string]any{\"pattern\": \"(?i)example\"},\n\t\t\t\t\"G301\":   \"0750\",\n\t\t\t\t\"global\": map[gosec.GlobalOption]string{},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tconf := toGosecConfig(test.settings)\n\n\t\t\tassert.Equal(t, test.expected, conf)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec.go",
    "content": "//golangcitest:args -Egosec\npackage testdata\n\nimport (\n\t\"crypto/md5\" // want \"G501: Blocklisted import crypto/md5: weak cryptographic primitive\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n)\n\nfunc Gosec() {\n\th := md5.New() // want \"G401: Use of weak cryptographic primitive\"\n\tlog.Print(h)\n}\n\nfunc GosecNolintGosec() {\n\th := md5.New() //nolint:gosec\n\tlog.Print(h)\n}\n\nfunc GosecNoErrorCheckingByDefault() {\n\tf, _ := os.Create(\"foo\")\n\tfmt.Println(f)\n}\n\nfunc GosecG204SubprocWithFunc() {\n\targ := func() string {\n\t\treturn \"/tmp/dummy\"\n\t}\n\n\texec.Command(\"ls\", arg()).Run() // want \"G104: Errors unhandled\"\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gosec:\n      includes:\n        - G306\n        - G101\n      config:\n        G306: \"0666\"\n        G101:\n          pattern: \"(?i)simple\"\n          ignore_entropy: false\n          entropy_threshold: \"80.0\"\n          per_char_threshold: \"3.0\"\n          truncate: \"32\"\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Egosec\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"crypto/md5\"\n\t\"log\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc Gosec() {\n\th := md5.New() // want \"G401: Use of weak cryptographic primitive\"\n\tlog.Print(h)\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_global_option.go",
    "content": "//golangcitest:args -Egosec\n//golangcitest:config_path testdata/gosec_global_option.yml\npackage testdata\n\nimport (\n\t\"crypto/md5\" // want \"G501: Blocklisted import crypto/md5: weak cryptographic primitive\"\n\t\"log\"\n)\n\nfunc Gosec() {\n\t// #nosec G401\n\th := md5.New() // want \"G401: Use of weak cryptographic primitive\"\n\tlog.Print(h)\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_global_option.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gosec:\n      config:\n        global:\n          nosec: true\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_nosec.go",
    "content": "//golangcitest:args -Egosec\n//golangcitest:config_path testdata/gosec_nosec.yml\npackage testdata\n\nimport (\n\t\"crypto/md5\" // want \"G501: Blocklisted import crypto/md5: weak cryptographic primitive\"\n\t\"log\"\n)\n\nfunc Gosec() {\n\t// #nosec G401\n\th := md5.New()\n\tlog.Print(h)\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_nosec.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gosec:\n      config:\n        global:\n          nosec: false\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_rules_config.go",
    "content": "//golangcitest:args -Egosec\n//golangcitest:config_path testdata/gosec.yml\npackage testdata\n\nimport \"io/ioutil\"\n\nconst gosecToken = \"62ebc7a03d6ca24dca1258fd4b48462f6fed1545\"\nconst gosecSimple = \"62ebc7a03d6ca24dca1258fd4b48462f6fed1545\" // want \"G101: Potential hardcoded credentials\"\n\nfunc gosecCustom() {\n\tioutil.WriteFile(\"filename\", []byte(\"test\"), 0755) // want \"G306: Expect WriteFile permissions to be 0666 or less\"\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_severity_confidence.go",
    "content": "//golangcitest:args -Egosec\n//golangcitest:config_path testdata/gosec_severity_confidence.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\nvar url string = \"https://www.abcdefghijk.com\"\n\nfunc gosecVariableURL() {\n\tresp, err := http.Get(url) // want \"G107: Potential HTTP request made with variable url\"\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer resp.Body.Close()\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Printf(\"%s\", body)\n}\n\nfunc gosecHardcodedCredentials() {\n\tusername := \"admin\"\n\tvar password = \"f62e5bcda4fae4f82370da0c6f20697b8f8447ef\"\n\n\tfmt.Println(\"Doing something with: \", username, password)\n}\n"
  },
  {
    "path": "pkg/golinters/gosec/testdata/gosec_severity_confidence.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gosec:\n      severity: \"medium\"\n      confidence: \"medium\"\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/gosmopolitan.go",
    "content": "package gosmopolitan\n\nimport (\n\t\"strings\"\n\n\t\"github.com/xen0n/gosmopolitan\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.GosmopolitanSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"allowtimelocal\":  settings.AllowTimeLocal,\n\t\t\t\"escapehatches\":   strings.Join(settings.EscapeHatches, \",\"),\n\t\t\t\"watchforscripts\": strings.Join(settings.WatchForScripts, \",\"),\n\n\t\t\t// Should be managed with `linters.exclusions.rules`.\n\t\t\t\"lookattests\": true,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(gosmopolitan.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/gosmopolitan_integration_test.go",
    "content": "package gosmopolitan\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan.go",
    "content": "//golangcitest:args -Egosmopolitan\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\ntype col struct {\n\t// struct tag should not get reported\n\tFoo string `gorm:\"column:bar;not null;comment:'不应该报告这一行'\"`\n}\n\nfunc main() {\n\tfmt.Println(\"hello world\")\n\tfmt.Println(\"你好，世界\") // want `string literal contains rune in Han script`\n\tfmt.Println(\"こんにちは、セカイ\")\n\n\t_ = col{Foo: \"hello\"}\n\t_ = col{Foo: \"你好\"} // want `string literal contains rune in Han script`\n\n\tx := time.Local // want `usage of time.Local`\n\t_ = time.Now().In(x)\n\t_ = time.Date(2023, 1, 2, 3, 4, 5, 678901234, time.Local) // want `usage of time.Local`\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_allow_time_local.go",
    "content": "//golangcitest:args -Egosmopolitan\n//golangcitest:config_path testdata/gosmopolitan_allow_time_local.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"time\"\n)\n\nfunc main() {\n\t_ = time.Local\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_allow_time_local.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gosmopolitan:\n      allow-time-local: true\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_cgo.go",
    "content": "//golangcitest:args -Egosmopolitan\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype col struct {\n\t// struct tag should not get reported\n\tFoo string `gorm:\"column:bar;not null;comment:'不应该报告这一行'\"`\n}\n\nfunc _() {\n\tfmt.Println(\"hello world\")\n\tfmt.Println(\"你好，世界\") // want `string literal contains rune in Han script`\n\tfmt.Println(\"こんにちは、セカイ\")\n\n\t_ = col{Foo: \"hello\"}\n\t_ = col{Foo: \"你好\"} // want `string literal contains rune in Han script`\n\n\tx := time.Local // want `usage of time.Local`\n\t_ = time.Now().In(x)\n\t_ = time.Date(2023, 1, 2, 3, 4, 5, 678901234, time.Local) // want `usage of time.Local`\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_dont_ignore_test.go",
    "content": "//golangcitest:args -Egosmopolitan\npackage testdata\n\nimport (\n\t\"time\"\n)\n\nfunc main() {\n\t_ = \"开启检查测试文件\" // want `string literal contains rune in Han script`\n\t_ = time.Local         // want `usage of time.Local`\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_escape_hatches.go",
    "content": "//golangcitest:args -Egosmopolitan\n//golangcitest:config_path testdata/gosmopolitan_escape_hatches.yml\npackage testdata\n\nimport (\n\tmyAlias \"fmt\"\n)\n\ntype A string\ntype B = string\ntype C struct {\n\tfoo string\n\tBar string\n}\n\nfunc D(fmt string) string {\n\tmyAlias.Println(fmt, \"测试\")\n\treturn myAlias.Sprintf(\"%s 测试\", fmt) // want `string literal contains rune in Han script`\n}\n\ntype X struct {\n\tbaz string\n}\n\nfunc main() {\n\t_ = A(\"测试\")\n\t_ = string(A(string(\"测试\")))\n\t_ = B(\"测试\")\n\t_ = C{\n\t\tfoo: \"测试\",\n\t\tBar: \"测试\",\n\t}\n\t_ = D(\"测试\")\n\n\t_ = &X{\n\t\tbaz: \"测试\", // want `string literal contains rune in Han script`\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_escape_hatches.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gosmopolitan:\n      escape-hatches:\n        - 'command-line-arguments.A'\n        - 'command-line-arguments.B'\n        - 'command-line-arguments.C'\n        - 'command-line-arguments.D'\n        - 'fmt.Println'\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_scripts.go",
    "content": "//golangcitest:args -Egosmopolitan\n//golangcitest:config_path testdata/gosmopolitan_scripts.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n)\n\nfunc main() {\n\tfmt.Println(\"hello world\")                 // want `string literal contains rune in Latin script`\n\tfmt.Println(\"should not report this line\") //nolint:gosmopolitan\n\tfmt.Println(\"你好，世界\")\n\tfmt.Println(\"こんにちは、セカイ\") // want `string literal contains rune in Hiragana script`\n}\n"
  },
  {
    "path": "pkg/golinters/gosmopolitan/testdata/gosmopolitan_scripts.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gosmopolitan:\n      watch-for-scripts:\n        - Hiragana\n        - Katakana\n        - Latin\n"
  },
  {
    "path": "pkg/golinters/govet/govet.go",
    "content": "package govet\n\nimport (\n\t\"slices\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/appends\"\n\t\"golang.org/x/tools/go/analysis/passes/asmdecl\"\n\t\"golang.org/x/tools/go/analysis/passes/assign\"\n\t\"golang.org/x/tools/go/analysis/passes/atomic\"\n\t\"golang.org/x/tools/go/analysis/passes/atomicalign\"\n\t\"golang.org/x/tools/go/analysis/passes/bools\"\n\t_ \"golang.org/x/tools/go/analysis/passes/buildssa\" // unused, internal analyzer\n\t\"golang.org/x/tools/go/analysis/passes/buildtag\"\n\t\"golang.org/x/tools/go/analysis/passes/cgocall\"\n\t\"golang.org/x/tools/go/analysis/passes/composite\"\n\t\"golang.org/x/tools/go/analysis/passes/copylock\"\n\t_ \"golang.org/x/tools/go/analysis/passes/ctrlflow\" // unused, internal analyzer\n\t\"golang.org/x/tools/go/analysis/passes/deepequalerrors\"\n\t\"golang.org/x/tools/go/analysis/passes/defers\"\n\t\"golang.org/x/tools/go/analysis/passes/directive\"\n\t\"golang.org/x/tools/go/analysis/passes/errorsas\"\n\t\"golang.org/x/tools/go/analysis/passes/fieldalignment\"\n\t\"golang.org/x/tools/go/analysis/passes/findcall\"\n\t\"golang.org/x/tools/go/analysis/passes/framepointer\"\n\t\"golang.org/x/tools/go/analysis/passes/hostport\"\n\t\"golang.org/x/tools/go/analysis/passes/httpmux\"\n\t\"golang.org/x/tools/go/analysis/passes/httpresponse\"\n\t\"golang.org/x/tools/go/analysis/passes/ifaceassert\"\n\t_ \"golang.org/x/tools/go/analysis/passes/inspect\" // unused internal analyzer\n\t\"golang.org/x/tools/go/analysis/passes/loopclosure\"\n\t\"golang.org/x/tools/go/analysis/passes/lostcancel\"\n\t\"golang.org/x/tools/go/analysis/passes/nilfunc\"\n\t\"golang.org/x/tools/go/analysis/passes/nilness\"\n\t_ \"golang.org/x/tools/go/analysis/passes/pkgfact\" // unused, internal analyzer\n\t\"golang.org/x/tools/go/analysis/passes/printf\"\n\t\"golang.org/x/tools/go/analysis/passes/reflectvaluecompare\"\n\t\"golang.org/x/tools/go/analysis/passes/shadow\"\n\t\"golang.org/x/tools/go/analysis/passes/shift\"\n\t\"golang.org/x/tools/go/analysis/passes/sigchanyzer\"\n\t\"golang.org/x/tools/go/analysis/passes/slog\"\n\t\"golang.org/x/tools/go/analysis/passes/sortslice\"\n\t\"golang.org/x/tools/go/analysis/passes/stdmethods\"\n\t\"golang.org/x/tools/go/analysis/passes/stdversion\"\n\t\"golang.org/x/tools/go/analysis/passes/stringintconv\"\n\t\"golang.org/x/tools/go/analysis/passes/structtag\"\n\t\"golang.org/x/tools/go/analysis/passes/testinggoroutine\"\n\t\"golang.org/x/tools/go/analysis/passes/tests\"\n\t\"golang.org/x/tools/go/analysis/passes/timeformat\"\n\t\"golang.org/x/tools/go/analysis/passes/unmarshal\"\n\t\"golang.org/x/tools/go/analysis/passes/unreachable\"\n\t\"golang.org/x/tools/go/analysis/passes/unsafeptr\"\n\t\"golang.org/x/tools/go/analysis/passes/unusedresult\"\n\t\"golang.org/x/tools/go/analysis/passes/unusedwrite\"\n\t\"golang.org/x/tools/go/analysis/passes/waitgroup\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nvar (\n\tallAnalyzers = []*analysis.Analyzer{\n\t\tappends.Analyzer,\n\t\tasmdecl.Analyzer,\n\t\tassign.Analyzer,\n\t\tatomic.Analyzer,\n\t\tatomicalign.Analyzer,\n\t\tbools.Analyzer,\n\t\tbuildtag.Analyzer,\n\t\tcgocall.Analyzer,\n\t\tcomposite.Analyzer,\n\t\tcopylock.Analyzer,\n\t\tdeepequalerrors.Analyzer,\n\t\tdefers.Analyzer,\n\t\tdirective.Analyzer,\n\t\terrorsas.Analyzer,\n\t\tfieldalignment.Analyzer,\n\t\tfindcall.Analyzer,\n\t\tframepointer.Analyzer,\n\t\thostport.Analyzer,\n\t\thttpmux.Analyzer,\n\t\thttpresponse.Analyzer,\n\t\tifaceassert.Analyzer,\n\t\tloopclosure.Analyzer,\n\t\tlostcancel.Analyzer,\n\t\tnilfunc.Analyzer,\n\t\tnilness.Analyzer,\n\t\tprintf.Analyzer,\n\t\treflectvaluecompare.Analyzer,\n\t\tshadow.Analyzer,\n\t\tshift.Analyzer,\n\t\tsigchanyzer.Analyzer,\n\t\tslog.Analyzer,\n\t\tsortslice.Analyzer,\n\t\tstdmethods.Analyzer,\n\t\tstdversion.Analyzer,\n\t\tstringintconv.Analyzer,\n\t\tstructtag.Analyzer,\n\t\ttestinggoroutine.Analyzer,\n\t\ttests.Analyzer,\n\t\ttimeformat.Analyzer,\n\t\tunmarshal.Analyzer,\n\t\tunreachable.Analyzer,\n\t\tunsafeptr.Analyzer,\n\t\tunusedresult.Analyzer,\n\t\tunusedwrite.Analyzer,\n\t\twaitgroup.Analyzer,\n\t}\n\n\t// https://github.com/golang/go/blob/go1.25.2/src/cmd/vet/main.go#L57-L91\n\tdefaultAnalyzers = []*analysis.Analyzer{\n\t\tappends.Analyzer,\n\t\tasmdecl.Analyzer,\n\t\tassign.Analyzer,\n\t\tatomic.Analyzer,\n\t\tbools.Analyzer,\n\t\tbuildtag.Analyzer,\n\t\tcgocall.Analyzer,\n\t\tcomposite.Analyzer,\n\t\tcopylock.Analyzer,\n\t\tdefers.Analyzer,\n\t\tdirective.Analyzer,\n\t\terrorsas.Analyzer,\n\t\tframepointer.Analyzer,\n\t\thostport.Analyzer,\n\t\thttpresponse.Analyzer,\n\t\tifaceassert.Analyzer,\n\t\tloopclosure.Analyzer,\n\t\tlostcancel.Analyzer,\n\t\tnilfunc.Analyzer,\n\t\tprintf.Analyzer,\n\t\tshift.Analyzer,\n\t\tsigchanyzer.Analyzer,\n\t\tslog.Analyzer,\n\t\tstdmethods.Analyzer,\n\t\tstdversion.Analyzer,\n\t\tstringintconv.Analyzer,\n\t\tstructtag.Analyzer,\n\t\ttestinggoroutine.Analyzer,\n\t\ttests.Analyzer,\n\t\ttimeformat.Analyzer,\n\t\tunmarshal.Analyzer,\n\t\tunreachable.Analyzer,\n\t\tunsafeptr.Analyzer,\n\t\tunusedresult.Analyzer,\n\t\twaitgroup.Analyzer,\n\t}\n)\n\nvar (\n\tdebugf  = logutils.Debug(logutils.DebugKeyGovet)\n\tisDebug = logutils.HaveDebugTag(logutils.DebugKeyGovet)\n)\n\nfunc New(settings *config.GovetSettings) *goanalysis.Linter {\n\tvar conf map[string]map[string]any\n\tif settings != nil {\n\t\tconf = settings.Settings\n\t}\n\n\treturn goanalysis.NewLinter(\n\t\t\"govet\",\n\t\t\"Vet examines Go source code and reports suspicious constructs. \"+\n\t\t\t\"It is roughly the same as 'go vet' and uses its passes.\",\n\t\tanalyzersFromConfig(settings),\n\t\tconf,\n\t).WithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc analyzersFromConfig(settings *config.GovetSettings) []*analysis.Analyzer {\n\tlogAnalyzers(\"All available analyzers\", allAnalyzers)\n\tlogAnalyzers(\"Default analyzers\", defaultAnalyzers)\n\n\tif settings == nil {\n\t\treturn defaultAnalyzers\n\t}\n\n\tvar enabledAnalyzers []*analysis.Analyzer\n\tfor _, a := range allAnalyzers {\n\t\tif isAnalyzerEnabled(a.Name, settings, defaultAnalyzers) {\n\t\t\tenabledAnalyzers = append(enabledAnalyzers, a)\n\t\t}\n\t}\n\n\tlogAnalyzers(\"Enabled by config analyzers\", enabledAnalyzers)\n\n\treturn enabledAnalyzers\n}\n\nfunc isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool {\n\t// TODO(ldez) remove loopclosure when go1.24\n\tif name == loopclosure.Analyzer.Name && config.IsGoGreaterThanOrEqual(cfg.Go, \"1.22\") {\n\t\treturn false\n\t}\n\n\tswitch {\n\tcase cfg.EnableAll:\n\t\treturn !slices.Contains(cfg.Disable, name)\n\n\tcase slices.Contains(cfg.Enable, name):\n\t\treturn true\n\n\tcase slices.Contains(cfg.Disable, name):\n\t\treturn false\n\n\tcase cfg.DisableAll:\n\t\treturn false\n\n\tdefault:\n\t\treturn slices.ContainsFunc(defaultAnalyzers, func(a *analysis.Analyzer) bool { return a.Name == name })\n\t}\n}\n\nfunc logAnalyzers(message string, analyzers []*analysis.Analyzer) {\n\tif !isDebug {\n\t\treturn\n\t}\n\n\tanalyzerNames := make([]string, 0, len(analyzers))\n\tfor _, a := range analyzers {\n\t\tanalyzerNames = append(analyzerNames, a.Name)\n\t}\n\n\tslices.Sort(analyzerNames)\n\n\tdebugf(\"%s (%d): %s\", message, len(analyzerNames), strings.Join(analyzerNames, \", \"))\n}\n"
  },
  {
    "path": "pkg/golinters/govet/govet_integration_test.go",
    "content": "package govet\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/govet/govet_test.go",
    "content": "package govet\n\nimport (\n\t\"slices\"\n\t\"testing\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/asmdecl\"\n\t\"golang.org/x/tools/go/analysis/passes/assign\"\n\t\"golang.org/x/tools/go/analysis/passes/atomic\"\n\t\"golang.org/x/tools/go/analysis/passes/bools\"\n\t\"golang.org/x/tools/go/analysis/passes/buildtag\"\n\t\"golang.org/x/tools/go/analysis/passes/cgocall\"\n\t\"golang.org/x/tools/go/analysis/passes/shadow\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nfunc TestGovet(t *testing.T) {\n\t// Checking that every default analyzer is in \"all analyzers\" list.\n\tcheckList := slices.Clone(defaultAnalyzers)\n\tcheckList = append(checkList, shadow.Analyzer) // special case, used in analyzersFromConfig\n\n\tfor _, defaultAnalyzer := range checkList {\n\t\tfound := slices.ContainsFunc(allAnalyzers, func(a *analysis.Analyzer) bool {\n\t\t\treturn a.Name == defaultAnalyzer.Name\n\t\t})\n\t\tif !found {\n\t\t\tt.Errorf(\"%s is not in allAnalyzers\", defaultAnalyzer.Name)\n\t\t}\n\t}\n}\n\nfunc sortAnalyzers(a, b *analysis.Analyzer) int {\n\tif a.Name < b.Name {\n\t\treturn -1\n\t}\n\n\tif a.Name > b.Name {\n\t\treturn 1\n\t}\n\n\treturn 0\n}\n\nfunc TestGovetSorted(t *testing.T) {\n\t// Keeping analyzers sorted so their order match the import order.\n\tt.Run(\"All\", func(t *testing.T) {\n\t\tif !slices.IsSortedFunc(allAnalyzers, sortAnalyzers) {\n\t\t\tt.Error(\"please keep all analyzers list sorted by name\")\n\t\t}\n\t})\n\n\tt.Run(\"Default\", func(t *testing.T) {\n\t\tif !slices.IsSortedFunc(defaultAnalyzers, sortAnalyzers) {\n\t\t\tt.Error(\"please keep default analyzers list sorted by name\")\n\t\t}\n\t})\n}\n\nfunc TestGovetAnalyzerIsEnabled(t *testing.T) {\n\tdefaultAnalyzers := []*analysis.Analyzer{\n\t\tasmdecl.Analyzer,\n\t\tassign.Analyzer,\n\t\tatomic.Analyzer,\n\t\tbools.Analyzer,\n\t\tbuildtag.Analyzer,\n\t\tcgocall.Analyzer,\n\t}\n\tfor _, tc := range []struct {\n\t\tEnable     []string\n\t\tDisable    []string\n\t\tEnableAll  bool\n\t\tDisableAll bool\n\t\tGo         string\n\n\t\tName    string\n\t\tEnabled bool\n\t}{\n\t\t{Name: \"assign\", Enabled: true},\n\t\t{Name: \"cgocall\", Enabled: false, DisableAll: true},\n\t\t{Name: \"errorsas\", Enabled: false},\n\t\t{Name: \"bools\", Enabled: false, Disable: []string{\"bools\"}},\n\t\t{Name: \"unsafeptr\", Enabled: true, Enable: []string{\"unsafeptr\"}},\n\t\t{Name: \"shift\", Enabled: true, EnableAll: true},\n\t\t{Name: \"shadow\", EnableAll: true, Disable: []string{\"shadow\"}, Enabled: false},\n\t} {\n\t\tcfg := &config.GovetSettings{\n\t\t\tEnable:     tc.Enable,\n\t\t\tDisable:    tc.Disable,\n\t\t\tEnableAll:  tc.EnableAll,\n\t\t\tDisableAll: tc.DisableAll,\n\t\t\tGo:         tc.Go,\n\t\t}\n\t\tif enabled := isAnalyzerEnabled(tc.Name, cfg, defaultAnalyzers); enabled != tc.Enabled {\n\t\t\tt.Errorf(\"%+v\", tc)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/fix/in/govet.go",
    "content": "//golangcitest:args -Egovet\n//golangcitest:config_path testdata/govet_fix.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n)\n\ntype Foo struct {\n\tA []string\n\tB bool\n\tC string\n\tD int8\n\tE int32\n}\n\nfunc nonConstantFormat(s string) {\n\tfmt.Printf(\"%s\", s)\n\tfmt.Printf(s, \"arg\")\n\tfmt.Fprintf(os.Stderr, \"%s\", s)\n\tlog.Printf(\"%s\", s)\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/fix/out/govet.go",
    "content": "//golangcitest:args -Egovet\n//golangcitest:config_path testdata/govet_fix.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n)\n\ntype Foo struct {\n\tC string\n\tA []string\n\tE int32\n\tB bool\n\tD int8\n}\n\nfunc nonConstantFormat(s string) {\n\tfmt.Printf(\"%s\", s)\n\tfmt.Printf(s, \"arg\")\n\tfmt.Fprintf(os.Stderr, \"%s\", s)\n\tlog.Printf(\"%s\", s)\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet.go",
    "content": "//golangcitest:args -Egovet\n//golangcitest:config_path testdata/govet.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n)\n\nfunc GovetComposites() error {\n\treturn &os.PathError{\"first\", \"path\", os.ErrNotExist} // want \"composites: (os|io/fs)\\\\.PathError struct literal uses unkeyed fields\"\n}\n\nfunc GovetShadow(f io.Reader, buf []byte) (err error) {\n\tif f != nil {\n\t\t_, err := f.Read(buf) // want `shadow: declaration of .err. shadows declaration at line \\d+`\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t// Use variable to trigger shadowing error\n\t_ = err\n\treturn\n}\n\nfunc GovetPrintf() {\n\tx := \"dummy\"\n\tfmt.Printf(\"%d\", x) // want \"printf: fmt.Printf format %d has arg x of wrong type string\"\n}\n\nfunc GovetStringIntConv() {\n\ti := 42\n\tfmt.Println(\"i = \" + string(i)) // want \"stringintconv: conversion from int to string yields a string of one rune, not a string of digits\"\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    govet:\n      enable:\n        - shadow\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet_cgo.go",
    "content": "//golangcitest:args -Egovet\n//golangcitest:config_path testdata/govet.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"io\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(f io.Reader, buf []byte) (err error) {\n\tif f != nil {\n\t\t_, err := f.Read(buf) // want `shadow: declaration of .err. shadows declaration at line \\d+`\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t// Use variable to trigger shadowing error\n\t_ = err\n\treturn\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet_custom_formatter.go",
    "content": "//golangcitest:args -Egovet\n//golangcitest:expected_exitcode 0\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n)\n\nconst (\n\tescape = \"\\x1b\"\n\treset  = escape + \"[0m\"\n\tgreen  = escape + \"[32m\"\n\n\tminValue = 0.0\n\tmaxValue = 1.0\n)\n\n// Bar is a progress bar.\ntype Bar float64\n\nvar _ fmt.Formatter = Bar(maxValue)\n\n// Format the progress bar as output\nfunc (h Bar) Format(state fmt.State, r rune) {\n\tswitch r {\n\tcase 'r':\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"%v: unexpected format character\", float64(h)))\n\t}\n\n\tif h > maxValue {\n\t\th = maxValue\n\t}\n\n\tif h < minValue {\n\t\th = minValue\n\t}\n\n\tif state.Flag('-') {\n\t\th = maxValue - h\n\t}\n\n\twidth, ok := state.Width()\n\tif !ok {\n\t\t// default width of 40\n\t\twidth = 40\n\t}\n\n\tvar pad int\n\n\textra := len([]byte(green)) + len([]byte(reset))\n\n\tp := make([]byte, width+extra)\n\tp[0], p[len(p)-1] = '|', '|'\n\tpad += 2\n\n\tpositive := int(Bar(width-pad) * h)\n\tnegative := width - pad - positive\n\n\tn := 1\n\tn += copy(p[n:], green)\n\tn += copy(p[n:], bytes.Repeat([]byte(\"+\"), positive))\n\tn += copy(p[n:], reset)\n\n\tif negative > 0 {\n\t\tcopy(p[n:len(p)-1], bytes.Repeat([]byte(\"-\"), negative))\n\t}\n\n\t_, _ = state.Write(p)\n}\n\nfunc main() {\n\tvar b Bar = 0.9\n\t_, _ = fmt.Fprintf(os.Stdout, \"%r\", b)\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet_fieldalignment.go",
    "content": "//go:build !(386 || arm || mips || mipsle)\n//golangcitest:args -Egovet\n//golangcitest:config_path testdata/govet_fieldalignment.yml\npackage testdata\n\ntype gvfaGood struct {\n\ty int32\n\tx byte\n\tz byte\n}\n\ntype gvfaBad struct { // want \"struct of size 12 could be 8\"\n\tx byte\n\ty int32\n\tz byte\n}\n\ntype gvfaPointerGood struct {\n\tP   *int\n\tbuf [1000]uintptr\n}\n\ntype gvfaPointerBad struct { // want \"struct with 8008 pointer bytes could be 8\"\n\tbuf [1000]uintptr\n\tP   *int\n}\n\ntype gvfaPointerSorta struct {\n\ta struct {\n\t\tp *int\n\t\tq uintptr\n\t}\n\tb struct {\n\t\tp *int\n\t\tq [2]uintptr\n\t}\n}\n\ntype gvfaPointerSortaBad struct { // want \"struct with 32 pointer bytes could be 24\"\n\ta struct {\n\t\tp *int\n\t\tq [2]uintptr\n\t}\n\tb struct {\n\t\tp *int\n\t\tq uintptr\n\t}\n}\n\ntype gvfaZeroGood struct {\n\ta [0]byte\n\tb uint32\n}\n\ntype gvfaZeroBad struct { // want \"struct of size 8 could be 4\"\n\ta uint32\n\tb [0]byte\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet_fieldalignment.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    govet:\n      enable:\n      - fieldalignment\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet_fix.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    govet:\n      enable:\n        - assign\n        - composites\n        - fieldalignment\n        - findcall\n        - printf\n        - sigchanyzer\n        - sortslice\n        - stringintconv\n        - timeformat\n        - unreachable\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet_ifaceassert.go",
    "content": "//golangcitest:args -Egovet\n//golangcitest:config_path testdata/govet_ifaceassert.yml\npackage testdata\n\nimport (\n\t\"io\"\n)\n\nfunc GovetIfaceAssert() {\n\tvar v interface {\n\t\tRead()\n\t}\n\t_ = v.(io.Reader) // want \"impossible type assertion: no type can implement both interface\\\\{Read\\\\(\\\\)\\\\} and io\\\\.Reader \\\\(conflicting types for Read method\\\\)\"\n}\n"
  },
  {
    "path": "pkg/golinters/govet/testdata/govet_ifaceassert.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    govet:\n      enable:\n      - ifaceassert\n"
  },
  {
    "path": "pkg/golinters/grouper/grouper.go",
    "content": "package grouper\n\nimport (\n\tgrouper \"github.com/leonklingele/grouper/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.GrouperSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"const-require-single-const\":   settings.ConstRequireSingleConst,\n\t\t\t\"const-require-grouping\":       settings.ConstRequireGrouping,\n\t\t\t\"import-require-single-import\": settings.ImportRequireSingleImport,\n\t\t\t\"import-require-grouping\":      settings.ImportRequireGrouping,\n\t\t\t\"type-require-single-type\":     settings.TypeRequireSingleType,\n\t\t\t\"type-require-grouping\":        settings.TypeRequireGrouping,\n\t\t\t\"var-require-single-var\":       settings.VarRequireSingleVar,\n\t\t\t\"var-require-grouping\":         settings.VarRequireGrouping,\n\t\t}\n\t}\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(grouper.New()).\n\t\tWithDesc(\"Analyze expression groups.\").\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/grouper/grouper_integration_test.go",
    "content": "package grouper\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/grouper/testdata/grouper.go",
    "content": "//golangcitest:args -Egrouper\n//golangcitest:config_path testdata/grouper.yml\npackage testdata\n\nimport \"fmt\" // want \"should only use grouped 'import' declarations\"\n\nfunc dummy() { fmt.Println(\"dummy\") }\n"
  },
  {
    "path": "pkg/golinters/grouper/testdata/grouper.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    grouper:\n      import-require-grouping: true\n"
  },
  {
    "path": "pkg/golinters/grouper/testdata/grouper_cgo.go",
    "content": "//golangcitest:args -Egrouper\n//golangcitest:config_path testdata/grouper.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\" // want \"should only use grouped 'import' declarations\"\n\nimport \"unsafe\" // want \"grouper\\\\(related information\\\\): found here\"\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n"
  },
  {
    "path": "pkg/golinters/iface/iface.go",
    "content": "package iface\n\nimport (\n\t\"slices\"\n\n\t\"github.com/uudashr/iface/identical\"\n\t\"github.com/uudashr/iface/opaque\"\n\t\"github.com/uudashr/iface/unexported\"\n\t\"github.com/uudashr/iface/unused\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.IfaceSettings) *goanalysis.Linter {\n\tvar conf map[string]map[string]any\n\tif settings != nil {\n\t\tconf = settings.Settings\n\t}\n\n\treturn goanalysis.NewLinter(\n\t\t\"iface\",\n\t\t\"Detect the incorrect use of interfaces, helping developers avoid interface pollution.\",\n\t\tanalyzersFromSettings(settings),\n\t\tconf,\n\t).WithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc analyzersFromSettings(settings *config.IfaceSettings) []*analysis.Analyzer {\n\tallAnalyzers := map[string]*analysis.Analyzer{\n\t\t\"identical\":  identical.Analyzer,\n\t\t\"unused\":     unused.Analyzer,\n\t\t\"opaque\":     opaque.Analyzer,\n\t\t\"unexported\": unexported.Analyzer,\n\t}\n\n\tif settings == nil || len(settings.Enable) == 0 {\n\t\t// Default enable `identical` analyzer only\n\t\treturn []*analysis.Analyzer{identical.Analyzer}\n\t}\n\n\tvar analyzers []*analysis.Analyzer\n\tfor _, name := range uniqueNames(settings.Enable) {\n\t\tif _, ok := allAnalyzers[name]; !ok {\n\t\t\t// skip unknown analyzer\n\t\t\tcontinue\n\t\t}\n\n\t\tanalyzers = append(analyzers, allAnalyzers[name])\n\t}\n\n\treturn analyzers\n}\n\nfunc uniqueNames(names []string) []string {\n\tslices.Sort(names)\n\treturn slices.Compact(names)\n}\n"
  },
  {
    "path": "pkg/golinters/iface/iface_integration_test.go",
    "content": "package iface\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/fix/in/iface.go",
    "content": "//golangcitest:args -Eiface\n//golangcitest:config_path testdata/iface_fix.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\ntype Pinger interface {\n\tPing() error\n}\n\ntype Healthcheck interface {\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server {\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface {\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/fix/out/iface.go",
    "content": "//golangcitest:args -Eiface\n//golangcitest:config_path testdata/iface_fix.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) *server {\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_all.go",
    "content": "//golangcitest:args -Eiface\n//golangcitest:config_path testdata/iface_all.yml\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\ntype Pinger interface { // want \"identical: interface 'Pinger' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\ntype Healthcheck interface { // want \"identical: interface 'Healthcheck' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server { // want \"opaque: 'NewServer' function return 'Server' interface at the 1st result, abstract a single concrete implementation of '\\\\*server'\"\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface { // want \"unused: interface 'UserRepository' is declared but not used within the package\"\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_all.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    iface:\n      enable:\n        - unused\n        - identical\n        - opaque\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_cgo.go",
    "content": "//golangcitest:args -Eiface\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n// identical\n\ntype Pinger interface { // want \"identical: interface 'Pinger' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\ntype Healthcheck interface { // want \"identical: interface 'Healthcheck' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server {\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface {\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_default.go",
    "content": "//golangcitest:args -Eiface\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\ntype Pinger interface { // want \"identical: interface 'Pinger' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\ntype Healthcheck interface { // want \"identical: interface 'Healthcheck' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server {\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface {\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_fix.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    iface:\n      enable:\n        - unused\n        - opaque\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_identical.go",
    "content": "//golangcitest:args -Eiface\n//golangcitest:config_path testdata/iface_identical.yml\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\ntype Pinger interface { // want \"identical: interface 'Pinger' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\ntype Healthcheck interface { // want \"identical: interface 'Healthcheck' contains identical methods or type constraints with another interface, causing redundancy\"\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server {\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface {\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_identical.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    iface:\n      enable:\n        - identical\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_opaque.go",
    "content": "//golangcitest:args -Eiface\n//golangcitest:config_path testdata/iface_opaque.yml\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\ntype Pinger interface {\n\tPing() error\n}\n\ntype Healthcheck interface {\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server { // want \"opaque: 'NewServer' function return 'Server' interface at the 1st result, abstract a single concrete implementation of '\\\\*server'\"\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface {\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_opaque.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    iface:\n      enable:\n        - opaque\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_unexported.go",
    "content": "//golangcitest:args -Eiface\n//golangcitest:config_path testdata/iface_unexported.yml\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\ntype Pinger interface {\n\tPing() error\n}\n\ntype Healthcheck interface {\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server {\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface {\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n\n// unexported\n\ntype unexportedReader interface {\n\tRead([]byte) (int, error)\n}\n\nfunc ReadAll(r unexportedReader) ([]byte, error) { // want \"unexported interface 'unexportedReader' used as parameter in exported function 'ReadAll'\"\n\tbuf := make([]byte, 1024)\n\t_, err := r.Read(buf)\n\treturn buf, err\n}\n\nfunc NewUnexportedReader() unexportedReader { // want \"unexported interface 'unexportedReader' used as return value in exported function 'NewUnexportedReader'\"\n\treturn nil // stub\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_unexported.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    iface:\n      enable:\n        - unexported\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_unused.go",
    "content": "//golangcitest:args -Eiface\n//golangcitest:config_path testdata/iface_unused.yml\npackage testdata\n\nimport \"fmt\"\n\n// identical\n\ntype Pinger interface { // want \"unused: interface 'Pinger' is declared but not used within the package\"\n\tPing() error\n}\n\ntype Healthcheck interface { // want \"unused: interface 'Healthcheck' is declared but not used within the package\"\n\tPing() error\n}\n\n// opaque\n\ntype Server interface {\n\tServe() error\n}\n\ntype server struct {\n\taddr string\n}\n\nfunc (s server) Serve() error {\n\treturn nil\n}\n\nfunc NewServer(addr string) Server {\n\treturn &server{addr: addr}\n}\n\n// unused\n\ntype User struct {\n\tID   string\n\tName string\n}\n\ntype UserRepository interface { // want \"unused: interface 'UserRepository' is declared but not used within the package\"\n\tUserOf(id string) (*User, error)\n}\n\ntype UserRepositorySQL struct {\n}\n\nfunc (r *UserRepositorySQL) UserOf(id string) (*User, error) {\n\treturn nil, nil\n}\n\ntype Granter interface {\n\tGrant(permission string) error\n}\n\nfunc AllowAll(g Granter) error {\n\treturn g.Grant(\"all\")\n}\n\ntype Allower interface {\n\tAllow(permission string) error\n}\n\nfunc Allow(x any) {\n\t_ = x.(Allower)\n\tfmt.Println(\"allow\")\n}\n"
  },
  {
    "path": "pkg/golinters/iface/testdata/iface_unused.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    iface:\n      enable:\n        - unused\n"
  },
  {
    "path": "pkg/golinters/importas/importas.go",
    "content": "package importas\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/julz/importas\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n)\n\nfunc New(settings *config.ImportAsSettings) *goanalysis.Linter {\n\tanalyzer := importas.Analyzer\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\tif settings == nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif len(settings.Alias) == 0 {\n\t\t\t\tlintCtx.Log.Infof(\"importas settings found, but no aliases listed. List aliases under alias: key.\")\n\t\t\t}\n\n\t\t\tif err := analyzer.Flags.Set(\"no-unaliased\", strconv.FormatBool(settings.NoUnaliased)); err != nil {\n\t\t\t\tlintCtx.Log.Errorf(\"failed to parse configuration: %v\", err)\n\t\t\t}\n\n\t\t\tif err := analyzer.Flags.Set(\"no-extra-aliases\", strconv.FormatBool(settings.NoExtraAliases)); err != nil {\n\t\t\t\tlintCtx.Log.Errorf(\"failed to parse configuration: %v\", err)\n\t\t\t}\n\n\t\t\tuniqPackages := make(map[string]config.ImportAsAlias)\n\t\t\tuniqAliases := make(map[string]config.ImportAsAlias)\n\t\t\tfor _, a := range settings.Alias {\n\t\t\t\tif a.Pkg == \"\" {\n\t\t\t\t\tlintCtx.Log.Errorf(\"invalid configuration, empty package: pkg=%s alias=%s\", a.Pkg, a.Alias)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif v, ok := uniqPackages[a.Pkg]; ok {\n\t\t\t\t\tlintCtx.Log.Errorf(\"invalid configuration, multiple aliases for the same package: pkg=%s aliases=[%s,%s]\", a.Pkg, a.Alias, v.Alias)\n\t\t\t\t} else {\n\t\t\t\t\tuniqPackages[a.Pkg] = a\n\t\t\t\t}\n\n\t\t\t\t// Skips the duplication check when:\n\t\t\t\t// - the alias is empty.\n\t\t\t\t// - the alias is a regular expression replacement pattern (ie. contains `$`).\n\t\t\t\tv, ok := uniqAliases[a.Alias]\n\t\t\t\tif ok && a.Alias != \"\" && !strings.Contains(a.Alias, \"$\") {\n\t\t\t\t\tlintCtx.Log.Errorf(\"invalid configuration, multiple packages with the same alias: alias=%s packages=[%s,%s]\", a.Alias, a.Pkg, v.Pkg)\n\t\t\t\t} else {\n\t\t\t\t\tuniqAliases[a.Alias] = a\n\t\t\t\t}\n\n\t\t\t\terr := analyzer.Flags.Set(\"alias\", fmt.Sprintf(\"%s:%s\", a.Pkg, a.Alias))\n\t\t\t\tif err != nil {\n\t\t\t\t\tlintCtx.Log.Errorf(\"failed to parse configuration: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/importas/importas_integration_test.go",
    "content": "package importas\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/fix/in/importas.go",
    "content": "//golangcitest:args -Eimportas\n//golangcitest:config_path testdata/importas.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\twrong_alias \"fmt\"\n\t\"os\"\n\twrong_alias_again \"os\"\n\n\twrong \"golang.org/x/tools/go/analysis\"\n)\n\nfunc ImportAsWrongAlias() {\n\twrong_alias.Println(\"foo\")\n\twrong_alias_again.Stdout.WriteString(\"bar\")\n\tos.Stdout.WriteString(\"test\")\n\t_ = wrong.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/fix/out/importas.go",
    "content": "//golangcitest:args -Eimportas\n//golangcitest:config_path testdata/importas.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\tfff \"fmt\"\n\t\"os\"\n\tstd_os \"os\"\n\n\tananas \"golang.org/x/tools/go/analysis\"\n)\n\nfunc ImportAsWrongAlias() {\n\tfff.Println(\"foo\")\n\tstd_os.Stdout.WriteString(\"bar\")\n\tos.Stdout.WriteString(\"test\")\n\t_ = ananas.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/importas.go",
    "content": "//golangcitest:args -Eimportas\n//golangcitest:config_path testdata/importas.yml\npackage testdata\n\nimport (\n\twrong_alias \"fmt\" // want `import \"fmt\" imported as \"wrong_alias\" but must be \"fff\" according to config`\n\t\"os\"\n\twrong_alias_again \"os\" // want `import \"os\" imported as \"wrong_alias_again\" but must be \"std_os\" according to config`\n\n\twrong \"golang.org/x/tools/go/analysis\" // want `import \"golang.org/x/tools/go/analysis\" imported as \"wrong\" but must be \"ananas\" according to config`\n)\n\nfunc ImportAsWrongAlias() {\n\twrong_alias.Println(\"foo\")\n\twrong_alias_again.Stdout.WriteString(\"bar\")\n\tos.Stdout.WriteString(\"test\")\n\t_ = wrong.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/importas.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    importas:\n      alias:\n        - pkg: fmt\n          alias: fff\n        - pkg: os\n          alias: std_os\n        - pkg: golang.org/x/tools/go/analysis\n          alias: ananas\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/importas_cgo.go",
    "content": "//golangcitest:args -Eimportas\n//golangcitest:config_path testdata/importas.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\twrong_alias \"fmt\" // want `import \"fmt\" imported as \"wrong_alias\" but must be \"fff\" according to config`\n\t\"os\"\n\twrong_alias_again \"os\" // want `import \"os\" imported as \"wrong_alias_again\" but must be \"std_os\" according to config`\n\t\"unsafe\"\n\n\twrong \"golang.org/x/tools/go/analysis\" // want `import \"golang.org/x/tools/go/analysis\" imported as \"wrong\" but must be \"ananas\" according to config`\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\twrong_alias.Println(\"foo\")\n\twrong_alias_again.Stdout.WriteString(\"bar\")\n\tos.Stdout.WriteString(\"test\")\n\t_ = wrong.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/importas_several_empty_aliases.go",
    "content": "//golangcitest:args -Eimportas\n//golangcitest:config_path testdata/importas_several_empty_aliases.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"os\"\n)\n\nfunc _() {\n\tfmt.Println(\"a\")\n\tfmt.Fprint(os.Stderr, \"b\")\n\tprintln(math.MaxInt)\n}\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/importas_several_empty_aliases.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    importas:\n      alias:\n        - pkg: fmt\n          alias: ''\n        - pkg: os\n          alias: ''\n        - pkg: math\n          alias: ''\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/importas_strict.go",
    "content": "//golangcitest:args -Eimportas\n//golangcitest:config_path testdata/importas_strict.yml\npackage testdata\n\nimport (\n\twrong_alias \"fmt\"      // want `import \"fmt\" imported as \"wrong_alias\" but must be \"fff\" according to config`\n\t\"os\"                   // want `import \"os\" imported without alias but must be with alias \"std_os\" according to config`\n\twrong_alias_again \"os\" // want `import \"os\" imported as \"wrong_alias_again\" but must be \"std_os\" according to config`\n\n\twrong \"golang.org/x/tools/go/analysis\" // want `import \"golang.org/x/tools/go/analysis\" imported as \"wrong\" but must be \"ananas\" according to config`\n)\n\nfunc ImportAsStrictWrongAlias() {\n\twrong_alias.Println(\"foo\")\n\twrong_alias_again.Stdout.WriteString(\"bar\")\n\tos.Stdout.WriteString(\"test\")\n\t_ = wrong.Analyzer{}\n}\n"
  },
  {
    "path": "pkg/golinters/importas/testdata/importas_strict.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    importas:\n      no-unaliased: true\n      alias:\n        - pkg: fmt\n          alias: fff\n        - pkg: os\n          alias: std_os\n        - pkg: golang.org/x/tools/go/analysis\n          alias: ananas\n"
  },
  {
    "path": "pkg/golinters/inamedparam/inamedparam.go",
    "content": "package inamedparam\n\nimport (\n\t\"github.com/macabu/inamedparam\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.INamedParamSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"skip-single-param\": settings.SkipSingleParam,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(inamedparam.Analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/inamedparam/inamedparam_integration_test.go",
    "content": "package inamedparam\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/inamedparam/testdata/inamedparam.go",
    "content": "//golangcitest:args -Einamedparam\npackage testdata\n\nimport \"context\"\n\ntype tStruct struct {\n\ta int\n}\n\ntype Doer interface {\n\tDo() string\n}\n\ntype NamedParam interface {\n\tVoid()\n\n\tNoArgs() string\n\n\tWithName(ctx context.Context, number int, toggle bool, tStruct *tStruct, doer Doer) (bool, error)\n\n\tWithoutName(\n\t\tcontext.Context, // want \"interface method WithoutName must have named param for type context.Context\"\n\t\tint, // want \"interface method WithoutName must have named param for type int\"\n\t\tbool, // want \"interface method WithoutName must have named param for type bool\"\n\t\ttStruct, // want \"interface method WithoutName must have named param for type tStruct\"\n\t\tDoer, // want \"interface method WithoutName must have named param for type Doer\"\n\t\tstruct{ b bool }, // want \"interface method WithoutName must have all named params\"\n\t)\n}\n"
  },
  {
    "path": "pkg/golinters/inamedparam/testdata/inamedparam_cgo.go",
    "content": "//golangcitest:args -Einamedparam\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype tStruct struct {\n\ta int\n}\n\ntype Doer interface {\n\tDo() string\n}\n\ntype NamedParam interface {\n\tVoid()\n\n\tNoArgs() string\n\n\tWithName(ctx context.Context, number int, toggle bool, tStruct *tStruct, doer Doer) (bool, error)\n\n\tWithoutName(\n\t\tcontext.Context,  // want \"interface method WithoutName must have named param for type context.Context\"\n\t\tint,              // want \"interface method WithoutName must have named param for type int\"\n\t\tbool,             // want \"interface method WithoutName must have named param for type bool\"\n\t\ttStruct,          // want \"interface method WithoutName must have named param for type tStruct\"\n\t\tDoer,             // want \"interface method WithoutName must have named param for type Doer\"\n\t\tstruct{ b bool }, // want \"interface method WithoutName must have all named params\"\n\t)\n}\n"
  },
  {
    "path": "pkg/golinters/inamedparam/testdata/inamedparam_skip_single_param.go",
    "content": "//golangcitest:args -Einamedparam\n//golangcitest:config_path testdata/inamedparam_skip_single_param.yml\npackage testdata\n\nimport \"context\"\n\ntype NamedParam interface {\n\tVoid()\n\n\tSingleParam(string) error\n\n\tWithName(ctx context.Context, number int, toggle bool) (bool, error)\n\n\tWithoutName(\n\t\tcontext.Context, // want \"interface method WithoutName must have named param for type context.Context\"\n\t\tint, // want \"interface method WithoutName must have named param for type int\"\n\t)\n}\n"
  },
  {
    "path": "pkg/golinters/inamedparam/testdata/inamedparam_skip_single_param.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    inamedparam:\n      skip-single-param: true\n"
  },
  {
    "path": "pkg/golinters/ineffassign/ineffassign.go",
    "content": "package ineffassign\n\nimport (\n\t\"github.com/gordonklaus/ineffassign/pkg/ineffassign\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.IneffassignSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"check-escaping-errors\": settings.CheckEscapingErrors,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(ineffassign.Analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/ineffassign/ineffassign_integration_test.go",
    "content": "package ineffassign\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/ineffassign/testdata/ineffassign.go",
    "content": "//golangcitest:args -Eineffassign\npackage testdata\n\nimport \"math\"\n\nfunc _() {\n\tx := math.MinInt8\n\tfor {\n\t\t_ = x\n\t\tx = 0 // want \"ineffectual assignment to x\"\n\t\tx = 0\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/ineffassign/testdata/ineffassign_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Eineffassign\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tx := math.MinInt8\n\tfor {\n\t\t_ = x\n\t\tx = 0 // want \"ineffectual assignment to x\"\n\t\tx = 0\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/interfacebloat/interfacebloat.go",
    "content": "package interfacebloat\n\nimport (\n\t\"github.com/sashamelentyev/interfacebloat/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.InterfaceBloatSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\tanalyzer.InterfaceMaxMethodsFlag: settings.Max,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.New()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/interfacebloat/interfacebloat_integration_test.go",
    "content": "package interfacebloat\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/interfacebloat/testdata/interfacebloat.go",
    "content": "//golangcitest:args -Einterfacebloat\npackage testdata\n\nimport \"time\"\n\ntype InterfaceBloatExample01 interface { // want \"the interface has more than 10 methods: 11\"\n\ta01() time.Duration\n\ta02()\n\ta03()\n\ta04()\n\ta05()\n\ta06()\n\ta07()\n\ta08()\n\ta09()\n\ta10()\n\ta11()\n}\n\nfunc InterfaceBloatExample02() {\n\tvar _ interface { // want \"the interface has more than 10 methods: 11\"\n\t\ta01() time.Duration\n\t\ta02()\n\t\ta03()\n\t\ta04()\n\t\ta05()\n\t\ta06()\n\t\ta07()\n\t\ta08()\n\t\ta09()\n\t\ta10()\n\t\ta11()\n\t}\n}\n\nfunc InterfaceBloatExample03() interface { // want \"the interface has more than 10 methods: 11\"\n\ta01() time.Duration\n\ta02()\n\ta03()\n\ta04()\n\ta05()\n\ta06()\n\ta07()\n\ta08()\n\ta09()\n\ta10()\n\ta11()\n} {\n\treturn nil\n}\n\ntype InterfaceBloatExample04 struct {\n\tFoo interface { // want \"the interface has more than 10 methods: 11\"\n\t\ta01() time.Duration\n\t\ta02()\n\t\ta03()\n\t\ta04()\n\t\ta05()\n\t\ta06()\n\t\ta07()\n\t\ta08()\n\t\ta09()\n\t\ta10()\n\t\ta11()\n\t}\n}\n\ntype InterfaceBloatSmall01 interface {\n\ta01() time.Duration\n\ta02()\n\ta03()\n\ta04()\n\ta05()\n}\n\ntype InterfaceBloatSmall02 interface {\n\ta06()\n\ta07()\n\ta08()\n\ta09()\n\ta10()\n\ta11()\n}\n\ntype InterfaceBloatExample05 interface {\n\tInterfaceBloatSmall01\n\tInterfaceBloatSmall02\n}\n\ntype InterfaceBloatExample06 interface {\n\tinterface { // want \"the interface has more than 10 methods: 11\"\n\t\ta01() time.Duration\n\t\ta02()\n\t\ta03()\n\t\ta04()\n\t\ta05()\n\t\ta06()\n\t\ta07()\n\t\ta08()\n\t\ta09()\n\t\ta10()\n\t\ta11()\n\t}\n}\n\ntype InterfaceBloatTypeGeneric interface {\n\t~uint8 | ~uint16 | ~uint32 | ~uint64 | uint |\n\t\t~int8 | ~int16 | ~int32 | ~int64 | int |\n\t\t~float32 | ~float64 |\n\t\t~string\n}\n\nfunc InterfaceBloatExampleNoProblem() interface {\n\ta01() time.Duration\n\ta02()\n\ta03()\n\ta04()\n\ta05()\n\ta06()\n\ta07()\n\ta08()\n\ta09()\n\ta10()\n} {\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/interfacebloat/testdata/interfacebloat_cgo.go",
    "content": "//golangcitest:args -Einterfacebloat\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype _ interface { // want \"the interface has more than 10 methods: 11\"\n\ta01() time.Duration\n\ta02()\n\ta03()\n\ta04()\n\ta05()\n\ta06()\n\ta07()\n\ta08()\n\ta09()\n\ta10()\n\ta11()\n}\n"
  },
  {
    "path": "pkg/golinters/internal/commons.go",
    "content": "package internal\n\nimport \"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\n// LinterLogger must be use only when the context logger is not available.\nvar LinterLogger = logutils.NewStderrLog(logutils.DebugKeyLinter)\n"
  },
  {
    "path": "pkg/golinters/internal/util.go",
    "content": "package internal\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc FormatCode(code string) string {\n\tif strings.Contains(code, \"`\") {\n\t\treturn code // TODO: properly escape or remove\n\t}\n\n\treturn fmt.Sprintf(\"`%s`\", code)\n}\n\nfunc GetGoFileNames(pass *analysis.Pass) []string {\n\tvar filenames []string\n\n\tfor _, f := range pass.Files {\n\t\tposition, b := goanalysis.GetGoFilePosition(pass, f)\n\t\tif !b {\n\t\t\tcontinue\n\t\t}\n\n\t\tfilenames = append(filenames, position.Filename)\n\t}\n\n\treturn filenames\n}\n"
  },
  {
    "path": "pkg/golinters/intrange/intrange.go",
    "content": "package intrange\n\nimport (\n\t\"github.com/ckaznocha/intrange\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(intrange.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/intrange/intrange_integration_test.go",
    "content": "package intrange\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/intrange/testdata/fix/in/intrange.go",
    "content": "//go:build go1.22\n\n//golangcitest:args -Eintrange\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"math\"\n\nfunc CheckIntrange() {\n\tfor i := 0; i < 10; i++ {\n\t}\n\n\tfor i := uint8(0); i < math.MaxInt8; i++ {\n\t}\n\n\tfor i := 0; i < 10; i += 2 {\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\ti += 1\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/intrange/testdata/fix/out/intrange.go",
    "content": "//go:build go1.22\n\n//golangcitest:args -Eintrange\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"math\"\n\nfunc CheckIntrange() {\n\tfor range 10 {\n\t}\n\n\tfor range uint8(math.MaxInt8) {\n\t}\n\n\tfor i := 0; i < 10; i += 2 {\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\ti += 1\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/intrange/testdata/intrange.go",
    "content": "//go:build go1.22\n\n//golangcitest:args -Eintrange\npackage testdata\n\nimport \"math\"\n\nfunc CheckIntrange() {\n\tfor i := 0; i < 10; i++ { // want `for loop can be changed to use an integer range \\(Go 1\\.22\\+\\)`\n\t}\n\n\tfor i := uint8(0); i < math.MaxInt8; i++ { // want `for loop can be changed to use an integer range \\(Go 1\\.22\\+\\)`\n\t}\n\n\tfor i := 0; i < 10; i += 2 {\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\ti += 1\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/intrange/testdata/intrange_cgo.go",
    "content": "//go:build go1.22\n\n//golangcitest:args -Eintrange\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc CheckIntrange() {\n\tfor i := 0; i < 10; i++ { // want `for loop can be changed to use an integer range \\(Go 1\\.22\\+\\)`\n\t}\n\n\tfor i := uint8(0); i < math.MaxInt8; i++ { // want `for loop can be changed to use an integer range \\(Go 1\\.22\\+\\)`\n\t}\n\n\tfor i := 0; i < 10; i += 2 {\n\t}\n\n\tfor i := 0; i < 10; i++ {\n\t\ti += 1\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/iotamixing/iotamixing.go",
    "content": "package iotamixing\n\nimport (\n\tim \"github.com/AdminBenni/iota-mixing/pkg/analyzer\"\n\t\"github.com/AdminBenni/iota-mixing/pkg/analyzer/flags\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.IotaMixingSettings) *goanalysis.Linter {\n\tcfg := map[string]any{}\n\n\tif settings != nil {\n\t\tcfg[flags.ReportIndividualFlagName] = settings.ReportIndividual\n\t}\n\n\tanalyzer := im.GetIotaMixingAnalyzer()\n\n\tflags.SetupFlags(&analyzer.Flags)\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/iotamixing/iotamixing_integration_test.go",
    "content": "package iotamixing\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/iotamixing/testdata/iotamixing.go",
    "content": "//golangcitest:args -Eiotamixing\npackage testdata\n\nimport \"fmt\"\n\n// iota mixing in const block containing an iota and r-val declared above.\nconst ( // want \"iota mixing. keep iotas in separate blocks to consts with r-val\"\n\tInvalidPerBlockIotaDeclAboveAnything = \"anything\"\n\tInvalidPerBlockIotaDeclAboveNotZero  = iota\n\tInvalidPerBlockIotaDeclAboveNotOne\n\tInvalidPerBlockIotaDeclAboveNotTwo\n)\n\n// iota mixing in const block containing an iota and r-val declared below.\nconst ( // want \"iota mixing. keep iotas in separate blocks to consts with r-val\"\n\tInvalidPerBlockIotaDeclBelowZero = iota\n\tInvalidPerBlockIotaDeclBelowOne\n\tInvalidPerBlockIotaDeclBelowTwo\n\tInvalidPerBlockIotaDeclBelowAnything = \"anything\"\n)\n\n// iota mixing in const block containing an iota and r-val declared between consts.\nconst ( // want \"iota mixing. keep iotas in separate blocks to consts with r-val\"\n\tInvalidPerBlockIotaDeclBetweenZero = iota\n\tInvalidPerBlockIotaDeclBetweenOne\n\tInvalidPerBlockIotaDeclBetweenAnything = \"anything\"\n\tInvalidPerBlockIotaDeclBetweenNotTwo\n)\n\n// iota mixing in const block containing an iota and r-vals declared above, between, and below consts.\nconst ( // want \"iota mixing. keep iotas in separate blocks to consts with r-val\"\n\tInvalidPerBlockIotaDeclMultipleAbove   = \"above\"\n\tInvalidPerBlockIotaDeclMultipleNotZero = iota\n\tInvalidPerBlockIotaDeclMultipleNotOne\n\tInvalidPerBlockIotaDeclMultipleBetween = \"between\"\n\tInvalidPerBlockIotaDeclMultipleNotTwo\n\tInvalidPerBlockIotaDeclMultipleBelow = \"below\"\n)\n\n// no iota mixing in a const block containing an iota and no r-vals.\nconst (\n\tValidPerBlockIotaZero = iota\n\tValidPerBlockIotaOne\n\tValidPerBlockIotaTwo\n)\n\n// no iota mixing in a const block containing r-vals and no iota.\nconst (\n\tValidPerBlockRegularSomething = \"something\"\n\tValidPerBlockRegularAnything  = \"anything\"\n)\n\nfunc _() {\n\tfmt.Println(\"using the std import so goland doesn't nuke it\")\n}\n"
  },
  {
    "path": "pkg/golinters/iotamixing/testdata/iotamixing_report-individual.go",
    "content": "//golangcitest:args -Eiotamixing\n//golangcitest:config_path testdata/iotamixing_report-individual.yml\npackage testdata\n\nimport \"fmt\"\n\nconst (\n\tInvalidPerIndividualIotaDeclAboveAnything = \"anything\" // want \"InvalidPerIndividualIotaDeclAboveAnything is a const with r-val in same const block as iota. keep iotas in separate const blocks\"\n\tInvalidPerIndividualIotaDeclAboveNotZero  = iota\n\tInvalidPerIndividualIotaDeclAboveNotOne\n\tInvalidPerIndividualIotaDeclAboveNotTwo\n)\n\nconst (\n\tInvalidPerIndividualIotaDeclBelowZero = iota\n\tInvalidPerIndividualIotaDeclBelowOne\n\tInvalidPerIndividualIotaDeclBelowTwo\n\tInvalidPerIndividualIotaDeclBelowAnything = \"anything\" // want \"InvalidPerIndividualIotaDeclBelowAnything is a const with r-val in same const block as iota. keep iotas in separate const blocks\"\n)\n\nconst (\n\tInvalidPerIndividualIotaDeclBetweenZero = iota\n\tInvalidPerIndividualIotaDeclBetweenOne\n\tInvalidPerIndividualIotaDeclBetweenAnything = \"anything\" // want \"InvalidPerIndividualIotaDeclBetweenAnything is a const with r-val in same const block as iota. keep iotas in separate const blocks\"\n\tInvalidPerIndividualIotaDeclBetweenNotTwo\n)\n\nconst (\n\tInvalidPerIndividualIotaDeclMultipleAbove   = \"above\" // want \"InvalidPerIndividualIotaDeclMultipleAbove is a const with r-val in same const block as iota. keep iotas in separate const blocks\"\n\tInvalidPerIndividualIotaDeclMultipleNotZero = iota\n\tInvalidPerIndividualIotaDeclMultipleNotOne\n\tInvalidPerIndividualIotaDeclMultipleBetween = \"between\" // want \"InvalidPerIndividualIotaDeclMultipleBetween is a const with r-val in same const block as iota. keep iotas in separate const blocks\"\n\tInvalidPerIndividualIotaDeclMultipleNotTwo\n\tInvalidPerIndividualIotaDeclMultipleBelow = \"below\" // want \"InvalidPerIndividualIotaDeclMultipleBelow is a const with r-val in same const block as iota. keep iotas in separate const blocks\"\n)\n\nconst (\n\tValidPerIndividualIotaZero = iota\n\tValidPerIndividualIotaOne\n\tValidPerIndividualIotaTwo\n)\n\nconst (\n\tValidPerIndividualRegularSomething = \"something\"\n\tValidPerIndividualRegularAnything  = \"anything\"\n)\n\nfunc _() {\n\tfmt.Println(\"using the std import so goland doesn't nuke it\")\n}\n"
  },
  {
    "path": "pkg/golinters/iotamixing/testdata/iotamixing_report-individual.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    iotamixing:\n      report-individual: true\n"
  },
  {
    "path": "pkg/golinters/ireturn/ireturn.go",
    "content": "package ireturn\n\nimport (\n\t\"strings\"\n\n\t\"github.com/butuzov/ireturn/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.IreturnSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"allow\":    strings.Join(settings.Allow, \",\"),\n\t\t\t\"reject\":   strings.Join(settings.Reject, \",\"),\n\t\t\t\"nonolint\": true,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/ireturn/ireturn_integration_test.go",
    "content": "package ireturn\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn.go",
    "content": "//golangcitest:args -Eireturn\npackage testdata\n\ntype (\n\tIreturnDoer interface{ Do() }\n\tireturnDoer struct{}\n)\n\nfunc New() IreturnDoer     { return new(ireturnDoer) } // want `New returns interface \\(command-line-arguments.IreturnDoer\\)`\nfunc (d *ireturnDoer) Do() { /*...*/ }\n\nfunc Newer() *ireturnDoer { return new(ireturnDoer) }\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn_allow.go",
    "content": "//golangcitest:args -Eireturn\n//golangcitest:config_path testdata/ireturn_allow.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\ntype (\n\tIreturnAllowDoer interface{ Do() }\n\tireturnAllowDoer struct{}\n)\n\nfunc NewAllowDoer() IreturnAllowDoer { return new(ireturnAllowDoer) }\nfunc (d *ireturnAllowDoer) Do()      { /*...*/ }\n\nfunc NewerAllowDoer() *ireturnAllowDoer { return new(ireturnAllowDoer) }\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn_allow.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ireturn:\n      allow:\n      - IreturnAllowDoer\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn_cgo.go",
    "content": "//golangcitest:args -Eireturn\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype (\n\tIreturnDoer interface{ Do() }\n\tireturnDoer struct{}\n)\n\nfunc _() IreturnDoer       { return new(ireturnDoer) } // want `_ returns interface \\(command-line-arguments.IreturnDoer\\)`\nfunc (d *ireturnDoer) Do() { /*...*/ }\n\nfunc _() *ireturnDoer { return new(ireturnDoer) }\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn_reject_generics.go",
    "content": "//golangcitest:args -Eireturn\n//golangcitest:config_path testdata/ireturn_reject_generics.yml\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"io\"\n)\n\nfunc NewWriter() io.Writer {\n\tvar buf bytes.Buffer\n\treturn &buf\n}\n\nfunc TestError() error {\n\treturn nil\n}\n\nfunc Get[K comparable, V int64 | float64](m map[K]V) V { // want `Get returns generic interface \\(V\\)`\n\tvar s V\n\tfor _, v := range m {\n\t\ts += v\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn_reject_generics.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ireturn:\n      reject:\n      - generic\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn_reject_stdlib.go",
    "content": "//golangcitest:args -Eireturn\n//golangcitest:config_path testdata/ireturn_reject_stdlib.yml\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"io\"\n)\n\nfunc NewWriter() io.Writer { // want `NewWriter returns interface \\(io.Writer\\)`\n\tvar buf bytes.Buffer\n\treturn &buf\n}\n\nfunc TestError() error {\n\treturn nil\n}\n\ntype Foo interface {\n\tFoo()\n}\ntype foo int\n\nfunc (f foo) Foo() {}\n\nfunc NewFoo() Foo {\n\treturn foo(1)\n}\n"
  },
  {
    "path": "pkg/golinters/ireturn/testdata/ireturn_reject_stdlib.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    ireturn:\n      reject:\n      - stdlib\n"
  },
  {
    "path": "pkg/golinters/lll/lll.go",
    "content": "package lll\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"os\"\n\t\"strings\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nconst goCommentDirectivePrefix = \"//go:\"\n\nfunc New(settings *config.LllSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"lll\",\n\t\t\tDoc:  \"Reports long lines\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\terr := runLll(pass, settings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runLll(pass *analysis.Pass, settings *config.LllSettings) error {\n\tspaces := strings.Repeat(\" \", settings.TabWidth)\n\n\tfor _, file := range pass.Files {\n\t\terr := getLLLIssuesForFile(pass, file, settings.LineLength, spaces)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc getLLLIssuesForFile(pass *analysis.Pass, file *ast.File, maxLineLen int, tabSpaces string) error {\n\tposition, isGoFile := goanalysis.GetGoFilePosition(pass, file)\n\tif !isGoFile {\n\t\treturn nil\n\t}\n\n\tnonAdjPosition := pass.Fset.PositionFor(file.Pos(), false)\n\n\tf, err := os.Open(position.Filename)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't open file %s: %w\", position.Filename, err)\n\t}\n\n\tdefer f.Close()\n\n\tft := pass.Fset.File(file.Pos())\n\n\tlineNumber := 0\n\tmultiImportEnabled := false\n\n\tscanner := bufio.NewScanner(f)\n\tfor scanner.Scan() {\n\t\tlineNumber++\n\n\t\tline := scanner.Text()\n\t\tline = strings.ReplaceAll(line, \"\\t\", tabSpaces)\n\n\t\tif strings.HasPrefix(line, goCommentDirectivePrefix) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif strings.HasPrefix(line, \"import\") {\n\t\t\tmultiImportEnabled = strings.HasSuffix(line, \"(\")\n\t\t\tcontinue\n\t\t}\n\n\t\tif multiImportEnabled {\n\t\t\tif line == \")\" {\n\t\t\t\tmultiImportEnabled = false\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\tlineLen := utf8.RuneCountInString(line)\n\t\tif lineLen > maxLineLen {\n\t\t\tpass.Report(analysis.Diagnostic{\n\t\t\t\tPos: ft.LineStart(goanalysis.AdjustPos(lineNumber, nonAdjPosition.Line, position.Line)),\n\t\t\t\tMessage: fmt.Sprintf(\"The line is %d characters long, which exceeds the maximum of %d characters.\",\n\t\t\t\t\tlineLen, maxLineLen),\n\t\t\t})\n\t\t}\n\t}\n\n\tif err := scanner.Err(); err != nil {\n\t\t// scanner.Scan() might fail if the line is longer than bufio.MaxScanTokenSize\n\t\t// In the case where the specified maxLineLen is smaller than bufio.MaxScanTokenSize\n\t\t// we can return this line as a long line instead of returning an error.\n\t\t// The reason for this change is that this case might happen with autogenerated files\n\t\t// The go-bindata tool for instance might generate a file with a very long line.\n\t\t// In this case, as it's an auto generated file, the warning returned by lll will\n\t\t// be ignored.\n\t\t// But if we return a linter error here, and this error happens for an autogenerated\n\t\t// file the error will be discarded (fine), but all the subsequent errors for lll will\n\t\t// be discarded for other files, and we'll miss legit error.\n\t\tif errors.Is(err, bufio.ErrTooLong) && maxLineLen < bufio.MaxScanTokenSize {\n\t\t\tpass.Report(analysis.Diagnostic{\n\t\t\t\tPos:     ft.LineStart(goanalysis.AdjustPos(lineNumber, nonAdjPosition.Line, position.Line)),\n\t\t\t\tMessage: fmt.Sprintf(\"line is more than %d characters\", bufio.MaxScanTokenSize),\n\t\t\t})\n\t\t} else {\n\t\t\treturn fmt.Errorf(\"can't scan file %s: %w\", position.Filename, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/lll/lll_integration_test.go",
    "content": "package lll\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll.go",
    "content": "//golangcitest:args -Elll\n//golangcitest:config_path testdata/lll.yml\npackage testdata\n\nimport (\n\t_ \"unsafe\"\n)\n\nfunc Lll() {\n\t// want +1 \"line is 141 characters\"\n\t// In my experience, long lines are the lines with comments, not the code. So this is a long comment, a very long comment, yes very long.\n}\n\n//go:generate mockgen -source lll.go -destination a_verylong_generate_mock_my_lll_interface.go --package testdata -self_package github.com/golangci/golangci-lint/test/testdata\ntype MyLllInterface interface {\n}\n\n//go:linkname VeryLongNameForTestAndLinkNameFunction github.com/golangci/golangci-lint/test/testdata.VeryLongNameForTestAndLinkedNameFunction\nfunc VeryLongNameForTestAndLinkNameFunction()\n\nfunc VeryLongNameForTestAndLinkedNameFunction() {}\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    lll:\n      tab-width: 4\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll_cgo.go",
    "content": "//golangcitest:args -Elll\n//golangcitest:config_path testdata/lll.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\n// want +1 \"The line is 137 characters long, which exceeds the maximum of 120 characters.\"\n// In my experience, long lines are the lines with comments, not the code. So this is a long comment, a very long comment, yes very long.\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll_import.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    lll:\n      tab-width: 4\n      line-length: 60\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll_import_multi.go",
    "content": "//golangcitest:args -Elll\n//golangcitest:config_path testdata/lll_import.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\tanotherVeryLongImportAliasNameForTest \"github.com/golangci/golangci-lint/v2/internal/golinters\"\n\tveryLongImportAliasNameForTest \"github.com/golangci/golangci-lint/v2/internal/golinters\"\n)\n\nfunc LllMultiImport() {\n\t_ = veryLongImportAliasNameForTest.NewLLL(nil)\n\t_ = anotherVeryLongImportAliasNameForTest.NewLLL(nil)\n}\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll_import_single.go",
    "content": "//golangcitest:args -Elll\n//golangcitest:config_path testdata/lll_import.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport veryLongImportAliasNameForTest \"github.com/golangci/golangci-lint/v2/internal/golinters\"\n\nfunc LllSingleImport() {\n\t_ = veryLongImportAliasNameForTest.NewLLL(nil)\n}\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll_max_scan_token_size.go",
    "content": "//golangcitest:args -Elll\n//golangcitest:config_path testdata/lll.yml\npackage testdata\n\n// want \"line is more than 65536 characters\"\n// Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus.\n"
  },
  {
    "path": "pkg/golinters/lll/testdata/lll_max_scan_token_size_cgo.go",
    "content": "//golangcitest:args -Elll\n//golangcitest:config_path testdata/lll.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n// want \"line is more than 65536 characters\"\n// Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus vestibulum. Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio. Praesent venenatis metus at tortor pulvinar varius. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut eros et nisl sagittis vestibulum. Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede. Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. Etiam imperdiet imperdiet orci. Nunc nec neque. Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi. Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo. Maecenas malesuada. Praesent congue erat at massa. Sed cursus turpis vitae tortor. Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci. Phasellus consectetuer vestibulum elit. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Vestibulum fringilla pede sit amet augue. In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis. Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus. Ut varius tincidunt libero. Phasellus dolor. Maecenas vestibulum mollis diam. Pellentesque ut neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In dui magna, posuere eget, vestibulum et, tempor auctor, justo. In ac felis quis tortor malesuada pretium. Pellentesque auctor neque nec urna. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Aenean viverra rhoncus pede. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut non enim eleifend felis pretium feugiat. Vivamus quis mi. Phasellus a est. Phasellus magna. In hac habitasse platea dictumst. Curabitur at lacus ac velit ornare lobortis. Curabitur a felis in nunc fringilla tristique. Morbi mattis ullamcorper velit. Phasellus gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et, tincidunt eget, semper nec, quam. Sed hendrerit. Morbi ac felis. Nunc egestas, augue at pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede. Donec interdum, metus et hendrerit aliquet, dolor diam sagittis ligula, eget egestas libero turpis vel mi. Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh. Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed augue ipsum, egestas nec, vestibulum et, malesuada adipiscing, dui. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Mauris sollicitudin fermentum libero. Praesent nonummy mi in odio. Nunc interdum lacus sit amet orci. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi mollis tellus ac sapien. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent metus tellus, elementum eu, semper a, adipiscing nec, purus. Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo. Suspendisse feugiat. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent nec nisl a purus blandit viverra. Praesent ac massa at ligula laoreet iaculis. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit. Mauris turpis nunc, blandit et, volutpat molestie, porta ut, ligula. Fusce pharetra convallis urna. Quisque ut nisi. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Suspendisse non nisl sit amet velit hendrerit rutrum. Ut leo. Ut a nisl id ante tempus hendrerit. Proin pretium, leo ac pellentesque mollis, felis nunc ultrices eros, sed gravida augue augue mollis justo. Suspendisse eu ligula. Nulla facilisi. Donec id justo. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Curabitur suscipit suscipit tellus. Praesent vestibulum dapibus nibh. Etiam iaculis nunc ac metus. Ut id nisl quis enim dignissim sagittis. Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis ante odio sit amet eros. Proin magna. Duis vel nibh at velit scelerisque suscipit. Curabitur turpis. Vestibulum suscipit nulla quis orci. Fusce ac felis sit amet ligula pharetra condimentum. Maecenas egestas arcu quis ligula mattis placerat. Duis lobortis massa imperdiet quam. Suspendisse potenti. Pellentesque commodo eros a enim. Vestibulum turpis sem, aliquet eget, lobortis pellentesque, rutrum eu, nisl. Sed libero. Aliquam erat volutpat. Etiam vitae tortor. Morbi vestibulum volutpat enim. Aliquam eu nunc. Nunc sed turpis. Sed mollis, eros et ultrices tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Nulla porta dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque dapibus hendrerit tortor. Praesent egestas tristique nibh. Sed a libero. Cras varius. Donec vitae orci sed dolor rutrum auctor. Fusce egestas elit eget lorem. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Nam at tortor in tellus interdum sagittis. Aliquam lobortis. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Curabitur blandit mollis lacus. Nam adipiscing. Vestibulum eu odio. Vivamus laoreet. Nullam tincidunt adipiscing enim. Phasellus tempus. Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien, a accumsan nisi mauris ac eros. Fusce neque. Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vivamus aliquet elit ac nisl. Fusce fermentum odio nec arcu. Vivamus euismod mauris. In ut quam vitae odio lacinia tincidunt. Praesent ut ligula non mi varius sagittis. Cras sagittis. Praesent ac sem eget est egestas volutpat. Vivamus consectetuer hendrerit lacus. Cras non dolor. Vivamus in erat ut urna cursus.\n"
  },
  {
    "path": "pkg/golinters/loggercheck/loggercheck.go",
    "content": "package loggercheck\n\nimport (\n\t\"github.com/timonwong/loggercheck\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.LoggerCheckSettings) *goanalysis.Linter {\n\tvar opts []loggercheck.Option\n\n\tif settings != nil {\n\t\tvar disable []string\n\t\tif !settings.Kitlog {\n\t\t\tdisable = append(disable, \"kitlog\")\n\t\t}\n\t\tif !settings.Klog {\n\t\t\tdisable = append(disable, \"klog\")\n\t\t}\n\t\tif !settings.Logr {\n\t\t\tdisable = append(disable, \"logr\")\n\t\t}\n\t\tif !settings.Slog {\n\t\t\tdisable = append(disable, \"slog\")\n\t\t}\n\t\tif !settings.Zap {\n\t\t\tdisable = append(disable, \"zap\")\n\t\t}\n\n\t\topts = []loggercheck.Option{\n\t\t\tloggercheck.WithDisable(disable),\n\t\t\tloggercheck.WithRequireStringKey(settings.RequireStringKey),\n\t\t\tloggercheck.WithRules(settings.Rules),\n\t\t\tloggercheck.WithNoPrintfLike(settings.NoPrintfLike),\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(loggercheck.NewAnalyzer(opts...)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/loggercheck_integration_test.go",
    "content": "package loggercheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/go.mod",
    "content": "module loggercheck\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/go-kit/log v0.2.1\n\tgithub.com/go-logr/logr v1.4.3\n\tgo.uber.org/zap v1.27.1\n\tk8s.io/klog/v2 v2.130.1\n)\n\nrequire (\n\tgithub.com/go-logfmt/logfmt v0.6.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n)\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/go.sum",
    "content": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=\ngithub.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=\ngithub.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=\ngo.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nk8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=\nk8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_cgo.go",
    "content": "//golangcitest:args -Eloggercheck\npackage loggercheck\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"log/slog\"\n\t\"unsafe\"\n\n\t\"github.com/go-logr/logr\"\n\t\"go.uber.org/zap\"\n\t\"k8s.io/klog/v2\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc ExampleDefaultLogr() {\n\tlog := logr.Discard()\n\tlog = log.WithValues(\"key\")                                         // want `odd number of arguments passed as key-value pairs for logging`\n\tlog.Info(\"message\", \"key1\", \"value1\", \"key2\", \"value2\", \"key3\")     // want `odd number of arguments passed as key-value pairs for logging`\n\tlog.Error(fmt.Errorf(\"error\"), \"message\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n\tlog.Error(fmt.Errorf(\"error\"), \"message\", \"key1\", \"value1\", \"key2\", \"value2\")\n}\n\nfunc ExampleDefaultKlog() {\n\tklog.InfoS(\"message\", \"key1\") // want `odd number of arguments passed as key-value pairs for logging`\n}\n\nfunc ExampleZapSugarNotChecked() {\n\tsugar := zap.NewExample().Sugar()\n\tdefer sugar.Sync()\n\tsugar.Infow(\"message\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n}\n\nfunc ExampleSlog() {\n\tlogger := slog.With(\"key1\", \"value1\")\n\n\tlogger.Info(\"msg\", \"key1\") // want `odd number of arguments passed as key-value pairs for logging`\n\tslog.Info(\"msg\", \"key1\")   // want `odd number of arguments passed as key-value pairs for logging`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_custom.go",
    "content": "//golangcitest:args -Eloggercheck\n//golangcitest:config_path testdata/loggercheck_custom.yml\npackage loggercheck\n\nimport (\n\t\"errors\"\n\n\t\"go.uber.org/zap\"\n)\n\nvar l = New()\n\ntype Logger struct {\n\ts *zap.SugaredLogger\n}\n\nfunc New() *Logger {\n\tlogger := zap.NewExample().Sugar()\n\treturn &Logger{s: logger}\n}\n\nfunc (l *Logger) With(keysAndValues ...interface{}) *Logger {\n\treturn &Logger{\n\t\ts: l.s.With(keysAndValues...),\n\t}\n}\n\nfunc (l *Logger) Debugw(msg string, keysAndValues ...interface{}) {\n\tl.s.Debugw(msg, keysAndValues...)\n}\n\nfunc (l *Logger) Infow(msg string, keysAndValues ...interface{}) {\n\tl.s.Infow(msg, keysAndValues...)\n}\n\nfunc (l *Logger) Warnw(msg string, keysAndValues ...interface{}) {\n\tl.s.Warnw(msg, keysAndValues...)\n}\n\nfunc (l *Logger) Errorw(msg string, keysAndValues ...interface{}) {\n\tl.s.Errorw(msg, keysAndValues...)\n}\n\nfunc (l *Logger) Fatalw(msg string, keysAndValues ...interface{}) {\n\tl.s.Fatalw(msg, keysAndValues...)\n}\n\nfunc (l *Logger) Sync() error {\n\treturn l.s.Sync()\n}\n\n// package level wrap func\n\nfunc With(keysAndValues ...interface{}) *Logger {\n\treturn &Logger{\n\t\ts: l.s.With(keysAndValues...),\n\t}\n}\n\nfunc Debugw(msg string, keysAndValues ...interface{}) {\n\tl.s.Debugw(msg, keysAndValues...)\n}\n\nfunc Infow(msg string, keysAndValues ...interface{}) {\n\tl.s.Infow(msg, keysAndValues...)\n}\n\nfunc Warnw(msg string, keysAndValues ...interface{}) {\n\tl.s.Warnw(msg, keysAndValues...)\n}\n\nfunc Errorw(msg string, keysAndValues ...interface{}) {\n\tl.s.Errorw(msg, keysAndValues...)\n}\n\nfunc Fatalw(msg string, keysAndValues ...interface{}) {\n\tl.s.Fatalw(msg, keysAndValues...)\n}\n\nfunc Sync() error {\n\treturn l.s.Sync()\n}\n\nfunc ExampleCustomLogger() {\n\terr := errors.New(\"example error\")\n\n\t// custom SugaredLogger\n\tlog := New()\n\tdefer log.Sync()\n\n\tlog.Infow(\"abc\", \"key1\", \"value1\")\n\tlog.Infow(\"abc\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n\n\tlog.Errorw(\"message\", \"err\", err, \"key1\", \"value1\")\n\tlog.Errorw(\"message\", err, \"key1\", \"value1\", \"key2\", \"value2\") // want `odd number of arguments passed as key-value pairs for logging`\n\n\t// with test\n\tlog.With(\"with_key1\", \"with_value1\").Infow(\"message\", \"key1\", \"value1\")\n\tlog.With(\"with_key1\", \"with_value1\").Infow(\"message\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n\tlog.With(\"with_key1\").Infow(\"message\", \"key1\", \"value1\")                        // want `odd number of arguments passed as key-value pairs for logging`\n}\n\nfunc ExampleCustomLoggerPackageLevelFunc() {\n\terr := errors.New(\"example error\")\n\n\tdefer Sync()\n\n\tInfow(\"abc\", \"key1\", \"value1\")\n\tInfow(\"abc\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n\n\tErrorw(\"message\", \"err\", err, \"key1\", \"value1\")\n\tErrorw(\"message\", err, \"key1\", \"value1\", \"key2\", \"value2\") // want `odd number of arguments passed as key-value pairs for logging`\n\n\t// with test\n\tWith(\"with_key1\", \"with_value1\").Infow(\"message\", \"key1\", \"value1\")\n\tWith(\"with_key1\", \"with_value1\").Infow(\"message\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n\tWith(\"with_key1\").Infow(\"message\", \"key1\", \"value1\")                        // want `odd number of arguments passed as key-value pairs for logging`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    loggercheck:\n      rules:\n        - (*command-line-arguments.Logger).Debugw\n        - (*command-line-arguments.Logger).Infow\n        - (*command-line-arguments.Logger).Warnw\n        - (*command-line-arguments.Logger).Errorw\n        - (*command-line-arguments.Logger).With\n        - command-line-arguments.Debugw\n        - command-line-arguments.Infow\n        - command-line-arguments.Warnw\n        - command-line-arguments.Errorw\n        - command-line-arguments.With\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_default.go",
    "content": "//golangcitest:args -Eloggercheck\npackage loggercheck\n\nimport (\n\t\"fmt\"\n\t\"log/slog\"\n\n\t\"github.com/go-logr/logr\"\n\t\"go.uber.org/zap\"\n\t\"k8s.io/klog/v2\"\n)\n\nfunc ExampleDefaultLogr() {\n\tlog := logr.Discard()\n\tlog = log.WithValues(\"key\")                                         // want `odd number of arguments passed as key-value pairs for logging`\n\tlog.Info(\"message\", \"key1\", \"value1\", \"key2\", \"value2\", \"key3\")     // want `odd number of arguments passed as key-value pairs for logging`\n\tlog.Error(fmt.Errorf(\"error\"), \"message\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n\tlog.Error(fmt.Errorf(\"error\"), \"message\", \"key1\", \"value1\", \"key2\", \"value2\")\n}\n\nfunc ExampleDefaultKlog() {\n\tklog.InfoS(\"message\", \"key1\") // want `odd number of arguments passed as key-value pairs for logging`\n}\n\nfunc ExampleZapSugarNotChecked() {\n\tsugar := zap.NewExample().Sugar()\n\tdefer sugar.Sync()\n\tsugar.Infow(\"message\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n}\n\nfunc ExampleSlog() {\n\tlogger := slog.With(\"key1\", \"value1\")\n\n\tlogger.Info(\"msg\", \"key1\") // want `odd number of arguments passed as key-value pairs for logging`\n\tslog.Info(\"msg\", \"key1\")   // want `odd number of arguments passed as key-value pairs for logging`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_kitlogonly.go",
    "content": "//golangcitest:args -Eloggercheck\n//golangcitest:config_path testdata/loggercheck_kitlogonly.yml\npackage loggercheck\n\nimport (\n\tkitlog \"github.com/go-kit/log\"\n\t\"github.com/go-logr/logr\"\n\t\"go.uber.org/zap\"\n\t\"k8s.io/klog/v2\"\n)\n\nfunc ExampleKitLogOnly_NoLogr() {\n\tlog := logr.Discard()\n\tlog.Info(\"message\", \"key1\", \"value1\", \"key2\", \"value2\", \"key3\")\n\tklog.InfoS(\"message\", \"key1\")\n\n\tsugar := zap.NewExample().Sugar()\n\tsugar.Infow(\"message\", \"key1\", \"value1\", \"key2\")\n\tsugar.Errorw(\"error message\", \"key1\")\n}\n\nfunc ExampleKitLogOnly() {\n\tlogger := kitlog.NewNopLogger()\n\n\tlogger.Log(\"msg\", \"message\", \"key1\", \"value1\")\n\tlogger.Log(\"msg\")                    // want `odd number of arguments passed as key-value pairs for logging`\n\tlogger.Log(\"msg\", \"message\", \"key1\") // want `odd number of arguments passed as key-value pairs for logging`\n\n\tkitlog.With(logger, \"key1\", \"value1\").Log(\"msg\", \"message\")\n\tkitlog.With(logger, \"key1\").Log(\"msg\", \"message\") // want `odd number of arguments passed as key-value pairs for logging`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_kitlogonly.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    loggercheck:\n      kitlog: true\n      klog: false\n      logr: false\n      slog: false\n      zap: false\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_logronly.go",
    "content": "//golangcitest:args -Eloggercheck\n//golangcitest:config_path testdata/loggercheck_logronly.yml\npackage loggercheck\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/go-logr/logr\"\n\t\"go.uber.org/zap\"\n\t\"k8s.io/klog/v2\"\n)\n\nfunc ExampleLogrOnly() {\n\tlog := logr.Discard()\n\tlog.Info(\"message\", \"key1\", \"value1\", \"key2\", \"value2\", \"key3\") // want `odd number of arguments passed as key-value pairs for logging`\n\n\tklog.InfoS(\"message\", \"key1\")\n\n\tsugar := zap.NewExample().Sugar()\n\tsugar.Infow(\"message\", \"key1\", \"value1\", \"key2\")\n\tsugar.Errorw(\"error message\", \"key1\")\n\n\t// Will not check by default (-requirestringkey)\n\tlog.Error(fmt.Errorf(\"error\"), \"message\", []byte(\"key1\"), \"value1\")\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_logronly.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    loggercheck:\n      logr: true\n      klog: false\n      slog: false\n      zap: false\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_noprintflike.go",
    "content": "//golangcitest:args -Eloggercheck\n//golangcitest:config_path testdata/loggercheck_noprintflike.yml\npackage loggercheck\n\nimport (\n\t\"github.com/go-logr/logr\"\n)\n\nfunc ExampleNoPrintfLike() {\n\tlog := logr.Discard()\n\n\tlog.Info(\"This message is ok\")\n\tlog.Info(\"Should not contains printf like format specifiers: %s %d %w\") // want `logging message should not use format specifier \"%s\"`\n\tlog.Info(\"It also checks for the key value pairs\", \"key\", \"value %.2f\") // want `logging message should not use format specifier \"%\\.2f\"`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_noprintflike.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    loggercheck:\n      no-printf-like: true\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_requirestringkey.go",
    "content": "//golangcitest:args -Eloggercheck\n//golangcitest:config_path testdata/loggercheck_requirestringkey.yml\npackage loggercheck\n\nimport (\n\t\"github.com/go-logr/logr\"\n)\n\nfunc ExampleRequireStringKey() {\n\tlog := logr.Discard()\n\tlog.Info(\"message\", \"key1\", \"value1\")\n\tconst key1 = \"key1\"\n\tlog.Info(\"message\", key1, \"value1\")\n\n\tkey2 := []byte(key1)\n\tlog.Info(\"message\", key2, \"value2\") // want `logging keys are expected to be inlined constant strings, please replace \"key2\" provided with string`\n\n\tkey3 := key1\n\tlog.Info(\"message\", key3, \"value3\") // want `logging keys are expected to be inlined constant strings, please replace \"key3\" provided with string`\n\n\tlog.Info(\"message\", \"键1\", \"value1\") // want `logging keys are expected to be alphanumeric strings, please remove any non-latin characters from \"键1\"`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_requirestringkey.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    loggercheck:\n      require-string-key: true\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_slogonly.go",
    "content": "//golangcitest:args -Eloggercheck\n//golangcitest:config_path testdata/loggercheck_slogonly.yml\npackage loggercheck\n\nimport \"log/slog\"\n\nfunc ExampleSlogOnly() {\n\tlogger := slog.With(\"key1\", \"value1\")\n\n\tlogger.Info(\"msg\", \"key1\") // want `odd number of arguments passed as key-value pairs for logging`\n\tslog.Info(\"msg\", \"key1\")   // want `odd number of arguments passed as key-value pairs for logging`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_slogonly.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    loggercheck:\n      logr: false\n      klog: false\n      slog: true\n      zap: false\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_zaponly.go",
    "content": "//golangcitest:args -Eloggercheck\n//golangcitest:config_path testdata/loggercheck_zaponly.yml\npackage loggercheck\n\nimport \"go.uber.org/zap\"\n\nfunc ExampleZapOnly() {\n\tsugar := zap.NewExample().Sugar()\n\n\tsugar.Infow(\"message\", \"key1\", \"value1\", \"key2\") // want `odd number of arguments passed as key-value pairs for logging`\n\tsugar.Errorw(\"error message\", \"key1\")            // want `odd number of arguments passed as key-value pairs for logging`\n}\n"
  },
  {
    "path": "pkg/golinters/loggercheck/testdata/loggercheck_zaponly.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    loggercheck:\n      logr: false\n      klog: false\n      slog: false\n      zap: true\n"
  },
  {
    "path": "pkg/golinters/maintidx/maintidx.go",
    "content": "package maintidx\n\nimport (\n\t\"github.com/yagipy/maintidx\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.MaintIdxSettings) *goanalysis.Linter {\n\tcfg := map[string]any{\n\t\t\"under\": 20,\n\t}\n\n\tif settings != nil {\n\t\tcfg[\"under\"] = settings.Under\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(maintidx.Analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/maintidx/maintidx_integration_test.go",
    "content": "package maintidx\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/maintidx/testdata/maintidx.go",
    "content": "//golangcitest:args -Emaintidx\npackage testdata\n\nfunc over20() {\n}\n\nfunc under20() { // want \"Function name: under20, Cyclomatic Complexity: 76, Halstead Volume: 1636.00, Maintainability Index: 17\"\n\tfor true {\n\t\tif false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/maintidx/testdata/maintidx_cgo.go",
    "content": "//golangcitest:args -Emaintidx\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() { // want \"Function name: _, Cyclomatic Complexity: 77, Halstead Volume: 1718.01, Maintainability Index: 17\"\n\tfor true {\n\t\tif false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tcase math.MaxInt:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/maintidx/testdata/maintidx_under_100.go",
    "content": "//golangcitest:args -Emaintidx\n//golangcitest:config_path testdata/maintidx_under_100.yml\npackage testdata\n\nfunc over20() { // want \"Function name: over20, Cyclomatic Complexity: 1, Halstead Volume: 8.00, Maintainability Index: 86\"\n}\n\nfunc under20() { // want \"Function name: under20, Cyclomatic Complexity: 76, Halstead Volume: 1636.00, Maintainability Index: 17\"\n\tfor true {\n\t\tif false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else if false {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else if false {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := 0\n\t\t\t\tswitch n {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/maintidx/testdata/maintidx_under_100.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    maintidx:\n      under: 100\n"
  },
  {
    "path": "pkg/golinters/makezero/makezero.go",
    "content": "package makezero\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ashanbrown/makezero/v2/makezero\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.MakezeroSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"makezero\",\n\t\t\tDoc:  \"Find slice declarations with non-zero initial length\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\terr := runMakeZero(pass, settings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runMakeZero(pass *analysis.Pass, settings *config.MakezeroSettings) error {\n\tzero := makezero.NewLinter(settings.Always)\n\n\tfor _, file := range pass.Files {\n\t\thints, err := zero.Run(pass.Fset, pass.TypesInfo, file)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"makezero linter failed on file %q: %w\", file.Name.String(), err)\n\t\t}\n\n\t\tfor _, hint := range hints {\n\t\t\tpass.Report(analysis.Diagnostic{\n\t\t\t\tPos:     hint.Pos(),\n\t\t\t\tMessage: hint.Details(),\n\t\t\t})\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/makezero/makezero_integration_test.go",
    "content": "package makezero\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/makezero/testdata/makezero.go",
    "content": "//golangcitest:args -Emakezero\npackage testdata\n\nimport \"math\"\n\nfunc Makezero() []int {\n\tx := make([]int, math.MaxInt8)\n\treturn append(x, 1) // want \"append to slice `x` with non-zero initialized length\"\n}\n\nfunc MakezeroMultiple() []int {\n\tx, y := make([]int, math.MaxInt8), make([]int, math.MaxInt8)\n\treturn append(x, // want \"append to slice `x` with non-zero initialized length\"\n\t\tappend(y, 1)...) // want \"append to slice `y` with non-zero initialized length\"\n}\n\nfunc MakezeroNolint() []int {\n\tx := make([]int, math.MaxInt8)\n\treturn append(x, 1) //nolint:makezero // ok that we're appending to an uninitialized slice\n}\n"
  },
  {
    "path": "pkg/golinters/makezero/testdata/makezero_always.go",
    "content": "//golangcitest:args -Emakezero\n//golangcitest:config_path testdata/makezero_always.yml\npackage testdata\n\nimport \"math\"\n\nfunc MakezeroAlways() []int {\n\tx := make([]int, math.MaxInt8) // want \"slice `x` does not have non-zero initial length\"\n\treturn x\n}\n\nfunc MakezeroAlwaysNolint() []int {\n\tx := make([]int, math.MaxInt8) //nolint:makezero // ok that this is not initialized\n\treturn x\n}\n"
  },
  {
    "path": "pkg/golinters/makezero/testdata/makezero_always.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    makezero:\n      always: true\n"
  },
  {
    "path": "pkg/golinters/makezero/testdata/makezero_cgo.go",
    "content": "//golangcitest:args -Emakezero\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() []int {\n\tx := make([]int, math.MaxInt8)\n\treturn append(x, 1) // want \"append to slice `x` with non-zero initialized length\"\n}\n"
  },
  {
    "path": "pkg/golinters/mirror/mirror.go",
    "content": "package mirror\n\nimport (\n\t\"github.com/butuzov/mirror\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\t// mirror only lints test files if the `--with-tests` flag is passed,\n\t// so we pass the `with-tests` flag as true to the analyzer before running it.\n\t// This can be turned off by using the regular golangci-lint flags such as `--tests` or `--skip-files`\n\t// or can be disabled per linter via exclude rules.\n\t// (see https://github.com/golangci/golangci-lint/issues/2527#issuecomment-1023707262)\n\tcfg := map[string]any{\n\t\t\"with-tests\": true,\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(mirror.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/mirror/mirror_integration_test.go",
    "content": "package mirror\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/mirror/testdata/fix/in/mirror.go",
    "content": "//golangcitest:args -Emirror\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"unicode/utf8\"\n)\n\nfunc foobar() {\n\t_ = utf8.RuneCount([]byte(\"foobar\"))\n}\n"
  },
  {
    "path": "pkg/golinters/mirror/testdata/fix/out/mirror.go",
    "content": "//golangcitest:args -Emirror\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"unicode/utf8\"\n)\n\nfunc foobar() {\n\t_ = utf8.RuneCountInString(\"foobar\")\n}\n"
  },
  {
    "path": "pkg/golinters/mirror/testdata/mirror.go",
    "content": "//golangcitest:args -Emirror\npackage testdata\n\nimport (\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\nfunc foobar() {\n\t_ = utf8.RuneCount([]byte(\"foobar\"))                                                                            // want `avoid allocations with utf8\\.RuneCountInString`\n\t_ = strings.Compare(string([]byte{'f', 'o', 'o', 'b', 'a', 'r'}), string([]byte{'f', 'o', 'o', 'b', 'a', 'r'})) // want `avoid allocations with bytes\\.Compare`\n}\n"
  },
  {
    "path": "pkg/golinters/mirror/testdata/mirror_cgo.go",
    "content": "//golangcitest:args -Emirror\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"strings\"\n\t\"unicode/utf8\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\t_ = utf8.RuneCount([]byte(\"foobar\"))                                                                            // want `avoid allocations with utf8\\.RuneCountInString`\n\t_ = strings.Compare(string([]byte{'f', 'o', 'o', 'b', 'a', 'r'}), string([]byte{'f', 'o', 'o', 'b', 'a', 'r'})) // want `avoid allocations with bytes\\.Compare`\n}\n"
  },
  {
    "path": "pkg/golinters/misspell/misspell.go",
    "content": "package misspell\n\nimport (\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/token\"\n\t\"strings\"\n\t\"unicode\"\n\n\t\"github.com/golangci/misspell\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nconst linterName = \"misspell\"\n\nfunc New(settings *config.MisspellSettings) *goanalysis.Linter {\n\treplacer, err := createMisspellReplacer(settings)\n\tif err != nil {\n\t\tinternal.LinterLogger.Fatalf(\"%s: %v\", linterName, err)\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Finds commonly misspelled English words\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tfor _, file := range pass.Files {\n\t\t\t\t\terr := runMisspellOnFile(pass, file, replacer, settings.Mode)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc createMisspellReplacer(settings *config.MisspellSettings) (*misspell.Replacer, error) {\n\treplacer := &misspell.Replacer{\n\t\tReplacements: misspell.DictMain,\n\t}\n\n\t// Figure out regional variations\n\tswitch strings.ToUpper(settings.Locale) {\n\tcase \"\":\n\t\t// nothing\n\tcase \"US\":\n\t\treplacer.AddRuleList(misspell.DictAmerican)\n\tcase \"UK\", \"GB\":\n\t\treplacer.AddRuleList(misspell.DictBritish)\n\tcase \"NZ\", \"AU\", \"CA\":\n\t\treturn nil, fmt.Errorf(\"unknown locale: %q\", settings.Locale)\n\t}\n\n\terr := appendExtraWords(replacer, settings.ExtraWords)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"process extra words: %w\", err)\n\t}\n\n\tif len(settings.IgnoreRules) != 0 {\n\t\treplacer.RemoveRule(settings.IgnoreRules)\n\t}\n\n\t// It can panic.\n\treplacer.Compile()\n\n\treturn replacer, nil\n}\n\nfunc runMisspellOnFile(pass *analysis.Pass, file *ast.File, replacer *misspell.Replacer, mode string) error {\n\tposition, isGoFile := goanalysis.GetGoFilePosition(pass, file)\n\tif !isGoFile {\n\t\treturn nil\n\t}\n\n\t// Uses the non-adjusted file to work with cgo:\n\t// if we read the real file, the positions are wrong in some cases.\n\tfileContent, err := pass.ReadFile(pass.Fset.PositionFor(file.Pos(), false).Filename)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't get file %s contents: %w\", position.Filename, err)\n\t}\n\n\t// `r.ReplaceGo` doesn't find issues inside strings: it searches only inside comments.\n\t// `r.Replace` searches all words: it treats input as a plain text.\n\t// The standalone misspell tool uses `r.Replace` by default.\n\tvar replace func(input string) (string, []misspell.Diff)\n\tswitch strings.ToLower(mode) {\n\tcase \"restricted\":\n\t\treplace = replacer.ReplaceGo\n\tdefault:\n\t\treplace = replacer.Replace\n\t}\n\n\tf := pass.Fset.File(file.Pos())\n\n\t_, diffs := replace(string(fileContent))\n\n\tfor _, diff := range diffs {\n\t\ttext := fmt.Sprintf(\"`%s` is a misspelling of `%s`\", diff.Original, diff.Corrected)\n\n\t\tstart := f.LineStart(diff.Line) + token.Pos(diff.Column)\n\t\tend := f.LineStart(diff.Line) + token.Pos(diff.Column+len(diff.Original))\n\n\t\tpass.Report(analysis.Diagnostic{\n\t\t\tPos:     start,\n\t\t\tEnd:     end,\n\t\t\tMessage: text,\n\t\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\tPos:     start,\n\t\t\t\t\tEnd:     end,\n\t\t\t\t\tNewText: []byte(diff.Corrected),\n\t\t\t\t}},\n\t\t\t}},\n\t\t})\n\t}\n\n\treturn nil\n}\n\nfunc appendExtraWords(replacer *misspell.Replacer, extraWords []config.MisspellExtraWords) error {\n\tif len(extraWords) == 0 {\n\t\treturn nil\n\t}\n\n\textra := make([]string, 0, len(extraWords)*2)\n\n\tfor _, word := range extraWords {\n\t\tif word.Typo == \"\" || word.Correction == \"\" {\n\t\t\treturn fmt.Errorf(\"typo (%q) and correction (%q) fields should not be empty\", word.Typo, word.Correction)\n\t\t}\n\n\t\tif strings.ContainsFunc(word.Typo, func(r rune) bool { return !unicode.IsLetter(r) }) {\n\t\t\treturn fmt.Errorf(\"the word %q in the 'typo' field should only contain letters\", word.Typo)\n\t\t}\n\t\tif strings.ContainsFunc(word.Correction, func(r rune) bool { return !unicode.IsLetter(r) }) {\n\t\t\treturn fmt.Errorf(\"the word %q in the 'correction' field should only contain letters\", word.Correction)\n\t\t}\n\n\t\textra = append(extra, strings.ToLower(word.Typo), strings.ToLower(word.Correction))\n\t}\n\n\treplacer.AddRuleList(extra)\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/misspell/misspell_integration_test.go",
    "content": "package misspell\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/misspell/misspell_test.go",
    "content": "package misspell\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/misspell\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nfunc Test_appendExtraWords(t *testing.T) {\n\textraWords := []config.MisspellExtraWords{\n\t\t{\n\t\t\tTypo:       \"iff\",\n\t\t\tCorrection: \"if\",\n\t\t},\n\t\t{\n\t\t\tTypo:       \"canCELation\",\n\t\t\tCorrection: \"canceLLaTION\",\n\t\t},\n\t}\n\n\treplacer := &misspell.Replacer{}\n\n\terr := appendExtraWords(replacer, extraWords)\n\trequire.NoError(t, err)\n\n\texpected := []string{\"iff\", \"if\", \"cancelation\", \"cancellation\"}\n\n\tassert.Equal(t, expected, replacer.Replacements)\n}\n\nfunc Test_appendExtraWords_error(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc       string\n\t\textraWords []config.MisspellExtraWords\n\t\texpected   string\n\t}{\n\t\t{\n\t\t\tdesc: \"empty fields\",\n\t\t\textraWords: []config.MisspellExtraWords{{\n\t\t\t\tTypo:       \"\",\n\t\t\t\tCorrection: \"\",\n\t\t\t}},\n\t\t\texpected: `typo (\"\") and correction (\"\") fields should not be empty`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"empty typo\",\n\t\t\textraWords: []config.MisspellExtraWords{{\n\t\t\t\tTypo:       \"\",\n\t\t\t\tCorrection: \"if\",\n\t\t\t}},\n\t\t\texpected: `typo (\"\") and correction (\"if\") fields should not be empty`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"empty correction\",\n\t\t\textraWords: []config.MisspellExtraWords{{\n\t\t\t\tTypo:       \"iff\",\n\t\t\t\tCorrection: \"\",\n\t\t\t}},\n\t\t\texpected: `typo (\"iff\") and correction (\"\") fields should not be empty`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid characters in typo\",\n\t\t\textraWords: []config.MisspellExtraWords{{\n\t\t\t\tTypo:       \"i'ff\",\n\t\t\t\tCorrection: \"if\",\n\t\t\t}},\n\t\t\texpected: `the word \"i'ff\" in the 'typo' field should only contain letters`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid characters in correction\",\n\t\t\textraWords: []config.MisspellExtraWords{{\n\t\t\t\tTypo:       \"iff\",\n\t\t\t\tCorrection: \"i'f\",\n\t\t\t}},\n\t\t\texpected: `the word \"i'f\" in the 'correction' field should only contain letters`,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\treplacer := &misspell.Replacer{}\n\n\t\t\terr := appendExtraWords(replacer, test.extraWords)\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/misspell/testdata/fix/in/misspell.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"log\"\n\n// langauge lala\n// lala langauge\n// langauge\n// langauge langauge\n\n// check Langauge\n// and check langAuge\n\nfunc langaugeMisspell() {\n\tvar langauge, langaugeAnd string\n\tlog.Printf(\"it's becouse of them: %s, %s\", langauge, langaugeAnd)\n}\n"
  },
  {
    "path": "pkg/golinters/misspell/testdata/fix/out/misspell.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"log\"\n\n// language lala\n// lala language\n// language\n// language language\n\n// check Language\n// and check langAuge\n\nfunc langaugeMisspell() {\n\tvar language, langaugeAnd string\n\tlog.Printf(\"it's because of them: %s, %s\", language, langaugeAnd)\n}\n"
  },
  {
    "path": "pkg/golinters/misspell/testdata/misspell.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:config_path testdata/misspell.yml\npackage testdata\n\nfunc Misspell() {\n\t// comment with incorrect spelling: occured // want \"`occured` is a misspelling of `occurred`\"\n}\n\n// the word langauge should be ignored here: it's set in config\n// the word Dialogue should be ignored here: it's set in config\n"
  },
  {
    "path": "pkg/golinters/misspell/testdata/misspell.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    misspell:\n      locale: US\n      ignore-rules:\n        - langauge\n        - Dialogue\n"
  },
  {
    "path": "pkg/golinters/misspell/testdata/misspell_cgo.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:config_path testdata/misspell.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc Misspell() {\n\t// comment with incorrect spelling: occured // want \"`occured` is a misspelling of `occurred`\"\n}\n\n// the word langauge should be ignored here: it's set in config\n// the word Dialogue should be ignored here: it's set in config\n\nfunc _() error {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n\n\treturn fmt.Errorf(\"an unknown error ocurred\") // want \"`ocurred` is a misspelling of `occurred`\"\n}\n"
  },
  {
    "path": "pkg/golinters/misspell/testdata/misspell_custom.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:config_path testdata/misspell_custom.yml\npackage testdata\n\nfunc Misspell() {\n\t// comment with incorrect spelling: occured // want \"`occured` is a misspelling of `occurred`\"\n}\n\n// the word iff should be reported here // want \"\\\\`iff\\\\` is a misspelling of \\\\`if\\\\`\"\n// the word cancelation should be reported here // want \"\\\\`cancelation\\\\` is a misspelling of \\\\`cancellation\\\\`\"\n"
  },
  {
    "path": "pkg/golinters/misspell/testdata/misspell_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    misspell:\n      extra-words:\n        - typo: \"iff\"\n          correction: \"if\"\n        - typo: \"cancelation\"\n          correction: \"cancellation\"\n"
  },
  {
    "path": "pkg/golinters/mnd/mnd.go",
    "content": "package mnd\n\nimport (\n\tmnd \"github.com/tommy-muehle/go-mnd/v2\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.MndSettings) *goanalysis.Linter {\n\tcfg := map[string]any{}\n\n\tif settings != nil {\n\t\tif len(settings.Checks) > 0 {\n\t\t\tcfg[\"checks\"] = settings.Checks\n\t\t}\n\t\tif len(settings.IgnoredNumbers) > 0 {\n\t\t\tcfg[\"ignored-numbers\"] = settings.IgnoredNumbers\n\t\t}\n\t\tif len(settings.IgnoredFiles) > 0 {\n\t\t\tcfg[\"ignored-files\"] = settings.IgnoredFiles\n\t\t}\n\t\tif len(settings.IgnoredFunctions) > 0 {\n\t\t\tcfg[\"ignored-functions\"] = settings.IgnoredFunctions\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(mnd.Analyzer).\n\t\tWithDesc(\"An analyzer to detect magic numbers.\").\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/mnd/mnd_integration_test.go",
    "content": "package mnd\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/mnd/testdata/mnd.go",
    "content": "//golangcitest:args -Emnd\npackage testdata\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"time\"\n)\n\nfunc UseMagicNumber() {\n\tc := &http.Client{\n\t\tTimeout: 2 * time.Second, // want \"Magic number: 2, in <assign> detected\"\n\t}\n\n\tres, err := c.Get(\"https://www.google.com\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer res.Body.Close()\n\tif res.StatusCode != 200 { // want \"Magic number: 200, in <condition> detected\"\n\t\tlog.Println(\"Something went wrong\")\n\t}\n}\n\nfunc UseNoMagicNumber() {\n\tc := &http.Client{\n\t\tTimeout: time.Second,\n\t}\n\n\tres, err := c.Get(\"https://www.google.com\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tif res.StatusCode != http.StatusOK {\n\t\tlog.Println(\"Something went wrong\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/mnd/testdata/mnd_cgo.go",
    "content": "//golangcitest:args -Emnd\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tc := &http.Client{\n\t\tTimeout: 2 * time.Second, // want \"Magic number: 2, in <assign> detected\"\n\t}\n\n\tres, err := c.Get(\"https://www.google.com\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer res.Body.Close()\n\tif res.StatusCode != 200 { // want \"Magic number: 200, in <condition> detected\"\n\t\tlog.Println(\"Something went wrong\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/mnd/testdata/mnd_custom.go",
    "content": "//golangcitest:args -Emnd\n//golangcitest:config_path testdata/mnd_custom.yml\npackage testdata\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n)\n\nfunc Mnd() {\n\tc := &http.Client{\n\t\tTimeout: 5 * time.Second,\n\t}\n\n\tres, err := c.Get(\"https://www.google.com\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer res.Body.Close()\n\tif res.StatusCode != 200 { // want \"Magic number: 200, in <condition> detected\"\n\t\tlog.Println(\"Something went wrong\")\n\t}\n\n\t_ = os.Mkdir(\"my/dir\", 0777)\n\t_ = os.Mkdir(\"my/dir\", 0775) // want \"Magic number: 0775, in <argument> detected\"\n}\n"
  },
  {
    "path": "pkg/golinters/mnd/testdata/mnd_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    mnd:\n      ignored-numbers:\n        - '5'\n        - '0777'\n"
  },
  {
    "path": "pkg/golinters/modernize/modernize.go",
    "content": "package modernize\n\nimport (\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/modernize\"\n)\n\nfunc New(settings *config.ModernizeSettings) *goanalysis.Linter {\n\tvar analyzers []*analysis.Analyzer\n\n\tif settings == nil {\n\t\tanalyzers = modernize.Suite\n\t} else {\n\t\tfor _, analyzer := range modernize.Suite {\n\t\t\tif slices.Contains(settings.Disable, analyzer.Name) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tanalyzers = append(analyzers, analyzer)\n\t\t}\n\t}\n\n\treturn goanalysis.NewLinter(\n\t\t\"modernize\",\n\t\t\"A suite of analyzers that suggest simplifications to Go code, using modern language and library features.\",\n\t\tanalyzers,\n\t\tnil).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/modernize_integration_test.go",
    "content": "package modernize\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/any.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage any\n\nfunc _(x interface{}) {} // want \"interface{} can be replaced by any\"\n\nfunc _() {\n\tvar x interface{} // want \"interface{} can be replaced by any\"\n\tconst any = 1\n\tvar y interface{} // nope: any is shadowed here\n\t_, _ = x, y\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/fieldsseq.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage fieldsseq\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n)\n\nfunc _() {\n\tfor _, line := range strings.Fields(\"\") { // want \"Ranging over FieldsSeq is more efficient\"\n\t\tprintln(line)\n\t}\n\tfor i, line := range strings.Fields(\"\") { // nope: uses index var\n\t\tprintln(i, line)\n\t}\n\tfor i, _ := range strings.Fields(\"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor i := range strings.Fields(\"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor _ = range strings.Fields(\"\") { // want \"Ranging over FieldsSeq is more efficient\"\n\t}\n\tfor range strings.Fields(\"\") { // want \"Ranging over FieldsSeq is more efficient\"\n\t}\n\tfor range bytes.Fields(nil) { // want \"Ranging over FieldsSeq is more efficient\"\n\t}\n\t{\n\t\tlines := strings.Fields(\"\") // want \"Ranging over FieldsSeq is more efficient\"\n\t\tfor _, line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t}\n\t{\n\t\tlines := strings.Fields(\"\") // nope: lines is used not just by range\n\t\tfor _, line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t\tprintln(lines)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/fmtappendf.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage fmtappendf\n\nimport (\n\t\"fmt\"\n)\n\nfunc two() string {\n\treturn \"two\"\n}\n\nfunc bye() {\n\t_ = []byte(fmt.Sprintf(\"bye %d\", 1)) // want \"Replace .*Sprintf.* with fmt.Appendf\"\n}\n\nfunc funcsandvars() {\n\tone := \"one\"\n\t_ = []byte(fmt.Sprintf(\"bye %d %s %s\", 1, two(), one)) // want \"Replace .*Sprintf.* with fmt.Appendf\"\n}\n\nfunc typealias() {\n\ttype b = byte\n\ttype bt = []byte\n\t_ = []b(fmt.Sprintf(\"bye %d\", 1)) // want \"Replace .*Sprintf.* with fmt.Appendf\"\n\t_ = bt(fmt.Sprintf(\"bye %d\", 1))  // want \"Replace .*Sprintf.* with fmt.Appendf\"\n}\n\nfunc otherprints() {\n\t_ = []byte(fmt.Sprint(\"bye %d\", 1))   // want \"Replace .*Sprint.* with fmt.Append\"\n\t_ = []byte(fmt.Sprintln(\"bye %d\", 1)) // want \"Replace .*Sprintln.* with fmt.Appendln\"\n}\n\nfunc comma() {\n\ttype S struct{ Bytes []byte }\n\tvar _ = struct{ A S }{\n\t\tA: S{\n\t\t\tBytes: []byte( // want \"Replace .*Sprint.* with fmt.Appendf\"\n\t\t\t\tfmt.Sprintf(\"%d\", 0),\n\t\t\t),\n\t\t},\n\t}\n\t_ = []byte( // want \"Replace .*Sprint.* with fmt.Appendf\"\n\t\tfmt.Sprintf(\"%d\", 0),\n\t)\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/forvar.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage forvar\n\nfunc _(m map[int]int, s []int) {\n\t// changed\n\tfor i := range s {\n\t\ti := i // want \"copying variable is unneeded\"\n\t\tgo f(i)\n\t}\n\tfor _, v := range s {\n\t\tv := v // want \"copying variable is unneeded\"\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tk := k // want \"copying variable is unneeded\"\n\t\tv := v // want \"copying variable is unneeded\"\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tv := v // want \"copying variable is unneeded\"\n\t\tk := k // want \"copying variable is unneeded\"\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tk, v := k, v // want \"copying variable is unneeded\"\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tv, k := v, k // want \"copying variable is unneeded\"\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor i := range s {\n\t\t/* hi */ i := i // want \"copying variable is unneeded\"\n\t\tgo f(i)\n\t}\n\t// nope\n\tvar i, k, v int\n\n\tfor i = range s { // nope, scope change\n\t\ti := i\n\t\tgo f(i)\n\t}\n\tfor _, v = range s { // nope, scope change\n\t\tv := v\n\t\tgo f(v)\n\t}\n\tfor k = range m { // nope, scope change\n\t\tk := k\n\t\tgo f(k)\n\t}\n\tfor k, v = range m { // nope, scope change\n\t\tk := k\n\t\tv := v\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor _, v = range m { // nope, scope change\n\t\tv := v\n\t\tgo f(v)\n\t}\n\tfor _, v = range m { // nope, not x := x\n\t\tv := i\n\t\tgo f(v)\n\t}\n\tfor k, v := range m { // nope, LHS and RHS differ\n\t\tv, k := k, v\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m { // nope, not a simple redecl\n\t\tk, v, x := k, v, 1\n\t\tgo f(k)\n\t\tgo f(v)\n\t\tgo f(x)\n\t}\n\tfor i := range s { // nope, not a simple redecl\n\t\ti := (i)\n\t\tgo f(i)\n\t}\n\tfor i := range s { // nope, not a simple redecl\n\t\ti := i + 1\n\t\tgo f(i)\n\t}\n}\n\nfunc f(n int) {}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/mapsloop.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage mapsloop\n\nimport (\n\t\"iter\"\n\t\"maps\"\n)\n\nvar _ = maps.Clone[M] // force \"maps\" import so that each diagnostic doesn't add one\n\ntype M map[int]string\n\n// -- src is map --\n\nfunc useCopy(dst, src map[int]string) {\n\t// Replace loop by maps.Copy.\n\tfor key, value := range src {\n\t\t// A\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n}\n\nfunc useCopyGeneric[K comparable, V any, M ~map[K]V](dst, src M) {\n\t// Replace loop by maps.Copy.\n\tfor key, value := range src {\n\t\t// A\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n}\n\nfunc useCopyNotClone(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace make(...) by maps.Copy.\n\tdst := make(map[int]string, len(src))\n\t// A\n\tfor key, value := range src {\n\t\t// B\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t\t// C\n\t}\n\n\t// A\n\tdst = map[int]string{}\n\t// B\n\tfor key, value := range src {\n\t\t// C\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n\nfunc useCopyParen(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace (make)(...) by maps.Clone.\n\tdst := (make)(map[int]string, len(src))\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\n\tdst = (map[int]string{})\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n\nfunc useCopy_typesDiffer(src M) {\n\t// Replace loop but not make(...) as maps.Copy(src) would return wrong type M.\n\tdst := make(map[int]string, len(src))\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n\nfunc useCopy_typesDiffer2(src map[int]string) {\n\t// Replace loop but not make(...) as maps.Copy(src) would return wrong type map[int]string.\n\tdst := make(M, len(src))\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n\nfunc useClone_typesDiffer3(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace loop and make(...) as maps.Clone(src) returns map[int]string\n\t// which is assignable to M.\n\tvar dst M\n\tdst = make(M, len(src))\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n\nfunc useClone_typesDiffer4(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace loop and make(...) as maps.Clone(src) returns map[int]string\n\t// which is assignable to M.\n\tvar dst M\n\tdst = make(M, len(src))\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n\nfunc useClone_generic[Map ~map[K]V, K comparable, V any](src Map) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace loop and make(...) by maps.Clone\n\tdst := make(Map, len(src))\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n\n// -- src is iter.Seq2 --\n\nfunc useInsert_assignableToSeq2(dst map[int]string, src func(yield func(int, string) bool)) {\n\t// Replace loop by maps.Insert because src is assignable to iter.Seq2.\n\tfor k, v := range src {\n\t\tdst[k] = v // want \"Replace m\\\\[k\\\\]=v loop with maps.Insert\"\n\t}\n}\n\nfunc useCollect(src iter.Seq2[int, string]) {\n\t// Replace loop and make(...) by maps.Collect.\n\tvar dst map[int]string\n\tdst = make(map[int]string) // A\n\t// B\n\tfor key, value := range src {\n\t\t// C\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Collect\"\n\t}\n}\n\nfunc useInsert_typesDifferAssign(src iter.Seq2[int, string]) {\n\t// Replace loop and make(...): maps.Collect returns an unnamed map type\n\t// that is assignable to M.\n\tvar dst M\n\tdst = make(M)\n\t// A\n\tfor key, value := range src {\n\t\t// B\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Collect\"\n\t}\n}\n\nfunc useInsert_typesDifferDeclare(src iter.Seq2[int, string]) {\n\t// Replace loop but not make(...) as maps.Collect would return an\n\t// unnamed map type that would change the type of dst.\n\tdst := make(M)\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Insert\"\n\t}\n}\n\n// -- non-matches --\n\ntype isomerOfSeq2 func(yield func(int, string) bool)\n\nfunc nopeInsertRequiresAssignableToSeq2(dst map[int]string, src isomerOfSeq2) {\n\tfor k, v := range src { // nope: src is not assignable to maps.Insert's iter.Seq2 parameter\n\t\tdst[k] = v\n\t}\n}\n\nfunc nopeSingleVarRange(dst map[int]bool, src map[int]string) {\n\tfor key := range src { // nope: must be \"for k, v\"\n\t\tdst[key] = true\n\t}\n}\n\nfunc nopeBodyNotASingleton(src map[int]string) {\n\tvar dst map[int]string\n\tfor key, value := range src {\n\t\tdst[key] = value\n\t\tprintln() // nope: other things in the loop body\n\t}\n}\n\n// Regression test for https://github.com/golang/go/issues/70815#issuecomment-2581999787.\nfunc nopeAssignmentHasIncrementOperator(src map[int]int) {\n\tdst := make(map[int]int)\n\tfor k, v := range src {\n\t\tdst[k] += v\n\t}\n}\n\nfunc nopeNotAMap(src map[int]string) {\n\tvar dst []string\n\tfor k, v := range src {\n\t\tdst[k] = v\n\t}\n}\n\nfunc nopeNotAMapGeneric[E any, M ~map[int]E, S ~[]E](src M) {\n\tvar dst S\n\tfor k, v := range src {\n\t\tdst[k] = v\n\t}\n}\n\nfunc nopeHasImplicitWidening(src map[string]int) {\n\tdst := make(map[string]any)\n\tfor k, v := range src {\n\t\tdst[k] = v\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/mapsloop_dot.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage mapsloop\n\nimport . \"maps\"\n\nvar _ = Clone[M] // force \"maps\" import so that each diagnostic doesn't add one\n\ntype M map[int]string\n\nfunc useCopyDot(dst, src map[int]string) {\n\t// Replace loop by maps.Copy.\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n}\n\nfunc useCloneDot(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace make(...) by maps.Copy.\n\tdst := make(map[int]string, len(src))\n\tfor key, value := range src {\n\t\tdst[key] = value // want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t}\n\tprintln(dst)\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/minmax.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage minmax\n\nfunc ifmin(a, b int) {\n\tx := a // A\n\t// B\n\tif a < b { // want \"if statement can be modernized using max\"\n\t\t// C\n\t\tx = b // D\n\t\t// E\n\t}\n\tprint(x)\n}\n\nfunc ifmax(a, b int) {\n\tx := a\n\tif a > b { // want \"if statement can be modernized using min\"\n\t\tx = b\n\t}\n\tprint(x)\n}\n\nfunc ifminvariant(a, b int) {\n\tx := a\n\tif x > b { // want \"if statement can be modernized using min\"\n\t\tx = b\n\t}\n\tprint(x)\n}\n\nfunc ifmaxvariant(a, b int) {\n\tx := b\n\tif a < x { // want \"if statement can be modernized using min\"\n\t\tx = a\n\t}\n\tprint(x)\n}\n\nfunc ifelsemin(a, b int) {\n\tvar x int // A\n\t// B\n\tif a <= b { // want \"if/else statement can be modernized using min\"\n\t\t// C\n\t\tx = a // D\n\t\t// E\n\t} else {\n\t\t// F\n\t\tx = b // G\n\t\t// H\n\t}\n\tprint(x)\n}\n\nfunc ifelsemax(a, b int) {\n\t// A\n\tvar x int // B\n\t// C\n\tif a >= b { // want \"if/else statement can be modernized using max\"\n\t\t// D\n\t\tx = a // E\n\t\t// F\n\t} else {\n\t\t// G\n\t\tx = b\n\t}\n\tprint(x)\n}\n\nfunc shadowed() int {\n\thour, min := 3600, 60\n\n\tvar time int\n\tif hour < min { // silent: the built-in min function is shadowed here\n\t\ttime = hour\n\t} else {\n\t\ttime = min\n\t}\n\treturn time\n}\n\nfunc nopeIfStmtHasInitStmt() {\n\tx := 1\n\tif y := 2; y < x { // silent: IfStmt has an Init stmt\n\t\tx = y\n\t}\n\tprint(x)\n}\n\n// Regression test for a bug: fix was \"y := max(x, y)\".\nfunc oops() {\n\tx := 1\n\ty := 2\n\tif x > y { // want \"if statement can be modernized using max\"\n\t\ty = x\n\t}\n\tprint(y)\n}\n\n// Regression test for a bug: += is not a simple assignment.\nfunc nopeAssignHasIncrementOperator() {\n\tx := 1\n\ty := 0\n\ty += 2\n\tif x > y {\n\t\ty = x\n\t}\n\tprint(y)\n}\n\n// Regression test for https://github.com/golang/go/issues/71721.\nfunc nopeNotAMinimum(x, y int) int {\n\t// A value of -1 or 0 will use a default value (30).\n\tif x <= 0 {\n\t\ty = 30\n\t} else {\n\t\ty = x\n\t}\n\treturn y\n}\n\n// Regression test for https://github.com/golang/go/issues/71847#issuecomment-2673491596\nfunc nopeHasElseBlock(x int) int {\n\ty := x\n\t// Before, this was erroneously reduced to y = max(x, 0)\n\tif y < 0 {\n\t\ty = 0\n\t} else {\n\t\ty += 2\n\t}\n\treturn y\n}\n\nfunc fix72727(a, b int) {\n\to := a - 42\n\t// some important comment. DO NOT REMOVE.\n\tif o < b { // want \"if statement can be modernized using max\"\n\t\to = b\n\t}\n}\n\ntype myfloat float64\n\n// The built-in min/max differ in their treatment of NaN,\n// so reject floating-point numbers (#72829).\nfunc nopeFloat(a, b myfloat) (res myfloat) {\n\tif a < b {\n\t\tres = a\n\t} else {\n\t\tres = b\n\t}\n\treturn\n}\n\n// Regression test for golang/go#72928.\nfunc underscoreAssign(a, b int) {\n\tif a > b {\n\t\t_ = a\n\t}\n}\n\n// Regression test for https://github.com/golang/go/issues/73576.\nfunc nopeIfElseIf(a int) int {\n\tx := 0\n\tif a < 0 {\n\t\tx = 0\n\t} else if a > 100 {\n\t\tx = 100\n\t} else {\n\t\tx = a\n\t}\n\treturn x\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/rangeint.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage rangeint\n\nimport (\n\t\"os\"\n\tos1 \"os\"\n)\n\nfunc _(i int, s struct{ i int }, slice []int) {\n\tfor i := 0; i < 10; i++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(i)\n\t}\n\tfor j := int(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := int8(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := int16(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := int32(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := int64(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := uint8(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := uint16(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := uint32(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := uint64(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := int8(0.); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := int8(.0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := os.FileMode(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\n\t{\n\t\tvar i int\n\t\tfor i = 0; i < 10; i++ { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t\t// NB: no uses of i after loop.\n\t}\n\tfor i := 0; i < 10; i++ { // want \"for loop can be modernized using range over int\"\n\t\t// i unused within loop\n\t}\n\tfor i := 0; i < len(slice); i++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(slice[i])\n\t}\n\tfor i := 0; i < len(\"\"); i++ { // want \"for loop can be modernized using range over int\"\n\t\t// NB: not simplified to range \"\"\n\t}\n\n\t// nope\n\tfor j := .0; j < 10; j++ { // nope: j is a float type\n\t\tprintln(j)\n\t}\n\tfor j := float64(0); j < 10; j++ { // nope: j is a float type\n\t\tprintln(j)\n\t}\n\tfor i := 0; i < 10; { // nope: missing increment\n\t}\n\tfor i := 0; i < 10; i-- { // nope: negative increment\n\t}\n\tfor i := 0; ; i++ { // nope: missing comparison\n\t}\n\tfor i := 0; i <= 10; i++ { // nope: wrong comparison\n\t}\n\tfor ; i < 10; i++ { // nope: missing init\n\t}\n\tfor s.i = 0; s.i < 10; s.i++ { // nope: not an ident\n\t}\n\tfor i := 0; i < 10; i++ { // nope: takes address of i\n\t\tprintln(&i)\n\t}\n\tfor i := 0; i < 10; i++ { // nope: increments i\n\t\ti++\n\t}\n\tfor i := 0; i < 10; i++ { // nope: assigns i\n\t\ti = 8\n\t}\n\n\t// The limit expression must be loop invariant;\n\t// see https://github.com/golang/go/issues/72917\n\tfor i := 0; i < f(); i++ { // nope\n\t}\n\t{\n\t\tvar s struct{ limit int }\n\t\tfor i := 0; i < s.limit; i++ { // nope: limit is not a const or local var\n\t\t}\n\t}\n\t{\n\t\tconst k = 10\n\t\tfor i := 0; i < k; i++ { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t}\n\t{\n\t\tvar limit = 10\n\t\tfor i := 0; i < limit; i++ { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t}\n\t{\n\t\tvar limit = 10\n\t\tfor i := 0; i < limit; i++ { // nope: limit is address-taken\n\t\t}\n\t\tprint(&limit)\n\t}\n\t{\n\t\tlimit := 10\n\t\tlimit++\n\t\tfor i := 0; i < limit; i++ { // nope: limit is assigned other than by its declaration\n\t\t}\n\t}\n\tfor i := 0; i < Global; i++ { // nope: limit is an exported global var; may be updated elsewhere\n\t}\n\tfor i := 0; i < len(table); i++ { // want \"for loop can be modernized using range over int\"\n\t}\n\t{\n\t\ts := []string{}\n\t\tfor i := 0; i < len(s); i++ { // nope: limit is not loop-invariant\n\t\t\ts = s[1:]\n\t\t}\n\t}\n\tfor i := 0; i < len(slice); i++ { // nope: i is incremented within loop\n\t\ti += 1\n\t}\n\tfor Global = 0; Global < 10; Global++ { // nope: loop index is a global variable.\n\t}\n}\n\nvar Global int\n\nvar table = []string{\"hello\", \"world\"}\n\nfunc f() int { return 0 }\n\n// Repro for part of #71847: (\"for range n is invalid if the loop body contains i++\"):\nfunc _(s string) {\n\tvar i int                    // (this is necessary)\n\tfor i = 0; i < len(s); i++ { // nope: loop body increments i\n\t\tif true {\n\t\t\ti++ // nope\n\t\t}\n\t}\n}\n\n// Repro for #71952: for and range loops have different final values\n// on i (n and n-1, respectively) so we can't offer the fix if i is\n// used after the loop.\nfunc nopePostconditionDiffers() {\n\ti := 0\n\tfor i = 0; i < 5; i++ {\n\t\tprintln(i)\n\t}\n\tprintln(i) // must print 5, not 4\n}\n\n// Non-integer untyped constants need to be explicitly converted to int.\nfunc issue71847d() {\n\tconst limit = 1e3            // float\n\tfor i := 0; i < limit; i++ { // want \"for loop can be modernized using range over int\"\n\t}\n\tfor i := int(0); i < limit; i++ { // want \"for loop can be modernized using range over int\"\n\t}\n\tfor i := uint(0); i < limit; i++ { // want \"for loop can be modernized using range over int\"\n\t}\n\n\tconst limit2 = 1 + 0i         // complex\n\tfor i := 0; i < limit2; i++ { // want \"for loop can be modernized using range over int\"\n\t}\n}\n\nfunc issue72726() {\n\tvar n, kd int\n\tfor i := 0; i < n; i++ { // want \"for loop can be modernized using range over int\"\n\t\t// nope: j will be invisible once it's refactored to 'for j := range min(n-j, kd+1)'\n\t\tfor j := 0; j < min(n-j, kd+1); j++ { // nope\n\t\t\t_, _ = i, j\n\t\t}\n\t}\n\n\tfor i := 0; i < i; i++ { // nope\n\t}\n\n\tvar i int\n\tfor i = 0; i < i/2; i++ { // nope\n\t}\n\n\tvar arr []int\n\tfor i = 0; i < arr[i]; i++ { // nope\n\t}\n}\n\nfunc todo() {\n\tfor j := os1.FileMode(0); j < 10; j++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n}\n\ntype T uint\ntype TAlias = uint\n\nfunc Fn(a int) T {\n\treturn T(a)\n}\n\nfunc issue73037() {\n\tvar q T\n\tfor a := T(0); a < q; a++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(a)\n\t}\n\tfor a := Fn(0); a < q; a++ {\n\t\tprintln(a)\n\t}\n\tvar qa TAlias\n\tfor a := TAlias(0); a < qa; a++ { // want \"for loop can be modernized using range over int\"\n\t\tprintln(a)\n\t}\n\tfor a := T(0); a < 10; a++ { // want \"for loop can be modernized using range over int\"\n\t\tfor b := T(0); b < 10; b++ { // want \"for loop can be modernized using range over int\"\n\t\t\tprintln(a, b)\n\t\t}\n\t}\n}\n\nfunc issue75289() {\n\t// A use of i within a defer may be textually before the loop but runs\n\t// after, so it should cause the loop to be rejected as a candidate\n\t// to avoid it observing a different final value of i.\n\t{\n\t\tvar i int\n\t\tdefer func() { println(i) }()\n\t\tfor i = 0; i < 10; i++ { // nope: i is accessed after the loop (via defer)\n\t\t}\n\t}\n\n\t// A use of i within a defer within the loop is also a dealbreaker.\n\t{\n\t\tvar i int\n\t\tfor i = 0; i < 10; i++ { // nope: i is accessed after the loop (via defer)\n\t\t\tdefer func() { println(i) }()\n\t\t}\n\t}\n\n\t// This (outer) defer is irrelevant.\n\tdefer func() {\n\t\tvar i int\n\t\tfor i = 0; i < 10; i++ { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t}()\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/reflecttypefor.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage reflecttypefor\n\nimport (\n\t\"io\"\n\t\"reflect\"\n\t\"time\"\n)\n\nvar (\n\tx any\n\t_ = reflect.TypeOf(x)                 // nope (dynamic)\n\t_ = reflect.TypeOf(0)                 // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(uint(0))           // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(error(nil))        // nope (likely a mistake)\n\t_ = reflect.TypeOf((*error)(nil))     // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(io.Reader(nil))    // nope (likely a mistake)\n\t_ = reflect.TypeOf((*io.Reader)(nil)) // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(*new(time.Time))   // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(time.Time{})       // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(time.Duration(0))  // want \"reflect.TypeOf call can be simplified using TypeFor\"\n)\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/slicescontains.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage slicescontains\n\nimport \"slices\"\n\nvar _ = slices.Contains[[]int] // force import of \"slices\" to avoid duplicate import edits\n\nfunc nopeNoBreak(slice []int, needle int) {\n\tfor i := range slice {\n\t\tif slice[i] == needle {\n\t\t\tprintln(\"found\")\n\t\t}\n\t}\n}\n\nfunc rangeIndex(slice []int, needle int) {\n\tfor i := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\tif slice[i] == needle {\n\t\t\tprintln(\"found\")\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc rangeValue(slice []int, needle int) {\n\tfor _, elem := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\tif elem == needle {\n\t\t\tprintln(\"found\")\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc returns(slice []int, needle int) {\n\tfor i := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\tif slice[i] == needle {\n\t\t\tprintln(\"found\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc assignTrueBreak(slice []int, needle int) {\n\tfound := false\n\tfor _, elem := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\tif elem == needle {\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\tprint(found)\n}\n\nfunc assignFalseBreak(slice []int, needle int) {\n\tfound := true\n\tfor _, elem := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\tif elem == needle {\n\t\t\tfound = false\n\t\t\tbreak\n\t\t}\n\t}\n\tprint(found)\n}\n\nfunc assignFalseBreakInSelectSwitch(slice []int, needle int) {\n\t// Exercise RangeStmt in CommClause, CaseClause.\n\tselect {\n\tdefault:\n\t\tfound := false\n\t\tfor _, elem := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\t\tif elem == needle {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tprint(found)\n\t}\n\tswitch {\n\tdefault:\n\t\tfound := false\n\t\tfor _, elem := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\t\tif elem == needle {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tprint(found)\n\t}\n}\n\nfunc returnTrue(slice []int, needle int) bool {\n\tfor _, elem := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\tif elem == needle {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc returnFalse(slice []int, needle int) bool {\n\tfor _, elem := range slice { // want \"Loop can be simplified using slices.Contains\"\n\t\tif elem == needle {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc containsFunc(slice []int, needle int) bool {\n\tfor _, elem := range slice { // want \"Loop can be simplified using slices.ContainsFunc\"\n\t\tif predicate(elem) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc nopeLoopBodyHasFreeContinuation(slice []int, needle int) bool {\n\tfor _, elem := range slice {\n\t\tif predicate(elem) {\n\t\t\tif needle == 7 {\n\t\t\t\tcontinue // this statement defeats loop elimination\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc generic[T any](slice []T, f func(T) bool) bool {\n\tfor _, elem := range slice { // want \"Loop can be simplified using slices.ContainsFunc\"\n\t\tif f(elem) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc predicate(int) bool\n\n// Regression tests for bad fixes when needle\n// and haystack have different types (#71313):\n\nfunc nopeNeedleHaystackDifferentTypes(x any, args []error) {\n\tfor _, arg := range args {\n\t\tif arg == x {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc nopeNeedleHaystackDifferentTypes2(x error, args []any) {\n\tfor _, arg := range args {\n\t\tif arg == x {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc nopeVariadicNamedContainsFunc(slice []int) bool {\n\tfor _, elem := range slice {\n\t\tif variadicPredicate(elem) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc variadicPredicate(int, ...any) bool\n\nfunc nopeVariadicContainsFunc(slice []int) bool {\n\tf := func(int, ...any) bool {\n\t\treturn true\n\t}\n\tfor _, elem := range slice {\n\t\tif f(elem) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Negative test case for implicit C->I conversion\ntype I interface{ F() }\ntype C int\n\nfunc (C) F() {}\n\nfunc nopeImplicitConversionContainsFunc(slice []C, f func(I) bool) bool {\n\tfor _, elem := range slice {\n\t\tif f(elem) { // implicit conversion from C to I\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc nopeTypeParamWidening[T any](slice []T, f func(any) bool) bool {\n\tfor _, elem := range slice {\n\t\tif f(elem) { // implicit conversion from T to any\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/slicessort.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage slicessort\n\nimport \"sort\"\n\ntype myint int\n\nfunc _(s []myint) {\n\tsort.Slice(s, func(i, j int) bool { return s[i] < s[j] }) // want \"sort.Slice can be modernized using slices.Sort\"\n}\n\nfunc _(x *struct{ s []int }) {\n\tsort.Slice(x.s, func(first, second int) bool { return x.s[first] < x.s[second] }) // want \"sort.Slice can be modernized using slices.Sort\"\n}\n\nfunc _(s []int) {\n\tsort.Slice(s, func(i, j int) bool { return s[i] > s[j] }) // nope: wrong comparison operator\n}\n\nfunc _(s []int) {\n\tsort.Slice(s, func(i, j int) bool { return s[j] < s[i] }) // nope: wrong index var\n}\n\nfunc _(sense bool, s2 []struct{ x int }) {\n\tsort.Slice(s2, func(i, j int) bool { return s2[i].x < s2[j].x }) // nope: not a simple index operation\n\n\t// Regression test for a crash: the sole statement of a\n\t// comparison func body is not necessarily a return!\n\tsort.Slice(s2, func(i, j int) bool {\n\t\tif sense {\n\t\t\treturn s2[i].x < s2[j].x\n\t\t} else {\n\t\t\treturn s2[i].x > s2[j].x\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/splitseq.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage splitseq\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n)\n\nfunc _() {\n\tfor _, line := range strings.Split(\"\", \"\") { // want \"Ranging over SplitSeq is more efficient\"\n\t\tprintln(line)\n\t}\n\tfor i, line := range strings.Split(\"\", \"\") { // nope: uses index var\n\t\tprintln(i, line)\n\t}\n\tfor i, _ := range strings.Split(\"\", \"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor i := range strings.Split(\"\", \"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor _ = range strings.Split(\"\", \"\") { // want \"Ranging over SplitSeq is more efficient\"\n\t}\n\tfor range strings.Split(\"\", \"\") { // want \"Ranging over SplitSeq is more efficient\"\n\t}\n\tfor range bytes.Split(nil, nil) { // want \"Ranging over SplitSeq is more efficient\"\n\t}\n\t{\n\t\tlines := strings.Split(\"\", \"\") // want \"Ranging over SplitSeq is more efficient\"\n\t\tfor _, line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t}\n\t{\n\t\tlines := strings.Split(\"\", \"\") // nope: lines is used not just by range\n\t\tfor _, line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t\tprintln(lines)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/stditerators.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage stditerators\n\nimport \"go/types\"\n\nfunc _(tuple *types.Tuple) {\n\tfor i := 0; i < tuple.Len(); i++ { // want \"Len/At loop can simplified using Tuple.Variables iteration\"\n\t\tprint(tuple.At(i))\n\t}\n}\n\nfunc _(scope *types.Scope) {\n\tfor i := 0; i < scope.NumChildren(); i++ { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\tprint(scope.Child(i))\n\t}\n\t{\n\t\tconst child = 0                            // shadowing of preferred name at def\n\t\tfor i := 0; i < scope.NumChildren(); i++ { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\t\tprint(scope.Child(i))\n\t\t}\n\t}\n\t{\n\t\tfor i := 0; i < scope.NumChildren(); i++ {\n\t\t\tconst child = 0 // nope: shadowing of fresh name at use\n\t\t\tprint(scope.Child(i))\n\t\t}\n\t}\n\t{\n\t\tfor i := 0; i < scope.NumChildren(); i++ { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\t\telem := scope.Child(i) // => preferred name = \"elem\"\n\t\t\tprint(elem)\n\t\t}\n\t}\n\t{\n\t\tfor i := 0; i < scope.NumChildren(); i++ { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\t\tfirst := scope.Child(0) // the name heuristic should not be fooled by this\n\t\t\tprint(first, scope.Child(i))\n\t\t}\n\t}\n}\n\nfunc _(union, union2 *types.Union) {\n\tfor i := 0; i < union.Len(); i++ { // want \"Len/Term loop can simplified using Union.Terms iteration\"\n\t\tprint(union.Term(i))\n\t\tprint(union.Term(i))\n\t}\n\tfor i := union.Len() - 1; i >= 0; i-- { // nope: wrong loop form\n\t\tprint(union.Term(i))\n\t}\n\tfor i := 0; i <= union.Len(); i++ { // nope: wrong loop form\n\t\tprint(union.Term(i))\n\t}\n\tfor i := 0; i <= union.Len(); i++ { // nope: use of i not in x.At(i)\n\t\tprint(i, union.Term(i))\n\t}\n\tfor i := 0; i <= union.Len(); i++ { // nope: x.At and x.Len have different receivers\n\t\tprint(i, union2.Term(i))\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/stringsbuilder.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage stringsbuilder\n\n// basic test\nfunc _() {\n\tvar s string\n\ts += \"before\"\n\tfor range 10 {\n\t\ts += \"in\" // want \"using string \\\\+= string in a loop is inefficient\"\n\t\ts += \"in2\"\n\t}\n\ts += \"after\"\n\tprint(s)\n}\n\n// with initializer\nfunc _() {\n\tvar s = \"a\"\n\tfor range 10 {\n\t\ts += \"b\" // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s)\n}\n\n// with empty initializer\nfunc _() {\n\tvar s = \"\"\n\tfor range 10 {\n\t\ts += \"b\" // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s)\n}\n\n// with short decl\nfunc _() {\n\ts := \"a\"\n\tfor range 10 {\n\t\ts += \"b\" // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s)\n}\n\n// with short decl and empty initializer\nfunc _() {\n\ts := \"\"\n\tfor range 10 {\n\t\ts += \"b\" // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s)\n}\n\n// nope: += must appear at least once within a loop.\nfunc _() {\n\tvar s string\n\ts += \"a\"\n\ts += \"b\"\n\ts += \"c\"\n\tprint(s)\n}\n\n// nope: the declaration of s is not in a block.\nfunc _() {\n\tif s := \"a\"; true {\n\t\tfor range 10 {\n\t\t\ts += \"x\"\n\t\t}\n\t\tprint(s)\n\t}\n}\n\n// in a switch (special case of \"in a block\" logic)\nfunc _() {\n\tswitch {\n\tdefault:\n\t\ts := \"a\"\n\t\tfor range 10 {\n\t\t\ts += \"b\" // want \"using string \\\\+= string in a loop is inefficient\"\n\t\t}\n\t\tprint(s)\n\t}\n}\n\n// nope: don't handle direct assignments to the string  (only +=).\nfunc _(x string) string {\n\tvar s string\n\ts = x\n\tfor range 3 {\n\t\ts += \"\" + x\n\t}\n\treturn s\n}\n\n// Regression test for bug in a GenDecl with parens.\nfunc issue75318(slice []string) string {\n\tvar (\n\t\tmsg string\n\t)\n\tfor _, s := range slice {\n\t\tmsg += s // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\treturn msg\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/stringscutprefix.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage stringscutprefix\n\nimport (\n\t\"strings\"\n)\n\nvar (\n\ts, pre, suf string\n)\n\n// test supported cases of pattern 1 - CutPrefix\nfunc _() {\n\tif strings.HasPrefix(s, pre) { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta := strings.TrimPrefix(s, pre)\n\t\t_ = a\n\t}\n\tif strings.HasPrefix(\"\", \"\") { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta := strings.TrimPrefix(\"\", \"\")\n\t\t_ = a\n\t}\n\tif strings.HasPrefix(s, \"\") { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln([]byte(strings.TrimPrefix(s, \"\")))\n\t}\n\tif strings.HasPrefix(s, \"\") { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta, b := \"\", strings.TrimPrefix(s, \"\")\n\t\t_, _ = a, b\n\t}\n\tif strings.HasPrefix(s, \"\") { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta, b := strings.TrimPrefix(s, \"\"), strings.TrimPrefix(s, \"\") // only replace the first occurrence\n\t\ts = \"123\"\n\t\tb = strings.TrimPrefix(s, \"\") // only replace the first occurrence\n\t\t_, _ = a, b\n\t}\n\n\tvar a, b string\n\tif strings.HasPrefix(s, \"\") { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta, b = \"\", strings.TrimPrefix(s, \"\")\n\t\t_, _ = a, b\n\t}\n}\n\n// test basic cases for CutSuffix - only covering the key differences\nfunc _() {\n\tif strings.HasSuffix(s, suf) { // want \"HasSuffix \\\\+ TrimSuffix can be simplified to CutSuffix\"\n\t\ta := strings.TrimSuffix(s, suf)\n\t\t_ = a\n\t}\n\tif strings.HasSuffix(s, \"\") { // want \"HasSuffix \\\\+ TrimSuffix can be simplified to CutSuffix\"\n\t\tprintln([]byte(strings.TrimSuffix(s, \"\")))\n\t}\n}\n\n// test cases that are not supported by pattern1 - CutPrefix\nfunc _() {\n\tok := strings.HasPrefix(\"\", \"\")\n\tif ok { // noop, currently it doesn't track the result usage of HasPrefix\n\t\ta := strings.TrimPrefix(\"\", \"\")\n\t\t_ = a\n\t}\n\tif strings.HasPrefix(s, pre) {\n\t\ta := strings.TrimPrefix(\"\", \"\") // noop, as the argument isn't the same\n\t\t_ = a\n\t}\n\tif strings.HasPrefix(s, pre) {\n\t\tvar result string\n\t\tresult = strings.TrimPrefix(\"\", \"\") // noop, as we believe define is more popular.\n\t\t_ = result\n\t}\n\tif strings.HasPrefix(\"\", \"\") {\n\t\ta := strings.TrimPrefix(s, pre) // noop, as the argument isn't the same\n\t\t_ = a\n\t}\n\tif s1 := s; strings.HasPrefix(s1, pre) {\n\t\ta := strings.TrimPrefix(s1, pre) // noop, as IfStmt.Init is present\n\t\t_ = a\n\t}\n}\n\n// test basic unsupported case for CutSuffix\nfunc _() {\n\tif strings.HasSuffix(s, suf) {\n\t\ta := strings.TrimSuffix(\"\", \"\") // noop, as the argument isn't the same\n\t\t_ = a\n\t}\n}\n\nvar value0 string\n\n// test supported cases of pattern2 - CutPrefix\nfunc _() {\n\tif after := strings.TrimPrefix(s, pre); after != s { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tif after := strings.TrimPrefix(s, pre); s != after { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tif after := strings.TrimPrefix(s, pre); s != after { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(strings.TrimPrefix(s, pre)) // noop here\n\t}\n\tif after := strings.TrimPrefix(s, \"\"); s != after { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tvar ok bool // define an ok variable to test the fix won't shadow it for its if stmt body\n\t_ = ok\n\tif after := strings.TrimPrefix(s, pre); after != s { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tvar predefined string\n\tif predefined = strings.TrimPrefix(s, pre); s != predefined { // noop\n\t\tprintln(predefined)\n\t}\n\tif predefined = strings.TrimPrefix(s, pre); s != predefined { // noop\n\t\tprintln(&predefined)\n\t}\n\tvar value string\n\tif value = strings.TrimPrefix(s, pre); s != value { // noop\n\t\tprintln(value)\n\t}\n\tlhsMap := make(map[string]string)\n\tif lhsMap[\"\"] = strings.TrimPrefix(s, pre); s != lhsMap[\"\"] { // noop\n\t\tprintln(lhsMap[\"\"])\n\t}\n\tarr := make([]string, 0)\n\tif arr[0] = strings.TrimPrefix(s, pre); s != arr[0] { // noop\n\t\tprintln(arr[0])\n\t}\n\ttype example struct {\n\t\tfield string\n\t}\n\tvar e example\n\tif e.field = strings.TrimPrefix(s, pre); s != e.field { // noop\n\t\tprintln(e.field)\n\t}\n}\n\n// test basic cases for pattern2 - CutSuffix\nfunc _() {\n\tif before := strings.TrimSuffix(s, suf); before != s { // want \"TrimSuffix can be simplified to CutSuffix\"\n\t\tprintln(before)\n\t}\n\tif before := strings.TrimSuffix(s, suf); s != before { // want \"TrimSuffix can be simplified to CutSuffix\"\n\t\tprintln(before)\n\t}\n}\n\n// test cases that not supported by pattern2 - CutPrefix\nfunc _() {\n\tif after := strings.TrimPrefix(s, pre); s != pre { // noop\n\t\tprintln(after)\n\t}\n\tif after := strings.TrimPrefix(s, pre); after != pre { // noop\n\t\tprintln(after)\n\t}\n\tif strings.TrimPrefix(s, pre) != s {\n\t\tprintln(strings.TrimPrefix(s, pre))\n\t}\n}\n\n// test basic unsupported case for pattern2 - CutSuffix\nfunc _() {\n\tif before := strings.TrimSuffix(s, suf); s != suf { // noop\n\t\tprintln(before)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/testingcontext_test.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage testingcontext\n\nimport (\n\t\"context\"\n\t\"testing\"\n)\n\nfunc Test(t *testing.T) {\n\tctx, cancel := context.WithCancel(context.Background()) // want \"context.WithCancel can be modernized using t.Context\"\n\tdefer cancel()\n\t_ = ctx\n\n\tfunc() {\n\t\tctx, cancel := context.WithCancel(context.Background()) // Nope. scope of defer is not the testing func.\n\t\tdefer cancel()\n\t\t_ = ctx\n\t}()\n\n\t{\n\t\tctx, cancel := context.WithCancel(context.TODO()) // want \"context.WithCancel can be modernized using t.Context\"\n\t\tdefer cancel()\n\t\t_ = ctx\n\t\tvar t int // not in scope of the call to WithCancel\n\t\t_ = t\n\t}\n\n\t{\n\t\tctx := context.Background()\n\t\tctx, cancel := context.WithCancel(context.Background()) // Nope. ctx is redeclared.\n\t\tdefer cancel()\n\t\t_ = ctx\n\t}\n\n\t{\n\t\tvar t int\n\t\tctx, cancel := context.WithCancel(context.Background()) // Nope. t is shadowed.\n\t\tdefer cancel()\n\t\t_ = ctx\n\t\t_ = t\n\t}\n\n\tt.Run(\"subtest\", func(t2 *testing.T) {\n\t\tctx, cancel := context.WithCancel(context.Background()) // want \"context.WithCancel can be modernized using t2.Context\"\n\t\tdefer cancel()\n\t\t_ = ctx\n\t})\n}\n\nfunc TestAlt(t2 *testing.T) {\n\tctx, cancel := context.WithCancel(context.Background()) // want \"context.WithCancel can be modernized using t2.Context\"\n\tdefer cancel()\n\t_ = ctx\n}\n\nfunc Testnot(t *testing.T) {\n\tctx, cancel := context.WithCancel(context.Background()) // Nope. Not a test func.\n\tdefer cancel()\n\t_ = ctx\n}\n\nfunc Benchmark(b *testing.B) {\n\tctx, cancel := context.WithCancel(context.Background()) // want \"context.WithCancel can be modernized using b.Context\"\n\tdefer cancel()\n\t_ = ctx\n\n\tb.Run(\"subtest\", func(b2 *testing.B) {\n\t\tctx, cancel := context.WithCancel(context.Background()) // want \"context.WithCancel can be modernized using b2.Context\"\n\t\tdefer cancel()\n\t\t_ = ctx\n\t})\n}\n\nfunc Fuzz(f *testing.F) {\n\tctx, cancel := context.WithCancel(context.Background()) // want \"context.WithCancel can be modernized using f.Context\"\n\tdefer cancel()\n\t_ = ctx\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/in/waitgroup.go",
    "content": "//go:build go1.25\n\n//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage waitgroup\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\n// supported case for pattern 1.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t}()\n\n\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tdefer wg.Done()\n\t}()\n\n\tfor range 10 {\n\t\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\t\tgo func() {\n\t\t\tdefer wg.Done()\n\t\t\tfmt.Println()\n\t\t}()\n\t}\n}\n\n// supported case for pattern 2.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tfmt.Println()\n\t\twg.Done()\n\t}()\n\n\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\twg.Done()\n\t}()\n\n\tfor range 10 {\n\t\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\t\tgo func() {\n\t\t\tfmt.Println()\n\t\t\twg.Done()\n\t\t}()\n\t}\n}\n\n// this function puts some wrong usages but waitgroup modernizer will still offer fixes.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t}()\n\n\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t\twg.Done()\n\t}()\n\n\twg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tfmt.Println()\n\t\twg.Done()\n\t\twg.Done()\n\t}()\n}\n\n// this function puts the unsupported cases of pattern 1.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Add(1)\n\tgo func() {}()\n\n\twg.Add(1)\n\tgo func(i int) {\n\t\tdefer wg.Done()\n\t\tfmt.Println(i)\n\t}(1)\n\n\twg.Add(1)\n\tgo func() {\n\t\tfmt.Println()\n\t\tdefer wg.Done()\n\t}()\n\n\twg.Add(1)\n\tgo func() { // noop: no wg.Done call inside function body.\n\t\tfmt.Println()\n\t}()\n\n\tgo func() { // noop: no Add call before this go stmt.\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t}()\n\n\twg.Add(2) // noop: only support Add(1).\n\tgo func() {\n\t\tdefer wg.Done()\n\t}()\n\n\tvar wg1 sync.WaitGroup\n\twg1.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t}()\n\n\twg.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tdefer wg1.Done()\n\t\tfmt.Println()\n\t}()\n}\n\n// this function puts the unsupported cases of pattern 2.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Add(1)\n\tgo func() {\n\t\twg.Done()\n\t\tfmt.Println()\n\t}()\n\n\tgo func() { // noop: no Add call before this go stmt.\n\t\tfmt.Println()\n\t\twg.Done()\n\t}()\n\n\tvar wg1 sync.WaitGroup\n\twg1.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tfmt.Println()\n\t\twg.Done()\n\t}()\n\n\twg.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tfmt.Println()\n\t\twg1.Done()\n\t}()\n}\n\ntype Server struct {\n\twg sync.WaitGroup\n}\n\ntype ServerContainer struct {\n\tserv Server\n}\n\nfunc _() {\n\tvar s Server\n\ts.wg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tprint()\n\t\ts.wg.Done()\n\t}()\n\n\tvar sc ServerContainer\n\tsc.serv.wg.Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tprint()\n\t\tsc.serv.wg.Done()\n\t}()\n\n\tvar wg sync.WaitGroup\n\tarr := [1]*sync.WaitGroup{&wg}\n\tarr[0].Add(1) // want \"Goroutine creation can be simplified using WaitGroup.Go\"\n\tgo func() {\n\t\tprint()\n\t\tarr[0].Done()\n\t}()\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/any.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage any\n\nfunc _(x any) {} // want \"interface{} can be replaced by any\"\n\nfunc _() {\n\tvar x any // want \"interface{} can be replaced by any\"\n\tconst any = 1\n\tvar y interface{} // nope: any is shadowed here\n\t_, _ = x, y\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/fieldsseq.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage fieldsseq\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n)\n\nfunc _() {\n\tfor line := range strings.FieldsSeq(\"\") { // want \"Ranging over FieldsSeq is more efficient\"\n\t\tprintln(line)\n\t}\n\tfor i, line := range strings.Fields(\"\") { // nope: uses index var\n\t\tprintln(i, line)\n\t}\n\tfor i, _ := range strings.Fields(\"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor i := range strings.Fields(\"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor range strings.FieldsSeq(\"\") { // want \"Ranging over FieldsSeq is more efficient\"\n\t}\n\tfor range strings.FieldsSeq(\"\") { // want \"Ranging over FieldsSeq is more efficient\"\n\t}\n\tfor range bytes.FieldsSeq(nil) { // want \"Ranging over FieldsSeq is more efficient\"\n\t}\n\t{\n\t\tlines := strings.FieldsSeq(\"\") // want \"Ranging over FieldsSeq is more efficient\"\n\t\tfor line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t}\n\t{\n\t\tlines := strings.Fields(\"\") // nope: lines is used not just by range\n\t\tfor _, line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t\tprintln(lines)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/fmtappendf.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage fmtappendf\n\nimport (\n\t\"fmt\"\n)\n\nfunc two() string {\n\treturn \"two\"\n}\n\nfunc bye() {\n\t_ = fmt.Appendf(nil, \"bye %d\", 1) // want \"Replace .*Sprintf.* with fmt.Appendf\"\n}\n\nfunc funcsandvars() {\n\tone := \"one\"\n\t_ = fmt.Appendf(nil, \"bye %d %s %s\", 1, two(), one) // want \"Replace .*Sprintf.* with fmt.Appendf\"\n}\n\nfunc typealias() {\n\ttype b = byte\n\ttype bt = []byte\n\t_ = fmt.Appendf(nil, \"bye %d\", 1) // want \"Replace .*Sprintf.* with fmt.Appendf\"\n\t_ = fmt.Appendf(nil, \"bye %d\", 1) // want \"Replace .*Sprintf.* with fmt.Appendf\"\n}\n\nfunc otherprints() {\n\t_ = fmt.Append(nil, \"bye %d\", 1)   // want \"Replace .*Sprint.* with fmt.Append\"\n\t_ = fmt.Appendln(nil, \"bye %d\", 1) // want \"Replace .*Sprintln.* with fmt.Appendln\"\n}\n\nfunc comma() {\n\ttype S struct{ Bytes []byte }\n\tvar _ = struct{ A S }{\n\t\tA: S{\n\t\t\tBytes: fmt.Appendf(nil, \"%d\", 0),\n\t\t},\n\t}\n\t_ = fmt.Appendf(nil, \"%d\", 0)\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/forvar.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage forvar\n\nfunc _(m map[int]int, s []int) {\n\t// changed\n\tfor i := range s {\n\t\tgo f(i)\n\t}\n\tfor _, v := range s {\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m {\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor i := range s {\n\t\tgo f(i)\n\t}\n\t// nope\n\tvar i, k, v int\n\n\tfor i = range s { // nope, scope change\n\t\ti := i\n\t\tgo f(i)\n\t}\n\tfor _, v = range s { // nope, scope change\n\t\tv := v\n\t\tgo f(v)\n\t}\n\tfor k = range m { // nope, scope change\n\t\tk := k\n\t\tgo f(k)\n\t}\n\tfor k, v = range m { // nope, scope change\n\t\tk := k\n\t\tv := v\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor _, v = range m { // nope, scope change\n\t\tv := v\n\t\tgo f(v)\n\t}\n\tfor _, v = range m { // nope, not x := x\n\t\tv := i\n\t\tgo f(v)\n\t}\n\tfor k, v := range m { // nope, LHS and RHS differ\n\t\tv, k := k, v\n\t\tgo f(k)\n\t\tgo f(v)\n\t}\n\tfor k, v := range m { // nope, not a simple redecl\n\t\tk, v, x := k, v, 1\n\t\tgo f(k)\n\t\tgo f(v)\n\t\tgo f(x)\n\t}\n\tfor i := range s { // nope, not a simple redecl\n\t\ti := (i)\n\t\tgo f(i)\n\t}\n\tfor i := range s { // nope, not a simple redecl\n\t\ti := i + 1\n\t\tgo f(i)\n\t}\n}\n\nfunc f(n int) {}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/mapsloop.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage mapsloop\n\nimport (\n\t\"iter\"\n\t\"maps\"\n)\n\nvar _ = maps.Clone[M] // force \"maps\" import so that each diagnostic doesn't add one\n\ntype M map[int]string\n\n// -- src is map --\n\nfunc useCopy(dst, src map[int]string) {\n\t// Replace loop by maps.Copy.\n\t// A\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n}\n\nfunc useCopyGeneric[K comparable, V any, M ~map[K]V](dst, src M) {\n\t// Replace loop by maps.Copy.\n\t// A\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n}\n\nfunc useCopyNotClone(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace make(...) by maps.Copy.\n\tdst := make(map[int]string, len(src))\n\t// A\n\t// B\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\t// C\n\tmaps.Copy(dst, src)\n\n\t// A\n\tdst = map[int]string{}\n\t// B\n\t// C\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\tprintln(dst)\n}\n\nfunc useCopyParen(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace (make)(...) by maps.Clone.\n\tdst := (make)(map[int]string, len(src))\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\n\tdst = (map[int]string{})\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\tprintln(dst)\n}\n\nfunc useCopy_typesDiffer(src M) {\n\t// Replace loop but not make(...) as maps.Copy(src) would return wrong type M.\n\tdst := make(map[int]string, len(src))\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\tprintln(dst)\n}\n\nfunc useCopy_typesDiffer2(src map[int]string) {\n\t// Replace loop but not make(...) as maps.Copy(src) would return wrong type map[int]string.\n\tdst := make(M, len(src))\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\tprintln(dst)\n}\n\nfunc useClone_typesDiffer3(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace loop and make(...) as maps.Clone(src) returns map[int]string\n\t// which is assignable to M.\n\tvar dst M\n\tdst = make(M, len(src))\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\tprintln(dst)\n}\n\nfunc useClone_typesDiffer4(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace loop and make(...) as maps.Clone(src) returns map[int]string\n\t// which is assignable to M.\n\tvar dst M\n\tdst = make(M, len(src))\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\tprintln(dst)\n}\n\nfunc useClone_generic[Map ~map[K]V, K comparable, V any](src Map) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace loop and make(...) by maps.Clone\n\tdst := make(Map, len(src))\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tmaps.Copy(dst, src)\n\tprintln(dst)\n}\n\n// -- src is iter.Seq2 --\n\nfunc useInsert_assignableToSeq2(dst map[int]string, src func(yield func(int, string) bool)) {\n\t// Replace loop by maps.Insert because src is assignable to iter.Seq2.\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Insert\"\n\tmaps.Insert(dst, src)\n}\n\nfunc useCollect(src iter.Seq2[int, string]) {\n\t// Replace loop and make(...) by maps.Collect.\n\tvar dst map[int]string\n\t// A\n\t// B\n\t// C\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Collect\"\n\tdst = maps.Collect(src)\n}\n\nfunc useInsert_typesDifferAssign(src iter.Seq2[int, string]) {\n\t// Replace loop and make(...): maps.Collect returns an unnamed map type\n\t// that is assignable to M.\n\tvar dst M\n\t// A\n\t// B\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Collect\"\n\tdst = maps.Collect(src)\n}\n\nfunc useInsert_typesDifferDeclare(src iter.Seq2[int, string]) {\n\t// Replace loop but not make(...) as maps.Collect would return an\n\t// unnamed map type that would change the type of dst.\n\tdst := make(M)\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Insert\"\n\tmaps.Insert(dst, src)\n}\n\n// -- non-matches --\n\ntype isomerOfSeq2 func(yield func(int, string) bool)\n\nfunc nopeInsertRequiresAssignableToSeq2(dst map[int]string, src isomerOfSeq2) {\n\tfor k, v := range src { // nope: src is not assignable to maps.Insert's iter.Seq2 parameter\n\t\tdst[k] = v\n\t}\n}\n\nfunc nopeSingleVarRange(dst map[int]bool, src map[int]string) {\n\tfor key := range src { // nope: must be \"for k, v\"\n\t\tdst[key] = true\n\t}\n}\n\nfunc nopeBodyNotASingleton(src map[int]string) {\n\tvar dst map[int]string\n\tfor key, value := range src {\n\t\tdst[key] = value\n\t\tprintln() // nope: other things in the loop body\n\t}\n}\n\n// Regression test for https://github.com/golang/go/issues/70815#issuecomment-2581999787.\nfunc nopeAssignmentHasIncrementOperator(src map[int]int) {\n\tdst := make(map[int]int)\n\tfor k, v := range src {\n\t\tdst[k] += v\n\t}\n}\n\nfunc nopeNotAMap(src map[int]string) {\n\tvar dst []string\n\tfor k, v := range src {\n\t\tdst[k] = v\n\t}\n}\n\nfunc nopeNotAMapGeneric[E any, M ~map[int]E, S ~[]E](src M) {\n\tvar dst S\n\tfor k, v := range src {\n\t\tdst[k] = v\n\t}\n}\n\nfunc nopeHasImplicitWidening(src map[string]int) {\n\tdst := make(map[string]any)\n\tfor k, v := range src {\n\t\tdst[k] = v\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/mapsloop_dot.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage mapsloop\n\nimport . \"maps\"\n\nvar _ = Clone[M] // force \"maps\" import so that each diagnostic doesn't add one\n\ntype M map[int]string\n\nfunc useCopyDot(dst, src map[int]string) {\n\t// Replace loop by maps.Copy.\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tCopy(dst, src)\n}\n\nfunc useCloneDot(src map[int]string) {\n\t// Clone is tempting but wrong when src may be nil; see #71844.\n\n\t// Replace make(...) by maps.Copy.\n\tdst := make(map[int]string, len(src))\n\t// want \"Replace m\\\\[k\\\\]=v loop with maps.Copy\"\n\tCopy(dst, src)\n\tprintln(dst)\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/minmax.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage minmax\n\nfunc ifmin(a, b int) {\n\tx := max(\n\t\t// A\n\t\t// B\n\t\ta,\n\t\t// want \"if statement can be modernized using max\"\n\t\t// C\n\t\t// D\n\t\t// E\n\t\tb)\n\tprint(x)\n}\n\nfunc ifmax(a, b int) {\n\tx := min(a,\n\t\t// want \"if statement can be modernized using min\"\n\t\tb)\n\tprint(x)\n}\n\nfunc ifminvariant(a, b int) {\n\tx := min(a,\n\t\t// want \"if statement can be modernized using min\"\n\t\tb)\n\tprint(x)\n}\n\nfunc ifmaxvariant(a, b int) {\n\tx := min(a,\n\t\t// want \"if statement can be modernized using min\"\n\t\tb)\n\tprint(x)\n}\n\nfunc ifelsemin(a, b int) {\n\tvar x int // A\n\t// B\n\tx = min(\n\t\t// want \"if/else statement can be modernized using min\"\n\t\t// C\n\t\t// D\n\t\t// E\n\t\ta,\n\t\t// F\n\t\t// G\n\t\t// H\n\t\tb)\n\tprint(x)\n}\n\nfunc ifelsemax(a, b int) {\n\t// A\n\tvar x int // B\n\t// C\n\tx = max(\n\t\t// want \"if/else statement can be modernized using max\"\n\t\t// D\n\t\t// E\n\t\t// F\n\t\ta,\n\t\t// G\n\t\tb)\n\tprint(x)\n}\n\nfunc shadowed() int {\n\thour, min := 3600, 60\n\n\tvar time int\n\tif hour < min { // silent: the built-in min function is shadowed here\n\t\ttime = hour\n\t} else {\n\t\ttime = min\n\t}\n\treturn time\n}\n\nfunc nopeIfStmtHasInitStmt() {\n\tx := 1\n\tif y := 2; y < x { // silent: IfStmt has an Init stmt\n\t\tx = y\n\t}\n\tprint(x)\n}\n\n// Regression test for a bug: fix was \"y := max(x, y)\".\nfunc oops() {\n\tx := 1\n\ty := max(x,\n\t\t// want \"if statement can be modernized using max\"\n\t\t2)\n\tprint(y)\n}\n\n// Regression test for a bug: += is not a simple assignment.\nfunc nopeAssignHasIncrementOperator() {\n\tx := 1\n\ty := 0\n\ty += 2\n\tif x > y {\n\t\ty = x\n\t}\n\tprint(y)\n}\n\n// Regression test for https://github.com/golang/go/issues/71721.\nfunc nopeNotAMinimum(x, y int) int {\n\t// A value of -1 or 0 will use a default value (30).\n\tif x <= 0 {\n\t\ty = 30\n\t} else {\n\t\ty = x\n\t}\n\treturn y\n}\n\n// Regression test for https://github.com/golang/go/issues/71847#issuecomment-2673491596\nfunc nopeHasElseBlock(x int) int {\n\ty := x\n\t// Before, this was erroneously reduced to y = max(x, 0)\n\tif y < 0 {\n\t\ty = 0\n\t} else {\n\t\ty += 2\n\t}\n\treturn y\n}\n\nfunc fix72727(a, b int) {\n\to := max(\n\t\t// some important comment. DO NOT REMOVE.\n\t\ta-42,\n\t\t// want \"if statement can be modernized using max\"\n\t\tb)\n}\n\ntype myfloat float64\n\n// The built-in min/max differ in their treatment of NaN,\n// so reject floating-point numbers (#72829).\nfunc nopeFloat(a, b myfloat) (res myfloat) {\n\tif a < b {\n\t\tres = a\n\t} else {\n\t\tres = b\n\t}\n\treturn\n}\n\n// Regression test for golang/go#72928.\nfunc underscoreAssign(a, b int) {\n\tif a > b {\n\t\t_ = a\n\t}\n}\n\n// Regression test for https://github.com/golang/go/issues/73576.\nfunc nopeIfElseIf(a int) int {\n\tx := 0\n\tif a < 0 {\n\t\tx = 0\n\t} else if a > 100 {\n\t\tx = 100\n\t} else {\n\t\tx = a\n\t}\n\treturn x\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/rangeint.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage rangeint\n\nimport (\n\t\"os\"\n\tos1 \"os\"\n)\n\nfunc _(i int, s struct{ i int }, slice []int) {\n\tfor i := range 10 { // want \"for loop can be modernized using range over int\"\n\t\tprintln(i)\n\t}\n\tfor j := range 10 { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range int8(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range int16(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range int32(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range int64(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range uint8(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range uint16(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range uint32(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range uint64(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range int8(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range int8(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\tfor j := range os1.FileMode(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n\n\t{\n\t\tvar i int\n\t\tfor i = range 10 { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t\t// NB: no uses of i after loop.\n\t}\n\tfor range 10 { // want \"for loop can be modernized using range over int\"\n\t\t// i unused within loop\n\t}\n\tfor i := range slice { // want \"for loop can be modernized using range over int\"\n\t\tprintln(slice[i])\n\t}\n\tfor range len(\"\") { // want \"for loop can be modernized using range over int\"\n\t\t// NB: not simplified to range \"\"\n\t}\n\n\t// nope\n\tfor j := .0; j < 10; j++ { // nope: j is a float type\n\t\tprintln(j)\n\t}\n\tfor j := float64(0); j < 10; j++ { // nope: j is a float type\n\t\tprintln(j)\n\t}\n\tfor i := 0; i < 10; { // nope: missing increment\n\t}\n\tfor i := 0; i < 10; i-- { // nope: negative increment\n\t}\n\tfor i := 0; ; i++ { // nope: missing comparison\n\t}\n\tfor i := 0; i <= 10; i++ { // nope: wrong comparison\n\t}\n\tfor ; i < 10; i++ { // nope: missing init\n\t}\n\tfor s.i = 0; s.i < 10; s.i++ { // nope: not an ident\n\t}\n\tfor i := 0; i < 10; i++ { // nope: takes address of i\n\t\tprintln(&i)\n\t}\n\tfor i := 0; i < 10; i++ { // nope: increments i\n\t\ti++\n\t}\n\tfor i := 0; i < 10; i++ { // nope: assigns i\n\t\ti = 8\n\t}\n\n\t// The limit expression must be loop invariant;\n\t// see https://github.com/golang/go/issues/72917\n\tfor i := 0; i < f(); i++ { // nope\n\t}\n\t{\n\t\tvar s struct{ limit int }\n\t\tfor i := 0; i < s.limit; i++ { // nope: limit is not a const or local var\n\t\t}\n\t}\n\t{\n\t\tconst k = 10\n\t\tfor range k { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t}\n\t{\n\t\tvar limit = 10\n\t\tfor range limit { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t}\n\t{\n\t\tvar limit = 10\n\t\tfor i := 0; i < limit; i++ { // nope: limit is address-taken\n\t\t}\n\t\tprint(&limit)\n\t}\n\t{\n\t\tlimit := 10\n\t\tlimit++\n\t\tfor i := 0; i < limit; i++ { // nope: limit is assigned other than by its declaration\n\t\t}\n\t}\n\tfor i := 0; i < Global; i++ { // nope: limit is an exported global var; may be updated elsewhere\n\t}\n\tfor range table { // want \"for loop can be modernized using range over int\"\n\t}\n\t{\n\t\ts := []string{}\n\t\tfor i := 0; i < len(s); i++ { // nope: limit is not loop-invariant\n\t\t\ts = s[1:]\n\t\t}\n\t}\n\tfor i := 0; i < len(slice); i++ { // nope: i is incremented within loop\n\t\ti += 1\n\t}\n\tfor Global = 0; Global < 10; Global++ { // nope: loop index is a global variable.\n\t}\n}\n\nvar Global int\n\nvar table = []string{\"hello\", \"world\"}\n\nfunc f() int { return 0 }\n\n// Repro for part of #71847: (\"for range n is invalid if the loop body contains i++\"):\nfunc _(s string) {\n\tvar i int                    // (this is necessary)\n\tfor i = 0; i < len(s); i++ { // nope: loop body increments i\n\t\tif true {\n\t\t\ti++ // nope\n\t\t}\n\t}\n}\n\n// Repro for #71952: for and range loops have different final values\n// on i (n and n-1, respectively) so we can't offer the fix if i is\n// used after the loop.\nfunc nopePostconditionDiffers() {\n\ti := 0\n\tfor i = 0; i < 5; i++ {\n\t\tprintln(i)\n\t}\n\tprintln(i) // must print 5, not 4\n}\n\n// Non-integer untyped constants need to be explicitly converted to int.\nfunc issue71847d() {\n\tconst limit = 1e3      // float\n\tfor range int(limit) { // want \"for loop can be modernized using range over int\"\n\t}\n\tfor range int(limit) { // want \"for loop can be modernized using range over int\"\n\t}\n\tfor range uint(limit) { // want \"for loop can be modernized using range over int\"\n\t}\n\n\tconst limit2 = 1 + 0i   // complex\n\tfor range int(limit2) { // want \"for loop can be modernized using range over int\"\n\t}\n}\n\nfunc issue72726() {\n\tvar n, kd int\n\tfor i := range n { // want \"for loop can be modernized using range over int\"\n\t\t// nope: j will be invisible once it's refactored to 'for j := range min(n-j, kd+1)'\n\t\tfor j := 0; j < min(n-j, kd+1); j++ { // nope\n\t\t\t_, _ = i, j\n\t\t}\n\t}\n\n\tfor i := 0; i < i; i++ { // nope\n\t}\n\n\tvar i int\n\tfor i = 0; i < i/2; i++ { // nope\n\t}\n\n\tvar arr []int\n\tfor i = 0; i < arr[i]; i++ { // nope\n\t}\n}\n\nfunc todo() {\n\tfor j := range os1.FileMode(10) { // want \"for loop can be modernized using range over int\"\n\t\tprintln(j)\n\t}\n}\n\ntype T uint\ntype TAlias = uint\n\nfunc Fn(a int) T {\n\treturn T(a)\n}\n\nfunc issue73037() {\n\tvar q T\n\tfor a := range q { // want \"for loop can be modernized using range over int\"\n\t\tprintln(a)\n\t}\n\tfor a := Fn(0); a < q; a++ {\n\t\tprintln(a)\n\t}\n\tvar qa TAlias\n\tfor a := range qa { // want \"for loop can be modernized using range over int\"\n\t\tprintln(a)\n\t}\n\tfor a := range T(10) { // want \"for loop can be modernized using range over int\"\n\t\tfor b := range T(10) { // want \"for loop can be modernized using range over int\"\n\t\t\tprintln(a, b)\n\t\t}\n\t}\n}\n\nfunc issue75289() {\n\t// A use of i within a defer may be textually before the loop but runs\n\t// after, so it should cause the loop to be rejected as a candidate\n\t// to avoid it observing a different final value of i.\n\t{\n\t\tvar i int\n\t\tdefer func() { println(i) }()\n\t\tfor i = 0; i < 10; i++ { // nope: i is accessed after the loop (via defer)\n\t\t}\n\t}\n\n\t// A use of i within a defer within the loop is also a dealbreaker.\n\t{\n\t\tvar i int\n\t\tfor i = 0; i < 10; i++ { // nope: i is accessed after the loop (via defer)\n\t\t\tdefer func() { println(i) }()\n\t\t}\n\t}\n\n\t// This (outer) defer is irrelevant.\n\tdefer func() {\n\t\tvar i int\n\t\tfor i = range 10 { // want \"for loop can be modernized using range over int\"\n\t\t}\n\t}()\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/reflecttypefor.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage reflecttypefor\n\nimport (\n\t\"io\"\n\t\"reflect\"\n\t\"time\"\n)\n\nvar (\n\tx any\n\t_ = reflect.TypeOf(x)                // nope (dynamic)\n\t_ = reflect.TypeFor[int]()           // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeFor[uint]()          // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(error(nil))       // nope (likely a mistake)\n\t_ = reflect.TypeFor[*error]()        // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeOf(io.Reader(nil))   // nope (likely a mistake)\n\t_ = reflect.TypeFor[*io.Reader]()    // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeFor[time.Time]()     // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeFor[time.Time]()     // want \"reflect.TypeOf call can be simplified using TypeFor\"\n\t_ = reflect.TypeFor[time.Duration]() // want \"reflect.TypeOf call can be simplified using TypeFor\"\n)\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/slicescontains.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage slicescontains\n\nimport \"slices\"\n\nvar _ = slices.Contains[[]int] // force import of \"slices\" to avoid duplicate import edits\n\nfunc nopeNoBreak(slice []int, needle int) {\n\tfor i := range slice {\n\t\tif slice[i] == needle {\n\t\t\tprintln(\"found\")\n\t\t}\n\t}\n}\n\nfunc rangeIndex(slice []int, needle int) {\n\tif slices.Contains(slice, needle) {\n\t\tprintln(\"found\")\n\t}\n}\n\nfunc rangeValue(slice []int, needle int) {\n\tif slices.Contains(slice, needle) {\n\t\tprintln(\"found\")\n\t}\n}\n\nfunc returns(slice []int, needle int) {\n\tif slices.Contains(slice, needle) {\n\t\tprintln(\"found\")\n\t\treturn\n\t}\n}\n\nfunc assignTrueBreak(slice []int, needle int) {\n\tfound := slices.Contains(slice, needle)\n\tprint(found)\n}\n\nfunc assignFalseBreak(slice []int, needle int) {\n\tfound := !slices.Contains(slice, needle)\n\tprint(found)\n}\n\nfunc assignFalseBreakInSelectSwitch(slice []int, needle int) {\n\t// Exercise RangeStmt in CommClause, CaseClause.\n\tselect {\n\tdefault:\n\t\tfound := slices.Contains(slice, needle)\n\t\tprint(found)\n\t}\n\tswitch {\n\tdefault:\n\t\tfound := slices.Contains(slice, needle)\n\t\tprint(found)\n\t}\n}\n\nfunc returnTrue(slice []int, needle int) bool {\n\treturn slices.Contains(slice, needle)\n}\n\nfunc returnFalse(slice []int, needle int) bool {\n\treturn !slices.Contains(slice, needle)\n}\n\nfunc containsFunc(slice []int, needle int) bool {\n\treturn slices.ContainsFunc(slice, predicate)\n}\n\nfunc nopeLoopBodyHasFreeContinuation(slice []int, needle int) bool {\n\tfor _, elem := range slice {\n\t\tif predicate(elem) {\n\t\t\tif needle == 7 {\n\t\t\t\tcontinue // this statement defeats loop elimination\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc generic[T any](slice []T, f func(T) bool) bool {\n\treturn slices.ContainsFunc(slice, f)\n}\n\nfunc predicate(int) bool\n\n// Regression tests for bad fixes when needle\n// and haystack have different types (#71313):\n\nfunc nopeNeedleHaystackDifferentTypes(x any, args []error) {\n\tfor _, arg := range args {\n\t\tif arg == x {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc nopeNeedleHaystackDifferentTypes2(x error, args []any) {\n\tfor _, arg := range args {\n\t\tif arg == x {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc nopeVariadicNamedContainsFunc(slice []int) bool {\n\tfor _, elem := range slice {\n\t\tif variadicPredicate(elem) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc variadicPredicate(int, ...any) bool\n\nfunc nopeVariadicContainsFunc(slice []int) bool {\n\tf := func(int, ...any) bool {\n\t\treturn true\n\t}\n\tfor _, elem := range slice {\n\t\tif f(elem) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Negative test case for implicit C->I conversion\ntype I interface{ F() }\ntype C int\n\nfunc (C) F() {}\n\nfunc nopeImplicitConversionContainsFunc(slice []C, f func(I) bool) bool {\n\tfor _, elem := range slice {\n\t\tif f(elem) { // implicit conversion from C to I\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc nopeTypeParamWidening[T any](slice []T, f func(any) bool) bool {\n\tfor _, elem := range slice {\n\t\tif f(elem) { // implicit conversion from T to any\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/slicessort.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage slicessort\n\nimport \"slices\"\n\nimport \"sort\"\n\ntype myint int\n\nfunc _(s []myint) {\n\tslices.Sort(s) // want \"sort.Slice can be modernized using slices.Sort\"\n}\n\nfunc _(x *struct{ s []int }) {\n\tslices.Sort(x.s) // want \"sort.Slice can be modernized using slices.Sort\"\n}\n\nfunc _(s []int) {\n\tsort.Slice(s, func(i, j int) bool { return s[i] > s[j] }) // nope: wrong comparison operator\n}\n\nfunc _(s []int) {\n\tsort.Slice(s, func(i, j int) bool { return s[j] < s[i] }) // nope: wrong index var\n}\n\nfunc _(sense bool, s2 []struct{ x int }) {\n\tsort.Slice(s2, func(i, j int) bool { return s2[i].x < s2[j].x }) // nope: not a simple index operation\n\n\t// Regression test for a crash: the sole statement of a\n\t// comparison func body is not necessarily a return!\n\tsort.Slice(s2, func(i, j int) bool {\n\t\tif sense {\n\t\t\treturn s2[i].x < s2[j].x\n\t\t} else {\n\t\t\treturn s2[i].x > s2[j].x\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/splitseq.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage splitseq\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n)\n\nfunc _() {\n\tfor line := range strings.SplitSeq(\"\", \"\") { // want \"Ranging over SplitSeq is more efficient\"\n\t\tprintln(line)\n\t}\n\tfor i, line := range strings.Split(\"\", \"\") { // nope: uses index var\n\t\tprintln(i, line)\n\t}\n\tfor i, _ := range strings.Split(\"\", \"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor i := range strings.Split(\"\", \"\") { // nope: uses index var\n\t\tprintln(i)\n\t}\n\tfor range strings.SplitSeq(\"\", \"\") { // want \"Ranging over SplitSeq is more efficient\"\n\t}\n\tfor range strings.SplitSeq(\"\", \"\") { // want \"Ranging over SplitSeq is more efficient\"\n\t}\n\tfor range bytes.SplitSeq(nil, nil) { // want \"Ranging over SplitSeq is more efficient\"\n\t}\n\t{\n\t\tlines := strings.SplitSeq(\"\", \"\") // want \"Ranging over SplitSeq is more efficient\"\n\t\tfor line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t}\n\t{\n\t\tlines := strings.Split(\"\", \"\") // nope: lines is used not just by range\n\t\tfor _, line := range lines {\n\t\t\tprintln(line)\n\t\t}\n\t\tprintln(lines)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/stditerators.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage stditerators\n\nimport \"go/types\"\n\nfunc _(tuple *types.Tuple) {\n\tfor v := range tuple.Variables() { // want \"Len/At loop can simplified using Tuple.Variables iteration\"\n\t\tprint(v)\n\t}\n}\n\nfunc _(scope *types.Scope) {\n\tfor child := range scope.Children() { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\tprint(child)\n\t}\n\t{\n\t\tconst child = 0                       // shadowing of preferred name at def\n\t\tfor child := range scope.Children() { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\t\tprint(child)\n\t\t}\n\t}\n\t{\n\t\tfor i := 0; i < scope.NumChildren(); i++ {\n\t\t\tconst child = 0 // nope: shadowing of fresh name at use\n\t\t\tprint(scope.Child(i))\n\t\t}\n\t}\n\t{\n\t\tfor elem := range scope.Children() { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\t\telem := elem // => preferred name = \"elem\"\n\t\t\tprint(elem)\n\t\t}\n\t}\n\t{\n\t\tfor child := range scope.Children() { // want \"NumChildren/Child loop can simplified using Scope.Children iteration\"\n\t\t\tfirst := scope.Child(0) // the name heuristic should not be fooled by this\n\t\t\tprint(first, child)\n\t\t}\n\t}\n}\n\nfunc _(union, union2 *types.Union) {\n\tfor term := range union.Terms() { // want \"Len/Term loop can simplified using Union.Terms iteration\"\n\t\tprint(term)\n\t\tprint(term)\n\t}\n\tfor i := union.Len() - 1; i >= 0; i-- { // nope: wrong loop form\n\t\tprint(union.Term(i))\n\t}\n\tfor i := 0; i <= union.Len(); i++ { // nope: wrong loop form\n\t\tprint(union.Term(i))\n\t}\n\tfor i := 0; i <= union.Len(); i++ { // nope: use of i not in x.At(i)\n\t\tprint(i, union.Term(i))\n\t}\n\tfor i := 0; i <= union.Len(); i++ { // nope: x.At and x.Len have different receivers\n\t\tprint(i, union2.Term(i))\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/stringsbuilder.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage stringsbuilder\n\nimport \"strings\"\n\n// basic test\nfunc _() {\n\tvar s strings.Builder\n\ts.WriteString(\"before\")\n\tfor range 10 {\n\t\ts.WriteString(\"in\") // want \"using string \\\\+= string in a loop is inefficient\"\n\t\ts.WriteString(\"in2\")\n\t}\n\ts.WriteString(\"after\")\n\tprint(s.String())\n}\n\n// with initializer\nfunc _() {\n\tvar s strings.Builder\n\ts.WriteString(\"a\")\n\tfor range 10 {\n\t\ts.WriteString(\"b\") // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s.String())\n}\n\n// with empty initializer\nfunc _() {\n\tvar s strings.Builder\n\tfor range 10 {\n\t\ts.WriteString(\"b\") // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s.String())\n}\n\n// with short decl\nfunc _() {\n\tvar s strings.Builder\n\ts.WriteString(\"a\")\n\tfor range 10 {\n\t\ts.WriteString(\"b\") // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s.String())\n}\n\n// with short decl and empty initializer\nfunc _() {\n\tvar s strings.Builder\n\tfor range 10 {\n\t\ts.WriteString(\"b\") // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\tprint(s.String())\n}\n\n// nope: += must appear at least once within a loop.\nfunc _() {\n\tvar s string\n\ts += \"a\"\n\ts += \"b\"\n\ts += \"c\"\n\tprint(s)\n}\n\n// nope: the declaration of s is not in a block.\nfunc _() {\n\tif s := \"a\"; true {\n\t\tfor range 10 {\n\t\t\ts += \"x\"\n\t\t}\n\t\tprint(s)\n\t}\n}\n\n// in a switch (special case of \"in a block\" logic)\nfunc _() {\n\tswitch {\n\tdefault:\n\t\tvar s strings.Builder\n\t\ts.WriteString(\"a\")\n\t\tfor range 10 {\n\t\t\ts.WriteString(\"b\") // want \"using string \\\\+= string in a loop is inefficient\"\n\t\t}\n\t\tprint(s.String())\n\t}\n}\n\n// nope: don't handle direct assignments to the string  (only +=).\nfunc _(x string) string {\n\tvar s string\n\ts = x\n\tfor range 3 {\n\t\ts += \"\" + x\n\t}\n\treturn s\n}\n\n// Regression test for bug in a GenDecl with parens.\nfunc issue75318(slice []string) string {\n\tvar (\n\t\tmsg strings.Builder\n\t)\n\tfor _, s := range slice {\n\t\tmsg.WriteString(s) // want \"using string \\\\+= string in a loop is inefficient\"\n\t}\n\treturn msg.String()\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/stringscutprefix.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage stringscutprefix\n\nimport (\n\t\"strings\"\n)\n\nvar (\n\ts, pre, suf string\n)\n\n// test supported cases of pattern 1 - CutPrefix\nfunc _() {\n\tif after, ok := strings.CutPrefix(s, pre); ok { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta := after\n\t\t_ = a\n\t}\n\tif after, ok := strings.CutPrefix(\"\", \"\"); ok { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta := after\n\t\t_ = a\n\t}\n\tif after, ok := strings.CutPrefix(s, \"\"); ok { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln([]byte(after))\n\t}\n\tif after, ok := strings.CutPrefix(s, \"\"); ok { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta, b := \"\", after\n\t\t_, _ = a, b\n\t}\n\tif after, ok := strings.CutPrefix(s, \"\"); ok { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta, b := after, strings.TrimPrefix(s, \"\") // only replace the first occurrence\n\t\ts = \"123\"\n\t\tb = strings.TrimPrefix(s, \"\") // only replace the first occurrence\n\t\t_, _ = a, b\n\t}\n\n\tvar a, b string\n\tif after, ok := strings.CutPrefix(s, \"\"); ok { // want \"HasPrefix \\\\+ TrimPrefix can be simplified to CutPrefix\"\n\t\ta, b = \"\", after\n\t\t_, _ = a, b\n\t}\n}\n\n// test basic cases for CutSuffix - only covering the key differences\nfunc _() {\n\tif before, ok := strings.CutSuffix(s, suf); ok { // want \"HasSuffix \\\\+ TrimSuffix can be simplified to CutSuffix\"\n\t\ta := before\n\t\t_ = a\n\t}\n\tif before, ok := strings.CutSuffix(s, \"\"); ok { // want \"HasSuffix \\\\+ TrimSuffix can be simplified to CutSuffix\"\n\t\tprintln([]byte(before))\n\t}\n}\n\n// test cases that are not supported by pattern1 - CutPrefix\nfunc _() {\n\tok := strings.HasPrefix(\"\", \"\")\n\tif ok { // noop, currently it doesn't track the result usage of HasPrefix\n\t\ta := strings.TrimPrefix(\"\", \"\")\n\t\t_ = a\n\t}\n\tif strings.HasPrefix(s, pre) {\n\t\ta := strings.TrimPrefix(\"\", \"\") // noop, as the argument isn't the same\n\t\t_ = a\n\t}\n\tif strings.HasPrefix(s, pre) {\n\t\tvar result string\n\t\tresult = strings.TrimPrefix(\"\", \"\") // noop, as we believe define is more popular.\n\t\t_ = result\n\t}\n\tif strings.HasPrefix(\"\", \"\") {\n\t\ta := strings.TrimPrefix(s, pre) // noop, as the argument isn't the same\n\t\t_ = a\n\t}\n\tif s1 := s; strings.HasPrefix(s1, pre) {\n\t\ta := strings.TrimPrefix(s1, pre) // noop, as IfStmt.Init is present\n\t\t_ = a\n\t}\n}\n\n// test basic unsupported case for CutSuffix\nfunc _() {\n\tif strings.HasSuffix(s, suf) {\n\t\ta := strings.TrimSuffix(\"\", \"\") // noop, as the argument isn't the same\n\t\t_ = a\n\t}\n}\n\nvar value0 string\n\n// test supported cases of pattern2 - CutPrefix\nfunc _() {\n\tif after, ok := strings.CutPrefix(s, pre); ok { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tif after, ok := strings.CutPrefix(s, pre); ok { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tif after, ok := strings.CutPrefix(s, pre); ok { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(strings.TrimPrefix(s, pre)) // noop here\n\t}\n\tif after, ok := strings.CutPrefix(s, \"\"); ok { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tvar ok bool // define an ok variable to test the fix won't shadow it for its if stmt body\n\t_ = ok\n\tif after, ok := strings.CutPrefix(s, pre); ok { // want \"TrimPrefix can be simplified to CutPrefix\"\n\t\tprintln(after)\n\t}\n\tvar predefined string\n\tif predefined = strings.TrimPrefix(s, pre); s != predefined { // noop\n\t\tprintln(predefined)\n\t}\n\tif predefined = strings.TrimPrefix(s, pre); s != predefined { // noop\n\t\tprintln(&predefined)\n\t}\n\tvar value string\n\tif value = strings.TrimPrefix(s, pre); s != value { // noop\n\t\tprintln(value)\n\t}\n\tlhsMap := make(map[string]string)\n\tif lhsMap[\"\"] = strings.TrimPrefix(s, pre); s != lhsMap[\"\"] { // noop\n\t\tprintln(lhsMap[\"\"])\n\t}\n\tarr := make([]string, 0)\n\tif arr[0] = strings.TrimPrefix(s, pre); s != arr[0] { // noop\n\t\tprintln(arr[0])\n\t}\n\ttype example struct {\n\t\tfield string\n\t}\n\tvar e example\n\tif e.field = strings.TrimPrefix(s, pre); s != e.field { // noop\n\t\tprintln(e.field)\n\t}\n}\n\n// test basic cases for pattern2 - CutSuffix\nfunc _() {\n\tif before, ok := strings.CutSuffix(s, suf); ok { // want \"TrimSuffix can be simplified to CutSuffix\"\n\t\tprintln(before)\n\t}\n\tif before, ok := strings.CutSuffix(s, suf); ok { // want \"TrimSuffix can be simplified to CutSuffix\"\n\t\tprintln(before)\n\t}\n}\n\n// test cases that not supported by pattern2 - CutPrefix\nfunc _() {\n\tif after := strings.TrimPrefix(s, pre); s != pre { // noop\n\t\tprintln(after)\n\t}\n\tif after := strings.TrimPrefix(s, pre); after != pre { // noop\n\t\tprintln(after)\n\t}\n\tif strings.TrimPrefix(s, pre) != s {\n\t\tprintln(strings.TrimPrefix(s, pre))\n\t}\n}\n\n// test basic unsupported case for pattern2 - CutSuffix\nfunc _() {\n\tif before := strings.TrimSuffix(s, suf); s != suf { // noop\n\t\tprintln(before)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/testingcontext_test.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage testingcontext\n\nimport (\n\t\"context\"\n\t\"testing\"\n)\n\nfunc Test(t *testing.T) {\n\tctx := t.Context()\n\t_ = ctx\n\n\tfunc() {\n\t\tctx, cancel := context.WithCancel(context.Background()) // Nope. scope of defer is not the testing func.\n\t\tdefer cancel()\n\t\t_ = ctx\n\t}()\n\n\t{\n\t\tctx := t.Context()\n\t\t_ = ctx\n\t\tvar t int // not in scope of the call to WithCancel\n\t\t_ = t\n\t}\n\n\t{\n\t\tctx := context.Background()\n\t\tctx, cancel := context.WithCancel(context.Background()) // Nope. ctx is redeclared.\n\t\tdefer cancel()\n\t\t_ = ctx\n\t}\n\n\t{\n\t\tvar t int\n\t\tctx, cancel := context.WithCancel(context.Background()) // Nope. t is shadowed.\n\t\tdefer cancel()\n\t\t_ = ctx\n\t\t_ = t\n\t}\n\n\tt.Run(\"subtest\", func(t2 *testing.T) {\n\t\tctx := t2.Context()\n\t\t_ = ctx\n\t})\n}\n\nfunc TestAlt(t2 *testing.T) {\n\tctx := t2.Context()\n\t_ = ctx\n}\n\nfunc Testnot(t *testing.T) {\n\tctx, cancel := context.WithCancel(context.Background()) // Nope. Not a test func.\n\tdefer cancel()\n\t_ = ctx\n}\n\nfunc Benchmark(b *testing.B) {\n\tctx := b.Context()\n\t_ = ctx\n\n\tb.Run(\"subtest\", func(b2 *testing.B) {\n\t\tctx := b2.Context()\n\t\t_ = ctx\n\t})\n}\n\nfunc Fuzz(f *testing.F) {\n\tctx := f.Context()\n\t_ = ctx\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/fix/out/waitgroup.go",
    "content": "//go:build go1.25\n\n//golangcitest:args -Emodernize\n//golangcitest:expected_exitcode 0\npackage waitgroup\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\n// supported case for pattern 1.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Go(func() {\n\t\tfmt.Println()\n\t})\n\n\twg.Go(func() {\n\t})\n\n\tfor range 10 {\n\t\twg.Go(func() {\n\t\t\tfmt.Println()\n\t\t})\n\t}\n}\n\n// supported case for pattern 2.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Go(func() {\n\t\tfmt.Println()\n\t})\n\n\twg.Go(func() {\n\t})\n\n\tfor range 10 {\n\t\twg.Go(func() {\n\t\t\tfmt.Println()\n\t\t})\n\t}\n}\n\n// this function puts some wrong usages but waitgroup modernizer will still offer fixes.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Go(func() {\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t})\n\n\twg.Go(func() {\n\t\tfmt.Println()\n\t\twg.Done()\n\t})\n\n\twg.Go(func() {\n\t\tfmt.Println()\n\t\twg.Done()\n\t})\n}\n\n// this function puts the unsupported cases of pattern 1.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Add(1)\n\tgo func() {}()\n\n\twg.Add(1)\n\tgo func(i int) {\n\t\tdefer wg.Done()\n\t\tfmt.Println(i)\n\t}(1)\n\n\twg.Add(1)\n\tgo func() {\n\t\tfmt.Println()\n\t\tdefer wg.Done()\n\t}()\n\n\twg.Add(1)\n\tgo func() { // noop: no wg.Done call inside function body.\n\t\tfmt.Println()\n\t}()\n\n\tgo func() { // noop: no Add call before this go stmt.\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t}()\n\n\twg.Add(2) // noop: only support Add(1).\n\tgo func() {\n\t\tdefer wg.Done()\n\t}()\n\n\tvar wg1 sync.WaitGroup\n\twg1.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tfmt.Println()\n\t}()\n\n\twg.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tdefer wg1.Done()\n\t\tfmt.Println()\n\t}()\n}\n\n// this function puts the unsupported cases of pattern 2.\nfunc _() {\n\tvar wg sync.WaitGroup\n\twg.Add(1)\n\tgo func() {\n\t\twg.Done()\n\t\tfmt.Println()\n\t}()\n\n\tgo func() { // noop: no Add call before this go stmt.\n\t\tfmt.Println()\n\t\twg.Done()\n\t}()\n\n\tvar wg1 sync.WaitGroup\n\twg1.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tfmt.Println()\n\t\twg.Done()\n\t}()\n\n\twg.Add(1) // noop: Add and Done should be the same object.\n\tgo func() {\n\t\tfmt.Println()\n\t\twg1.Done()\n\t}()\n}\n\ntype Server struct {\n\twg sync.WaitGroup\n}\n\ntype ServerContainer struct {\n\tserv Server\n}\n\nfunc _() {\n\tvar s Server\n\ts.wg.Go(func() {\n\t\tprint()\n\t})\n\n\tvar sc ServerContainer\n\tsc.serv.wg.Go(func() {\n\t\tprint()\n\t})\n\n\tvar wg sync.WaitGroup\n\tarr := [1]*sync.WaitGroup{&wg}\n\tarr[0].Go(func() {\n\t\tprint()\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/modernize_any.go",
    "content": "//golangcitest:args -Emodernize\npackage testdata\n\nfunc _(x interface{}) {} // want \"interface{} can be replaced by any\"\n\nfunc _() {\n\tvar x interface{} // want \"interface{} can be replaced by any\"\n\tconst any = 1\n\tvar y interface{} // nope: any is shadowed here\n\t_, _ = x, y\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/modernize_custom.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:config_path testdata/modernize_custom.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nfunc _(x interface{}) {}\n\nfunc _() {\n\tvar x interface{}\n\tconst any = 1\n\tvar y interface{} // nope: any is shadowed here\n\t_, _ = x, y\n}\n"
  },
  {
    "path": "pkg/golinters/modernize/testdata/modernize_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    modernize:\n      disable:\n        - any\n"
  },
  {
    "path": "pkg/golinters/musttag/musttag.go",
    "content": "package musttag\n\nimport (\n\t\"go-simpler.org/musttag\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.MustTagSettings) *goanalysis.Linter {\n\tvar funcs []musttag.Func\n\n\tif settings != nil {\n\t\tfor _, fn := range settings.Functions {\n\t\t\tfuncs = append(funcs, musttag.Func{\n\t\t\t\tName:   fn.Name,\n\t\t\t\tTag:    fn.Tag,\n\t\t\t\tArgPos: fn.ArgPos,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(musttag.New(funcs...)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/musttag/musttag_integration_test.go",
    "content": "package musttag\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/musttag/testdata/musttag.go",
    "content": "//golangcitest:args -Emusttag\npackage testdata\n\nimport (\n\t\"encoding/asn1\"\n\t\"encoding/json\"\n)\n\n// builtin functions:\nfunc musttagJSON() {\n\tvar user struct {\n\t\tName  string\n\t\tEmail string `json:\"email\"`\n\t}\n\tjson.Marshal(user) // want \"the given struct should be annotated with the `json` tag\"\n}\n\n// custom functions from config:\nfunc musttagASN1() {\n\tvar user struct {\n\t\tName  string\n\t\tEmail string `asn1:\"email\"`\n\t}\n\tasn1.Marshal(user)\n}\n"
  },
  {
    "path": "pkg/golinters/musttag/testdata/musttag.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    musttag:\n      functions:\n        - name: encoding/asn1.Marshal\n          tag: asn1\n          arg-pos: 0\n        - name: encoding/asn1.Unmarshal\n          tag: asn1\n          arg-pos: 1\n"
  },
  {
    "path": "pkg/golinters/musttag/testdata/musttag_cgo.go",
    "content": "//golangcitest:args -Emusttag\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"encoding/asn1\"\n\t\"encoding/json\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n// builtin functions:\nfunc _() {\n\tvar user struct {\n\t\tName  string\n\t\tEmail string `json:\"email\"`\n\t}\n\tjson.Marshal(user) // want \"the given struct should be annotated with the `json` tag\"\n}\n\n// custom functions from config:\nfunc _() {\n\tvar user struct {\n\t\tName  string\n\t\tEmail string `asn1:\"email\"`\n\t}\n\tasn1.Marshal(user)\n}\n"
  },
  {
    "path": "pkg/golinters/musttag/testdata/musttag_custom.go",
    "content": "//golangcitest:args -Emusttag\n//golangcitest:config_path testdata/musttag.yml\npackage testdata\n\nimport (\n\t\"encoding/asn1\"\n\t\"encoding/json\"\n)\n\n// builtin functions:\nfunc musttagJSONCustom() {\n\tvar user struct {\n\t\tName  string\n\t\tEmail string `json:\"email\"`\n\t}\n\tjson.Marshal(user) // want \"the given struct should be annotated with the `json` tag\"\n}\n\n// custom functions from config:\nfunc musttagASN1Custom() {\n\tvar user struct {\n\t\tName  string\n\t\tEmail string `asn1:\"email\"`\n\t}\n\tasn1.Marshal(user) // want \"the given struct should be annotated with the `asn1` tag\"\n}\n"
  },
  {
    "path": "pkg/golinters/nakedret/nakedret.go",
    "content": "package nakedret\n\nimport (\n\t\"github.com/alexkohler/nakedret/v2\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.NakedretSettings) *goanalysis.Linter {\n\tcfg := &nakedret.NakedReturnRunner{}\n\n\tif settings != nil {\n\t\t// SkipTestFiles is intentionally ignored => should be managed with `linters.exclusions.rules`.\n\t\tcfg.MaxLength = settings.MaxFuncLines\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(nakedret.NakedReturnAnalyzer(cfg)).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/nakedret/nakedret_integration_test.go",
    "content": "package nakedret\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nakedret/testdata/fix/in/nakedret.go",
    "content": "//golangcitest:args -Enakedret\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc NakedretIssue() (a int, b string) {\n\tif a > 0 {\n\t\treturn\n\t}\n\n\tfmt.Println(\"nakedret\")\n\n\tif b == \"\" {\n\t\treturn 0, \"0\"\n\t}\n\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\n\t// len of this function is 33\n\treturn\n}\n\nfunc NoNakedretIssue() (a int, b string) {\n\tif a > 0 {\n\t\treturn\n\t}\n\n\tif b == \"\" {\n\t\treturn 0, \"0\"\n\t}\n\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\n\t// len of this function is 30\n\treturn\n}\n"
  },
  {
    "path": "pkg/golinters/nakedret/testdata/fix/out/nakedret.go",
    "content": "//golangcitest:args -Enakedret\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc NakedretIssue() (a int, b string) {\n\tif a > 0 {\n\t\treturn a, b\n\t}\n\n\tfmt.Println(\"nakedret\")\n\n\tif b == \"\" {\n\t\treturn 0, \"0\"\n\t}\n\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\n\t// len of this function is 33\n\treturn a, b\n}\n\nfunc NoNakedretIssue() (a int, b string) {\n\tif a > 0 {\n\t\treturn\n\t}\n\n\tif b == \"\" {\n\t\treturn 0, \"0\"\n\t}\n\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\n\t// len of this function is 30\n\treturn\n}\n"
  },
  {
    "path": "pkg/golinters/nakedret/testdata/nakedret.go",
    "content": "//golangcitest:args -Enakedret\npackage testdata\n\nimport \"fmt\"\n\nfunc NakedretIssue() (a int, b string) {\n\tif a > 0 {\n\t\treturn // want \"naked return in func `NakedretIssue` with 33 lines of code\"\n\t}\n\n\tfmt.Println(\"nakedret\")\n\n\tif b == \"\" {\n\t\treturn 0, \"0\"\n\t}\n\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\n\t// len of this function is 33\n\treturn // want \"naked return in func `NakedretIssue` with 33 lines of code\"\n}\n\nfunc NoNakedretIssue() (a int, b string) {\n\tif a > 0 {\n\t\treturn\n\t}\n\n\tif b == \"\" {\n\t\treturn 0, \"0\"\n\t}\n\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\n\t// len of this function is 30\n\treturn\n}\n"
  },
  {
    "path": "pkg/golinters/nakedret/testdata/nakedret_cgo.go",
    "content": "//golangcitest:args -Enakedret\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() (a int, b string) {\n\tif a > 0 {\n\t\treturn // want \"naked return in func `_` with 33 lines of code\"\n\t}\n\n\tfmt.Println(\"nakedret\")\n\n\tif b == \"\" {\n\t\treturn 0, \"0\"\n\t}\n\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\t// ...\n\n\t// len of this function is 33\n\treturn // want \"naked return in func `_` with 33 lines of code\"\n}\n"
  },
  {
    "path": "pkg/golinters/nestif/nestif.go",
    "content": "package nestif\n\nimport (\n\t\"github.com/nakabonne/nestif\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.NestifSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"nestif\",\n\t\t\tDoc:  \"Reports deeply nested if statements\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\trunNestIf(pass, settings)\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runNestIf(pass *analysis.Pass, settings *config.NestifSettings) {\n\tchecker := &nestif.Checker{\n\t\tMinComplexity: settings.MinComplexity,\n\t}\n\n\tfor _, file := range pass.Files {\n\t\tposition, isGoFile := goanalysis.GetGoFilePosition(pass, file)\n\t\tif !isGoFile {\n\t\t\tcontinue\n\t\t}\n\n\t\tissues := checker.Check(file, pass.Fset)\n\t\tif len(issues) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tnonAdjPosition := pass.Fset.PositionFor(file.Pos(), false)\n\n\t\tf := pass.Fset.File(file.Pos())\n\n\t\tfor _, issue := range issues {\n\t\t\tpass.Report(analysis.Diagnostic{\n\t\t\t\tPos:     f.LineStart(goanalysis.AdjustPos(issue.Pos.Line, nonAdjPosition.Line, position.Line)),\n\t\t\t\tMessage: issue.Message,\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/nestif/nestif_integration_test.go",
    "content": "package nestif\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nestif/testdata/nestif.go",
    "content": "//golangcitest:args -Enestif\n//golangcitest:config_path testdata/nestif.yml\npackage testdata\n\nfunc _() {\n\tvar b1, b2, b3, b4 bool\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 1\\\\)\"\n\t\tif b2 { // +1\n\t\t}\n\t}\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 3\\\\)\"\n\t\tif b2 { // +1\n\t\t\tif b3 { // +2\n\t\t\t}\n\t\t}\n\t}\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 5\\\\)\"\n\t\tif b2 { // +1\n\t\t} else if b3 { // +1\n\t\t\tif b4 { // +2\n\t\t\t}\n\t\t} else { // +1\n\t\t}\n\t}\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 9\\\\)\"\n\t\tif b2 { // +1\n\t\t\tif b3 { // +2\n\t\t\t}\n\t\t}\n\n\t\tif b2 { // +1\n\t\t\tif b3 { // +2\n\t\t\t\tif b4 { // +3\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif b1 == b2 == b3 { // want \"`if b1 == b2 == b3` has complex nested blocks \\\\(complexity: 1\\\\)\"\n\t\tif b4 { // +1\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/nestif/testdata/nestif.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nestif:\n      min-complexity: 1\n"
  },
  {
    "path": "pkg/golinters/nestif/testdata/nestif_cgo.go",
    "content": "//golangcitest:args -Enestif\n//golangcitest:config_path testdata/nestif.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tfmt.Println(\"nestif\")\n\n\tvar b1, b2, b3, b4 bool\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 1\\\\)\"\n\t\tif b2 { // +1\n\t\t}\n\t}\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 3\\\\)\"\n\t\tif b2 { // +1\n\t\t\tif b3 { // +2\n\t\t\t}\n\t\t}\n\t}\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 5\\\\)\"\n\t\tif b2 { // +1\n\t\t} else if b3 { // +1\n\t\t\tif b4 { // +2\n\t\t\t}\n\t\t} else { // +1\n\t\t}\n\t}\n\n\tif b1 { // want \"`if b1` has complex nested blocks \\\\(complexity: 9\\\\)\"\n\t\tif b2 { // +1\n\t\t\tif b3 { // +2\n\t\t\t}\n\t\t}\n\n\t\tif b2 { // +1\n\t\t\tif b3 { // +2\n\t\t\t\tif b4 { // +3\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif b1 == b2 == b3 { // want \"`if b1 == b2 == b3` has complex nested blocks \\\\(complexity: 1\\\\)\"\n\t\tif b4 { // +1\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/nilerr/nilerr.go",
    "content": "package nilerr\n\nimport (\n\t\"github.com/gostaticanalysis/nilerr\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(nilerr.Analyzer).\n\t\tWithDesc(\"Find the code that returns nil even if it checks that the error is not nil.\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/nilerr/nilerr_integration_test.go",
    "content": "package nilerr\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nilerr/testdata/nilerr.go",
    "content": "//golangcitest:args -Enilerr\npackage testdata\n\nimport \"os\"\n\nfunc nilErr1() error {\n\terr := nilErrDo()\n\tif err == nil {\n\t\treturn err // want `error is nil \\(line 7\\) but it returns error`\n\t}\n\n\treturn nil\n}\n\nfunc nilErr2() error {\n\terr := nilErrDo()\n\tif err == nil {\n\t\treturn err // want `error is nil \\(line 16\\) but it returns error`\n\t}\n\n\treturn nil\n}\n\nfunc nilErr3() error {\n\terr := nilErrDo()\n\tif err != nil {\n\t\treturn nil // want `error is not nil \\(line 25\\) but it returns nil`\n\t}\n\n\treturn nil\n}\n\nfunc nilErrDo() error {\n\treturn os.ErrNotExist\n}\n\nfunc l() error {\n\taChan := make(chan error, 1)\n\tbChan := make(chan error, 1)\n\n\tvar aErr error\n\tvar bErr error\n\n\tfor i := 0; i < 2; i++ {\n\t\tselect {\n\t\tcase err := <-aChan:\n\t\t\taErr = err\n\t\tcase err := <-bChan:\n\t\t\tbErr = err\n\t\t}\n\t}\n\n\tif aErr != nil {\n\t\treturn nil // want `error is not nil \\(lines \\[41 45\\]\\) but it returns nil`\n\t}\n\tif bErr != nil {\n\t\treturn nil // want `error is not nil \\(lines \\[42 45\\]\\) but it returns nil`\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/nilerr/testdata/nilerr_cgo.go",
    "content": "//golangcitest:args -Enilerr\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"os\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() error {\n\terr := nilErrDo()\n\tif err == nil {\n\t\treturn err // want `error is nil \\(line 26\\) but it returns error`\n\t}\n\n\treturn nil\n}\n\nfunc nilErrDo() error {\n\treturn os.ErrNotExist\n}\n"
  },
  {
    "path": "pkg/golinters/nilnesserr/nilnesserr.go",
    "content": "package nilnesserr\n\nimport (\n\t\"github.com/alingse/nilnesserr\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New() *goanalysis.Linter {\n\tanalyzer, err := nilnesserr.NewAnalyzer(nilnesserr.LinterSetting{})\n\tif err != nil {\n\t\tinternal.LinterLogger.Fatalf(\"nilnesserr: create analyzer: %v\", err)\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/nilnesserr/nilnesserr_integration_test.go",
    "content": "package nilnesserr\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nilnesserr/testdata/nilnesserr.go",
    "content": "//golangcitest:args -Enilnesserr\npackage testdata\n\nimport \"fmt\"\n\nfunc do() error {\n\treturn fmt.Errorf(\"do error\")\n}\n\nfunc do2() error {\n\treturn fmt.Errorf(\"do2 error\")\n}\n\nfunc someCall() error {\n\terr := do()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr2 := do2()\n\tif err2 != nil {\n\t\treturn err // want `return a nil value error after check error`\n\t}\n\treturn nil\n}\n\nfunc sameCall2() error {\n\terr := do()\n\tif err == nil {\n\t\terr2 := do2()\n\t\tif err2 != nil {\n\t\t\treturn err // want `return a nil value error after check error`\n\t\t}\n\t\treturn nil\n\t}\n\treturn err\n\n}\n"
  },
  {
    "path": "pkg/golinters/nilnesserr/testdata/nilnesserr_cgo.go",
    "content": "//golangcitest:args -Enilnesserr\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc do() error {\n\treturn fmt.Errorf(\"do error\")\n}\n\nfunc do2() error {\n\treturn fmt.Errorf(\"do2 error\")\n}\n\nfunc someCall() error {\n\terr := do()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr2 := do2()\n\tif err2 != nil {\n\t\treturn err // want `return a nil value error after check error`\n\t}\n\treturn nil\n}\n\nfunc sameCall2() error {\n\terr := do()\n\tif err == nil {\n\t\terr2 := do2()\n\t\tif err2 != nil {\n\t\t\treturn err // want `return a nil value error after check error`\n\t\t}\n\t\treturn nil\n\t}\n\treturn err\n\n}\n"
  },
  {
    "path": "pkg/golinters/nilnil/nilnil.go",
    "content": "package nilnil\n\nimport (\n\t\"github.com/Antonboom/nilnil/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.NilNilSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"detect-opposite\": settings.DetectOpposite,\n\t\t}\n\t\tif b := settings.OnlyTwo; b != nil {\n\t\t\tcfg[\"only-two\"] = *b\n\t\t}\n\t\tif len(settings.CheckedTypes) != 0 {\n\t\t\tcfg[\"checked-types\"] = settings.CheckedTypes\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.New()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/nilnil/nilnil_integration_test.go",
    "content": "package nilnil\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil.go",
    "content": "//golangcitest:args -Enilnil\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"go/token\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"unsafe\"\n)\n\ntype User struct{}\n\nfunc primitivePtr() (*int, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc structPtr() (*User, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc emptyStructPtr() (*struct{}, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc anonymousStructPtr() (*struct{ ID string }, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc unsafePtr() (unsafe.Pointer, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc uintPtr() (uintptr, error) {\n\treturn 0, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc uintPtr0b() (uintptr, error) {\n\treturn 0b0, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc uintPtr0x() (uintptr, error) {\n\treturn 0x00, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc uintPtr0o() (uintptr, error) {\n\treturn 0o000, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc chBi() (chan int, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc chIn() (chan<- int, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc chOut() (<-chan int, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc fun() (func(), error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc funWithArgsAndResults() (func(a, b, c int) (int, int), error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc iface() (interface{}, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc anyType() (any, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc m1() (map[int]int, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc m2() (map[int]*User, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\ntype mapAlias = map[int]*User\n\nfunc m3() (mapAlias, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\ntype Storage struct{}\n\nfunc (s *Storage) GetUser() (*User, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc ifReturn() (*User, error) {\n\tvar s Storage\n\tif _, err := s.GetUser(); err != nil {\n\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t}\n\treturn new(User), nil\n}\n\nfunc forReturn() (*User, error) {\n\tfor {\n\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t}\n}\n\nfunc multipleReturn() (*User, error) {\n\tvar s Storage\n\n\tif _, err := s.GetUser(); err != nil {\n\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t}\n\n\tif _, err := s.GetUser(); err != nil {\n\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t}\n\n\tif _, err := s.GetUser(); err != nil {\n\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t}\n\n\treturn new(User), nil\n}\n\nfunc nested() {\n\t_ = func() (*User, error) {\n\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t}\n\n\t_, _ = func() (*User, error) {\n\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t}()\n}\n\nfunc deeplyNested() {\n\t_ = func() {\n\t\t_ = func() int {\n\t\t\t_ = func() {\n\t\t\t\t_ = func() (*User, error) {\n\t\t\t\t\t_ = func() {}\n\t\t\t\t\t_ = func() int { return 0 }\n\t\t\t\t\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 0\n\t\t}\n\t}\n}\n\ntype MyError interface {\n\terror\n\tCode() string\n}\n\nfunc myError() (*User, MyError) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\n// Types.\n\nfunc structPtrTypeExtPkg() (*os.File, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc primitivePtrTypeExtPkg() (*token.Token, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc funcTypeExtPkg() (http.HandlerFunc, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc ifaceTypeExtPkg() (io.Closer, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\ntype closerAlias = io.Closer\n\nfunc ifaceTypeAliasedExtPkg() (closerAlias, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\ntype (\n\tStructPtrType    *User\n\tPrimitivePtrType *int\n\tChannelType      chan int\n\tFuncType         func(int) int\n\tChecker          interface{ Check() }\n)\n\nfunc structPtrType() (StructPtrType, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc primitivePtrType() (PrimitivePtrType, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc channelType() (ChannelType, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc funcType() (FuncType, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc ifaceType() (Checker, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\ntype checkerAlias = Checker\n\nfunc ifaceTypeAliased() (checkerAlias, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\ntype (\n\tIntegerType    int\n\tPtrIntegerType *IntegerType\n)\n\nfunc ptrIntegerType() (PtrIntegerType, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\n// Not checked at all.\n\nfunc withoutArgs()                                {}\nfunc withoutError1() *User                        { return nil }\nfunc withoutError2() (*User, *User)               { return nil, nil }\nfunc withoutError3() (*User, *User, *User)        { return nil, nil, nil }\nfunc withoutError4() (*User, *User, *User, *User) { return nil, nil, nil, nil }\n\nfunc invalidOrder() (error, *User)               { return nil, nil }\nfunc withError3rd() (*User, bool, error)         { return nil, false, nil }\nfunc withError4th() (*User, *User, *User, error) { return nil, nil, nil, nil }\n\nfunc slice() ([]int, error) { return nil, nil }\n\nfunc strNil() (string, error)   { return \"nil\", nil }\nfunc strEmpty() (string, error) { return \"\", nil }\n\n// Valid.\n\nfunc primitivePtrTypeValid() (*int, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(int), nil\n}\n\nfunc structPtrTypeValid() (*User, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(User), nil\n}\n\nfunc unsafePtrValid() (unsafe.Pointer, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\tvar i int\n\treturn unsafe.Pointer(&i), nil\n}\n\nfunc uintPtrValid() (uintptr, error) {\n\tif false {\n\t\treturn 0, io.EOF\n\t}\n\treturn 0xc82000c290, nil\n}\n\nfunc channelTypeValid() (ChannelType, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn make(ChannelType), nil\n}\n\nfunc funcTypeValid() (FuncType, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn func(i int) int {\n\t\treturn 0\n\t}, nil\n}\n\nfunc ifaceTypeValid() (io.Reader, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(bytes.Buffer), nil\n}\n\n// Unsupported.\n\nfunc implicitNil1() (*User, error) {\n\terr := (error)(nil)\n\treturn nil, err\n}\n\nfunc implicitNil2() (*User, error) {\n\terr := io.EOF\n\terr = nil\n\treturn nil, err\n}\n\nfunc implicitNil3() (*User, error) {\n\treturn nil, wrap(nil)\n}\nfunc wrap(err error) error { return err }\n\n// Opposite.\n\nfunc primitivePtrTypeOpposite() (*int, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(int), errors.New(\"validation failed\")\n}\n\nfunc structPtrTypeOpposite() (*User, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(User), fmt.Errorf(\"invalid %v\", 42)\n}\n\nfunc unsafePtrOpposite() (unsafe.Pointer, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\tvar i int\n\treturn unsafe.Pointer(&i), io.EOF\n}\n\nfunc uintPtrOpposite() (uintptr, error) {\n\tif false {\n\t\treturn 0, io.EOF\n\t}\n\treturn 0xc82000c290, wrap(io.EOF)\n}\n\nfunc channelTypeOpposite() (ChannelType, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn make(ChannelType), fmt.Errorf(\"wrapped: %w\", io.EOF)\n}\n\nfunc funcTypeOpposite() (FuncType, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn func(i int) int {\n\t\treturn 0\n\t}, errors.New(\"no func type, please\")\n}\n\nfunc ifaceTypeOpposite() (io.Reader, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(bytes.Buffer), new(net.AddrError)\n}\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil_cgo.go",
    "content": "//golangcitest:args -Enilnil\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() (unsafe.Pointer, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil_detect_opposite.go",
    "content": "//golangcitest:args -Enilnil\n//golangcitest:config_path testdata/nilnil_detect_opposite.yml\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"unsafe\"\n)\n\nfunc primitivePtrTypeOpposite() (*int, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(int), errors.New(\"validation failed\") // want \"return both a non-nil error and a valid value: use separate returns instead\"\n}\n\nfunc structPtrTypeOpposite() (*User, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(User), fmt.Errorf(\"invalid %v\", 42) // want \"return both a non-nil error and a valid value: use separate returns instead\"\n}\n\nfunc unsafePtrOpposite() (unsafe.Pointer, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\tvar i int\n\treturn unsafe.Pointer(&i), io.EOF // want \"return both a non-nil error and a valid value: use separate returns instead\"\n}\n\nfunc uintPtrOpposite() (uintptr, error) {\n\tif false {\n\t\treturn 0, io.EOF\n\t}\n\treturn 0xc82000c290, wrap(io.EOF) // want \"return both a non-nil error and a valid value: use separate returns instead\"\n}\n\nfunc channelTypeOpposite() (ChannelType, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn make(ChannelType), fmt.Errorf(\"wrapped: %w\", io.EOF) // want \"return both a non-nil error and a valid value: use separate returns instead\"\n}\n\nfunc funcTypeOpposite() (FuncType, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn func(i int) int { // want \"return both a non-nil error and a valid value: use separate returns instead\"\n\t\treturn 0\n\t}, errors.New(\"no func type, please\")\n}\n\nfunc ifaceTypeOpposite() (io.Reader, error) {\n\tif false {\n\t\treturn nil, io.EOF\n\t}\n\treturn new(bytes.Buffer), new(net.AddrError) // want \"return both a non-nil error and a valid value: use separate returns instead\"\n}\n\ntype (\n\tUser             struct{}\n\tStructPtrType    *User\n\tPrimitivePtrType *int\n\tChannelType      chan int\n\tFuncType         func(int) int\n\tChecker          interface{ Check() }\n)\n\nfunc wrap(err error) error { return err }\n\nfunc structPtr() (*int, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc structPtrValid() (*int, error) {\n\treturn new(int), nil\n}\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil_detect_opposite.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nilnil:\n      detect-opposite: true\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil_multiple_nils.go",
    "content": "//golangcitest:args -Enilnil\n//golangcitest:config_path testdata/nilnil_multiple_nils.yml\npackage testdata\n\nfunc withoutArgs()                                {}\nfunc withoutError1() *User                        { return nil }\nfunc withoutError2() (*User, *User)               { return nil, nil }\nfunc withoutError3() (*User, *User, *User)        { return nil, nil, nil }\nfunc withoutError4() (*User, *User, *User, *User) { return nil, nil, nil, nil }\n\nfunc invalidOrder() (error, *User)               { return nil, nil }\nfunc withError3rd() (*User, bool, error)         { return nil, false, nil }    // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\nfunc withError4th() (*User, *User, *User, error) { return nil, nil, nil, nil } // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n\ntype User struct{}\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil_multiple_nils.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nilnil:\n      only-two: false\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil_pointers_only.go",
    "content": "//golangcitest:args -Enilnil\n//golangcitest:config_path testdata/nilnil_pointers_only.yml\npackage testdata\n\nimport \"unsafe\"\n\ntype User struct{}\n\nfunc primitivePtr() (*int, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc structPtr() (*User, error) {\n\treturn nil, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc unsafePtr() (unsafe.Pointer, error) {\n\treturn nil, nil\n}\n\nfunc uintPtr0o() (uintptr, error) {\n\treturn 0o000, nil // want \"return both a `nil` error and an invalid value: use a sentinel error instead\"\n}\n\nfunc chBi() (chan int, error) {\n\treturn nil, nil\n}\n\nfunc fun() (func(), error) {\n\treturn nil, nil\n}\n\nfunc anyType() (any, error) {\n\treturn nil, nil\n}\n\nfunc m1() (map[int]int, error) {\n\treturn nil, nil\n}\n"
  },
  {
    "path": "pkg/golinters/nilnil/testdata/nilnil_pointers_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nilnil:\n      checked-types:\n        - ptr\n        - uintptr\n"
  },
  {
    "path": "pkg/golinters/nlreturn/nlreturn.go",
    "content": "package nlreturn\n\nimport (\n\t\"github.com/ssgreg/nlreturn/v2/pkg/nlreturn\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.NlreturnSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"block-size\": settings.BlockSize,\n\t\t}\n\t}\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(nlreturn.NewAnalyzer()).\n\t\tWithDesc(\"Checks for a new line before return and branch statements to increase code clarity\").\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/nlreturn/nlreturn_integration_test.go",
    "content": "package nlreturn\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nlreturn/testdata/fix/in/nlreturn.go",
    "content": "//golangcitest:args -Enlreturn\n//golangcitest:expected_exitcode 0\npackage testdata\n\nfunc cha() {\n\tch := make(chan interface{})\n\tch1 := make(chan interface{})\n\tch2 := make(chan interface{})\n\n\tselect {\n\tcase <-ch:\n\t\treturn\n\n\tcase <-ch1:\n\t\t{\n\t\t\ta := 1\n\t\t\t_ = a\n\t\t\t{\n\t\t\t\ta := 1\n\t\t\t\t_ = a\n\t\t\t\treturn // want \"return with no blank line before\"\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\n\tcase <-ch2:\n\t\t{\n\t\t\ta := 1\n\t\t\t_ = a\n\t\t\treturn // want \"return with no blank line before\"\n\t\t}\n\t\treturn // want \"return with no blank line before\"\n\t}\n}\n\nfunc baz() {\n\tswitch 0 {\n\tcase 0:\n\t\ta := 1\n\t\t_ = a\n\t\tfallthrough // want \"fallthrough with no blank line before\"\n\tcase 1:\n\t\ta := 1\n\t\t_ = a\n\t\tbreak // want \"break with no blank line before\"\n\tcase 2:\n\t\tbreak\n\t}\n}\n\nfunc foo() int {\n\tv := []int{}\n\tfor range v {\n\t\treturn 0\n\t}\n\n\tfor range v {\n\t\tfor range v {\n\t\t\treturn 0\n\t\t}\n\t\treturn 0 // want \"return with no blank line before\"\n\t}\n\n\to := []int{\n\t\t0, 1,\n\t}\n\n\treturn o[0]\n}\n\nfunc bar() int {\n\to := 1\n\tif o == 1 {\n\t\tif o == 0 {\n\t\t\treturn 1\n\t\t}\n\t\treturn 0 // want \"return with no blank line before\"\n\t}\n\n\treturn o\n}\n\nfunc main() {\n\treturn\n}\n\nfunc bugNoAssignSmthHandling() string {\n\tswitch 0 {\n\tcase 0:\n\t\to := struct {\n\t\t\tfoo string\n\t\t}{\n\t\t\t\"foo\",\n\t\t}\n\t\treturn o.foo // want \"return with no blank line before\"\n\n\tcase 1:\n\t\to := struct {\n\t\t\tfoo string\n\t\t}{\n\t\t\t\"foo\",\n\t\t}\n\n\t\treturn o.foo\n\t}\n\n\treturn \"\"\n}\n\nfunc bugNoExprSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tbugNoExprSmthHandling(\n\t\t\t\"\",\n\t\t)\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tbugNoExprSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n\nfunc bugNoDeferSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tdefer bugNoDeferSmthHandling(\n\t\t\t\"\",\n\t\t)\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tdefer bugNoDeferSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n\nfunc bugNoGoSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tgo bugNoGoSmthHandling(\n\t\t\t\"\",\n\t\t)\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tgo bugNoGoSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/nlreturn/testdata/fix/out/nlreturn.go",
    "content": "//golangcitest:args -Enlreturn\n//golangcitest:expected_exitcode 0\npackage testdata\n\nfunc cha() {\n\tch := make(chan interface{})\n\tch1 := make(chan interface{})\n\tch2 := make(chan interface{})\n\n\tselect {\n\tcase <-ch:\n\t\treturn\n\n\tcase <-ch1:\n\t\t{\n\t\t\ta := 1\n\t\t\t_ = a\n\t\t\t{\n\t\t\t\ta := 1\n\t\t\t\t_ = a\n\n\t\t\t\treturn // want \"return with no blank line before\"\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\n\tcase <-ch2:\n\t\t{\n\t\t\ta := 1\n\t\t\t_ = a\n\n\t\t\treturn // want \"return with no blank line before\"\n\t\t}\n\n\t\treturn // want \"return with no blank line before\"\n\t}\n}\n\nfunc baz() {\n\tswitch 0 {\n\tcase 0:\n\t\ta := 1\n\t\t_ = a\n\n\t\tfallthrough // want \"fallthrough with no blank line before\"\n\tcase 1:\n\t\ta := 1\n\t\t_ = a\n\n\t\tbreak // want \"break with no blank line before\"\n\tcase 2:\n\t\tbreak\n\t}\n}\n\nfunc foo() int {\n\tv := []int{}\n\tfor range v {\n\t\treturn 0\n\t}\n\n\tfor range v {\n\t\tfor range v {\n\t\t\treturn 0\n\t\t}\n\n\t\treturn 0 // want \"return with no blank line before\"\n\t}\n\n\to := []int{\n\t\t0, 1,\n\t}\n\n\treturn o[0]\n}\n\nfunc bar() int {\n\to := 1\n\tif o == 1 {\n\t\tif o == 0 {\n\t\t\treturn 1\n\t\t}\n\n\t\treturn 0 // want \"return with no blank line before\"\n\t}\n\n\treturn o\n}\n\nfunc main() {\n\treturn\n}\n\nfunc bugNoAssignSmthHandling() string {\n\tswitch 0 {\n\tcase 0:\n\t\to := struct {\n\t\t\tfoo string\n\t\t}{\n\t\t\t\"foo\",\n\t\t}\n\n\t\treturn o.foo // want \"return with no blank line before\"\n\n\tcase 1:\n\t\to := struct {\n\t\t\tfoo string\n\t\t}{\n\t\t\t\"foo\",\n\t\t}\n\n\t\treturn o.foo\n\t}\n\n\treturn \"\"\n}\n\nfunc bugNoExprSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tbugNoExprSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tbugNoExprSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n\nfunc bugNoDeferSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tdefer bugNoDeferSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tdefer bugNoDeferSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n\nfunc bugNoGoSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tgo bugNoGoSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tgo bugNoGoSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/nlreturn/testdata/nlreturn-block-size.go",
    "content": "//golangcitest:args -Enlreturn\n//golangcitest:config_path testdata/nlreturn-block-size.yml\npackage testdata\n\nfunc foo0(n int) int {\n\tif n == 1 {\n\t\tn2 := n * n\n\t\treturn n2\n\t}\n\n\treturn 1\n}\n\nfunc foo1(n int) int {\n\tif n == 1 {\n\t\tn2 := n * n\n\t\tn3 := n2 * n\n\t\treturn n3 // want \"return with no blank line before\"\n\t}\n\n\treturn 1\n}\n"
  },
  {
    "path": "pkg/golinters/nlreturn/testdata/nlreturn-block-size.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nlreturn:\n      block-size: 2\n"
  },
  {
    "path": "pkg/golinters/nlreturn/testdata/nlreturn.go",
    "content": "//golangcitest:args -Enlreturn\npackage testdata\n\nfunc cha() {\n\tch := make(chan interface{})\n\tch1 := make(chan interface{})\n\tch2 := make(chan interface{})\n\n\tselect {\n\tcase <-ch:\n\t\treturn\n\n\tcase <-ch1:\n\t\t{\n\t\t\ta := 1\n\t\t\t_ = a\n\t\t\t{\n\t\t\t\ta := 1\n\t\t\t\t_ = a\n\t\t\t\treturn // want \"return with no blank line before\"\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\n\tcase <-ch2:\n\t\t{\n\t\t\ta := 1\n\t\t\t_ = a\n\t\t\treturn // want \"return with no blank line before\"\n\t\t}\n\t\treturn // want \"return with no blank line before\"\n\t}\n}\n\nfunc baz() {\n\tswitch 0 {\n\tcase 0:\n\t\ta := 1\n\t\t_ = a\n\t\tfallthrough // want \"fallthrough with no blank line before\"\n\tcase 1:\n\t\ta := 1\n\t\t_ = a\n\t\tbreak // want \"break with no blank line before\"\n\tcase 2:\n\t\tbreak\n\t}\n}\n\nfunc foo() int {\n\tv := []int{}\n\tfor range v {\n\t\treturn 0\n\t}\n\n\tfor range v {\n\t\tfor range v {\n\t\t\treturn 0\n\t\t}\n\t\treturn 0 // want \"return with no blank line before\"\n\t}\n\n\to := []int{\n\t\t0, 1,\n\t}\n\n\treturn o[0]\n}\n\nfunc bar() int {\n\to := 1\n\tif o == 1 {\n\t\tif o == 0 {\n\t\t\treturn 1\n\t\t}\n\t\treturn 0 // want \"return with no blank line before\"\n\t}\n\n\treturn o\n}\n\nfunc main() {\n\treturn\n}\n\nfunc bugNoAssignSmthHandling() string {\n\tswitch 0 {\n\tcase 0:\n\t\to := struct {\n\t\t\tfoo string\n\t\t}{\n\t\t\t\"foo\",\n\t\t}\n\t\treturn o.foo // want \"return with no blank line before\"\n\n\tcase 1:\n\t\to := struct {\n\t\t\tfoo string\n\t\t}{\n\t\t\t\"foo\",\n\t\t}\n\n\t\treturn o.foo\n\t}\n\n\treturn \"\"\n}\n\nfunc bugNoExprSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tbugNoExprSmthHandling(\n\t\t\t\"\",\n\t\t)\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tbugNoExprSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n\nfunc bugNoDeferSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tdefer bugNoDeferSmthHandling(\n\t\t\t\"\",\n\t\t)\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tdefer bugNoDeferSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n\nfunc bugNoGoSmthHandling(string) {\n\tswitch 0 {\n\tcase 0:\n\t\tgo bugNoGoSmthHandling(\n\t\t\t\"\",\n\t\t)\n\t\treturn // want \"return with no blank line before\"\n\n\tcase 1:\n\t\tgo bugNoGoSmthHandling(\n\t\t\t\"\",\n\t\t)\n\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/nlreturn/testdata/nlreturn_cgo.go",
    "content": "//golangcitest:args -Enlreturn\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc cha() {\n\tch := make(chan interface{})\n\tch1 := make(chan interface{})\n\tch2 := make(chan interface{})\n\n\tselect {\n\tcase <-ch:\n\t\treturn\n\n\tcase <-ch1:\n\t\t{\n\t\t\ta := math.MaxInt\n\t\t\t_ = a\n\t\t\t{\n\t\t\t\ta := 1\n\t\t\t\t_ = a\n\t\t\t\treturn // want \"return with no blank line before\"\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\n\tcase <-ch2:\n\t\t{\n\t\t\ta := 1\n\t\t\t_ = a\n\t\t\treturn // want \"return with no blank line before\"\n\t\t}\n\t\treturn // want \"return with no blank line before\"\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/noctx/noctx.go",
    "content": "package noctx\n\nimport (\n\t\"github.com/sonatard/noctx\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(noctx.Analyzer).\n\t\tWithDesc(\"Detects function and method with missing usage of context.Context\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/noctx/noctx_integration_test.go",
    "content": "package noctx\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/noctx/testdata/noctx.go",
    "content": "//golangcitest:args -Enoctx\npackage testdata\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"net/http\"\n)\n\nvar newRequestPkg = http.NewRequest\n\nfunc _() {\n\tconst url = \"https://example.com\"\n\n\tcli := &http.Client{}\n\n\tctx := context.Background()\n\n\treq, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\tcli.Do(req)\n\n\treq2, _ := http.NewRequestWithContext(ctx, http.MethodPost, url, nil) // OK\n\tcli.Do(req2)\n\n\treq3, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq3 = req3.WithContext(ctx)\n\tcli.Do(req3)\n\n\tf2 := func(req *http.Request, ctx context.Context) *http.Request {\n\t\treturn req\n\t}\n\treq4, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq4 = f2(req4, ctx)\n\n\treq41, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq41 = req41.WithContext(ctx)\n\treq41 = f2(req41, ctx)\n\n\tnewRequest := http.NewRequest\n\treq5, _ := newRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\tcli.Do(req5)\n\n\treq51, _ := newRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq51 = req51.WithContext(ctx)\n\tcli.Do(req51)\n\n\treq52, _ := newRequestPkg(http.MethodPost, url, nil) // TODO: false negative `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\tcli.Do(req52)\n\n\ttype MyRequest = http.Request\n\tf3 := func(req *MyRequest, ctx context.Context) *MyRequest {\n\t\treturn req\n\t}\n\treq6, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq6 = f3(req6, ctx)\n\n\treq61, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq61 = req61.WithContext(ctx)\n\treq61 = f3(req61, ctx)\n\n\ttype MyRequest2 http.Request\n\tf4 := func(req *MyRequest2, ctx context.Context) *MyRequest2 {\n\t\treturn req\n\t}\n\treq7, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq71 := MyRequest2(*req7)\n\tf4(&req71, ctx)\n\n\treq72, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq72 = req72.WithContext(ctx)\n\treq73 := MyRequest2(*req7)\n\tf4(&req73, ctx)\n\n\treq8, _ := func() (*http.Request, error) {\n\t\treturn http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t}()\n\tcli.Do(req8)\n\n\treq82, _ := func() (*http.Request, error) {\n\t\treq82, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq82 = req82.WithContext(ctx)\n\t\treturn req82, nil\n\t}()\n\tcli.Do(req82)\n\n\tf5 := func(req, req2 *http.Request, ctx context.Context) (*http.Request, *http.Request) {\n\t\treturn req, req2\n\t}\n\treq9, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq9, _ = f5(req9, req9, ctx)\n\n\treq91, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq91 = req91.WithContext(ctx)\n\treq9, _ = f5(req91, req91, ctx)\n\n\treq10, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq11, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq10, req11 = f5(req10, req11, ctx)\n\n\treq101, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq111, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq111 = req111.WithContext(ctx)\n\treq101, req111 = f5(req101, req111, ctx)\n\n\tfunc() (*http.Request, *http.Request) {\n\t\treq12, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq13, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treturn req12, req13\n\t}()\n\n\tfunc() (*http.Request, *http.Request) {\n\t\treq14, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq15, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq15 = req15.WithContext(ctx)\n\n\t\treturn req14, req15\n\t}()\n\n\treq121, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq121.AddCookie(&http.Cookie{Name: \"k\", Value: \"v\"})\n\treq121 = req121.WithContext(context.WithValue(req121.Context(), struct{}{}, 0))\n\tcli.Do(req121)\n}\n\nfunc _() {\n\tconst url = \"http://example.com\"\n\tcli := &http.Client{}\n\n\thttp.Get(url) // want `net/http\\.Get must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\t_ = http.Get  // OK\n\tf := http.Get // OK\n\tf(url)        // want `net/http\\.Get must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\n\thttp.Head(url)          // want `net/http\\.Head must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\thttp.Post(url, \"\", nil) // want `net/http\\.Post must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\thttp.PostForm(url, nil) // want `net/http\\.PostForm must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\n\tcli.Get(url) // want `\\(\\*net/http\\.Client\\)\\.Get must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\t_ = cli.Get  // OK\n\tm := cli.Get // OK\n\tm(url)       // want `\\(\\*net/http\\.Client\\)\\.Get must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\n\tcli.Head(url)          // want `\\(\\*net/http\\.Client\\)\\.Head must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\tcli.Post(url, \"\", nil) // want `\\(\\*net/http\\.Client\\)\\.Post must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\tcli.PostForm(url, nil) // want `\\(\\*net/http\\.Client\\)\\.PostForm must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n}\n\nfunc _() {\n\tctx := context.Background()\n\n\tdb, _ := sql.Open(\"noctx\", \"noctx://\")\n\n\tdb.Exec(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.Exec must not be called. use \\(\\*database/sql\\.DB\\)\\.ExecContext`\n\tdb.ExecContext(ctx, \"select * from testdata\")\n\n\tdb.Ping() // want `\\(\\*database/sql\\.DB\\)\\.Ping must not be called. use \\(\\*database/sql\\.DB\\)\\.PingContext`\n\tdb.PingContext(ctx)\n\n\tdb.Prepare(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.Prepare must not be called. use \\(\\*database/sql\\.DB\\)\\.PrepareContext`\n\tdb.PrepareContext(ctx, \"select * from testdata\")\n\n\tdb.Query(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.Query must not be called. use \\(\\*database/sql\\.DB\\)\\.QueryContext`\n\tdb.QueryContext(ctx, \"select * from testdata\")\n\n\tdb.QueryRow(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.QueryRow must not be called. use \\(\\*database/sql\\.DB\\)\\.QueryRowContext`\n\tdb.QueryRowContext(ctx, \"select * from testdata\")\n\n\t// transactions\n\n\ttx, _ := db.Begin()               // want `\\(\\*database/sql\\.DB\\)\\.Begin must not be called. use \\(\\*database/sql\\.DB\\)\\.BeginTx`\n\ttx.Exec(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.Exec must not be called. use \\(\\*database/sql\\.Tx\\)\\.ExecContext`\n\ttx.ExecContext(ctx, \"select * from testdata\")\n\n\ttx.Prepare(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.Prepare must not be called. use \\(\\*database/sql\\.Tx\\)\\.PrepareContext`\n\ttx.PrepareContext(ctx, \"select * from testdata\")\n\n\ttx.Query(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.Query must not be called. use \\(\\*database/sql\\.Tx\\)\\.QueryContext`\n\ttx.QueryContext(ctx, \"select * from testdata\")\n\n\ttx.QueryRow(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.QueryRow must not be called. use \\(\\*database/sql\\.Tx\\)\\.QueryRowContext`\n\ttx.QueryRowContext(ctx, \"select * from testdata\")\n\n\t_ = tx.Commit()\n}\n"
  },
  {
    "path": "pkg/golinters/noctx/testdata/noctx_cgo.go",
    "content": "//golangcitest:args -Enoctx\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"net/http\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nvar newRequestPkg = http.NewRequest\n\nfunc _() {\n\tconst url = \"https://example.com\"\n\n\tcli := &http.Client{}\n\n\tctx := context.Background()\n\n\treq, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\tcli.Do(req)\n\n\treq2, _ := http.NewRequestWithContext(ctx, http.MethodPost, url, nil) // OK\n\tcli.Do(req2)\n\n\treq3, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq3 = req3.WithContext(ctx)\n\tcli.Do(req3)\n\n\tf2 := func(req *http.Request, ctx context.Context) *http.Request {\n\t\treturn req\n\t}\n\treq4, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq4 = f2(req4, ctx)\n\n\treq41, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq41 = req41.WithContext(ctx)\n\treq41 = f2(req41, ctx)\n\n\tnewRequest := http.NewRequest\n\treq5, _ := newRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\tcli.Do(req5)\n\n\treq51, _ := newRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq51 = req51.WithContext(ctx)\n\tcli.Do(req51)\n\n\treq52, _ := newRequestPkg(http.MethodPost, url, nil) // TODO: false negative `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\tcli.Do(req52)\n\n\ttype MyRequest = http.Request\n\tf3 := func(req *MyRequest, ctx context.Context) *MyRequest {\n\t\treturn req\n\t}\n\treq6, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq6 = f3(req6, ctx)\n\n\treq61, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq61 = req61.WithContext(ctx)\n\treq61 = f3(req61, ctx)\n\n\ttype MyRequest2 http.Request\n\tf4 := func(req *MyRequest2, ctx context.Context) *MyRequest2 {\n\t\treturn req\n\t}\n\treq7, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq71 := MyRequest2(*req7)\n\tf4(&req71, ctx)\n\n\treq72, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq72 = req72.WithContext(ctx)\n\treq73 := MyRequest2(*req7)\n\tf4(&req73, ctx)\n\n\treq8, _ := func() (*http.Request, error) {\n\t\treturn http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t}()\n\tcli.Do(req8)\n\n\treq82, _ := func() (*http.Request, error) {\n\t\treq82, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq82 = req82.WithContext(ctx)\n\t\treturn req82, nil\n\t}()\n\tcli.Do(req82)\n\n\tf5 := func(req, req2 *http.Request, ctx context.Context) (*http.Request, *http.Request) {\n\t\treturn req, req2\n\t}\n\treq9, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq9, _ = f5(req9, req9, ctx)\n\n\treq91, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq91 = req91.WithContext(ctx)\n\treq9, _ = f5(req91, req91, ctx)\n\n\treq10, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq11, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq10, req11 = f5(req10, req11, ctx)\n\n\treq101, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq111, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq111 = req111.WithContext(ctx)\n\treq101, req111 = f5(req101, req111, ctx)\n\n\tfunc() (*http.Request, *http.Request) {\n\t\treq12, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq13, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treturn req12, req13\n\t}()\n\n\tfunc() (*http.Request, *http.Request) {\n\t\treq14, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq15, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\t\treq15 = req15.WithContext(ctx)\n\n\t\treturn req14, req15\n\t}()\n\n\treq121, _ := http.NewRequest(http.MethodPost, url, nil) // want `net/http\\.NewRequest must not be called. use net/http\\.NewRequestWithContext`\n\treq121.AddCookie(&http.Cookie{Name: \"k\", Value: \"v\"})\n\treq121 = req121.WithContext(context.WithValue(req121.Context(), struct{}{}, 0))\n\tcli.Do(req121)\n}\n\nfunc _() {\n\tconst url = \"http://example.com\"\n\tcli := &http.Client{}\n\n\thttp.Get(url) // want `net/http\\.Get must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\t_ = http.Get  // OK\n\tf := http.Get // OK\n\tf(url)        // want `net/http\\.Get must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\n\thttp.Head(url)          // want `net/http\\.Head must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\thttp.Post(url, \"\", nil) // want `net/http\\.Post must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\thttp.PostForm(url, nil) // want `net/http\\.PostForm must not be called. use net/http\\.NewRequestWithContext and \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\n\tcli.Get(url) // want `\\(\\*net/http\\.Client\\)\\.Get must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\t_ = cli.Get  // OK\n\tm := cli.Get // OK\n\tm(url)       // want `\\(\\*net/http\\.Client\\)\\.Get must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\n\tcli.Head(url)          // want `\\(\\*net/http\\.Client\\)\\.Head must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\tcli.Post(url, \"\", nil) // want `\\(\\*net/http\\.Client\\)\\.Post must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n\tcli.PostForm(url, nil) // want `\\(\\*net/http\\.Client\\)\\.PostForm must not be called. use \\(\\*net/http.Client\\)\\.Do\\(\\*http.Request\\)`\n}\n\nfunc _() {\n\tctx := context.Background()\n\n\tdb, _ := sql.Open(\"noctx\", \"noctx://\")\n\n\tdb.Exec(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.Exec must not be called. use \\(\\*database/sql\\.DB\\)\\.ExecContext`\n\tdb.ExecContext(ctx, \"select * from testdata\")\n\n\tdb.Ping() // want `\\(\\*database/sql\\.DB\\)\\.Ping must not be called. use \\(\\*database/sql\\.DB\\)\\.PingContext`\n\tdb.PingContext(ctx)\n\n\tdb.Prepare(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.Prepare must not be called. use \\(\\*database/sql\\.DB\\)\\.PrepareContext`\n\tdb.PrepareContext(ctx, \"select * from testdata\")\n\n\tdb.Query(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.Query must not be called. use \\(\\*database/sql\\.DB\\)\\.QueryContext`\n\tdb.QueryContext(ctx, \"select * from testdata\")\n\n\tdb.QueryRow(\"select * from testdata\") // want `\\(\\*database/sql\\.DB\\)\\.QueryRow must not be called. use \\(\\*database/sql\\.DB\\)\\.QueryRowContext`\n\tdb.QueryRowContext(ctx, \"select * from testdata\")\n\n\t// transactions\n\n\ttx, _ := db.Begin()               // want `\\(\\*database/sql\\.DB\\)\\.Begin must not be called. use \\(\\*database/sql\\.DB\\)\\.BeginTx`\n\ttx.Exec(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.Exec must not be called. use \\(\\*database/sql\\.Tx\\)\\.ExecContext`\n\ttx.ExecContext(ctx, \"select * from testdata\")\n\n\ttx.Prepare(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.Prepare must not be called. use \\(\\*database/sql\\.Tx\\)\\.PrepareContext`\n\ttx.PrepareContext(ctx, \"select * from testdata\")\n\n\ttx.Query(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.Query must not be called. use \\(\\*database/sql\\.Tx\\)\\.QueryContext`\n\ttx.QueryContext(ctx, \"select * from testdata\")\n\n\ttx.QueryRow(\"select * from testdata\") // want `\\(\\*database/sql\\.Tx\\)\\.QueryRow must not be called. use \\(\\*database/sql\\.Tx\\)\\.QueryRowContext`\n\ttx.QueryRowContext(ctx, \"select * from testdata\")\n\n\t_ = tx.Commit()\n}\n"
  },
  {
    "path": "pkg/golinters/noinlineerr/noinlineerr.go",
    "content": "package noinlineerr\n\nimport (\n\t\"github.com/AlwxSin/noinlineerr\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(noinlineerr.NewAnalyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/noinlineerr/noinlineerr_integration_test.go",
    "content": "package noinlineerr\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/noinlineerr/testdata/fix/in/noinlineerr.go",
    "content": "//golangcitest:args -Enoinlineerr\n//golangcitest:expected_exitcode 0\npackage testdata\n\ntype MyAliasErr error\n\ntype MyCustomError struct{}\n\nfunc (mc *MyCustomError) Error() string {\n\treturn \"error\"\n}\n\nfunc doSomething() error {\n\treturn nil\n}\n\nfunc doSmthManyArgs(a, b, c, d int) error {\n\treturn nil\n}\n\nfunc doSmthMultipleReturn() (bool, error) {\n\treturn false, nil\n}\n\nfunc doMyAliasErr() MyAliasErr {\n\treturn nil\n}\n\nfunc doMyCustomErr() *MyCustomError {\n\treturn &MyCustomError{}\n}\n\nfunc invalid() error {\n\terr := doSomething()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = doSmthManyArgs(0,\n\t\t0,\n\t\t0,\n\t\t0,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = doMyAliasErr()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = doMyCustomErr()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/noinlineerr/testdata/fix/out/noinlineerr.go",
    "content": "//golangcitest:args -Enoinlineerr\n//golangcitest:expected_exitcode 0\npackage testdata\n\ntype MyAliasErr error\n\ntype MyCustomError struct{}\n\nfunc (mc *MyCustomError) Error() string {\n\treturn \"error\"\n}\n\nfunc doSomething() error {\n\treturn nil\n}\n\nfunc doSmthManyArgs(a, b, c, d int) error {\n\treturn nil\n}\n\nfunc doSmthMultipleReturn() (bool, error) {\n\treturn false, nil\n}\n\nfunc doMyAliasErr() MyAliasErr {\n\treturn nil\n}\n\nfunc doMyCustomErr() *MyCustomError {\n\treturn &MyCustomError{}\n}\n\nfunc invalid() error {\n\terr := doSomething()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = doSmthManyArgs(0,\n\t\t0,\n\t\t0,\n\t\t0,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = doMyAliasErr()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = doMyCustomErr()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/noinlineerr/testdata/noinlineerr.go",
    "content": "//golangcitest:args -Enoinlineerr\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\ntype MyAliasErr error\n\ntype MyCustomError struct {}\n\nfunc (mc *MyCustomError) Error() string {\n\treturn \"error\"\n}\n\nfunc doSomething() error {\n\treturn nil\n}\n\nfunc doSmthManyArgs(a, b, c, d int) error {\n\treturn nil\n}\n\nfunc doSmthMultipleReturn() (bool, error) {\n\treturn false, nil\n}\n\nfunc doMyAliasErr() MyAliasErr {\n\treturn nil\n}\n\nfunc doMyCustomErr() *MyCustomError {\n\treturn &MyCustomError{}\n}\n\nfunc valid() error {\n\terr := doSomething() // ok\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = doSmthManyArgs(0, 0, 0, 0) // ok\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = doSmthMultipleReturn() // ok\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif ok, _ := strconv.ParseBool(\"1\"); ok {\n\t\tfmt.Println(\"ok\")\n\t}\n\n\treturn nil\n}\n\nfunc invalid() error {\n\tif err := doSomething(); err != nil { // want \"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`\"\n\t\treturn err\n\t}\n\n\tif err := doSmthManyArgs(0, // want \"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`\"\n\t\t0,\n\t\t0,\n\t\t0,\n\t); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := doSmthMultipleReturn(); err != nil { // want \"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`\"\n\t\t_ = false\n\t\treturn err\n\t}\n\n\tif err := doMyAliasErr(); err != nil { // want \"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`\"\n\t\treturn err\n\t}\n\n\tif err := doMyCustomErr(); err != nil { // want \"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`\"\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/internal/README.md",
    "content": "# nolintlint\n\nnolintlint is a Go static analysis tool to find ill-formed or insufficiently explained `//nolint` directives for golangci-lint\n(or any other linter, using this package)\n\n## Purpose\n\nTo ensure that lint exceptions have explanations.  Consider the case below:\n\n```Go\nimport \"crypto/md5\" //nolint:all\n\nfunc hash(data []byte) []byte {\n\treturn md5.New().Sum(data) //nolint:all\n}\n```\n\nIn the above case, nolint directives are present, but the user has no idea why this is being done or which linter\nis being suppressed (in this case, gosec recommends against use of md5).  `nolintlint` can require that the code provide an explanation, which might look as follows:\n\n```Go\nimport \"crypto/md5\" //nolint:gosec // this is not used in a secure application\n\nfunc hash(data []byte) []byte {\n\treturn md5.New().Sum(data) //nolint:gosec // this result is not used in a secure application\n}\n```\n\n`nolintlint` can also identify cases where you may have written `//  nolint`.  Finally, `nolintlint`, can also enforce that you\nuse the machine-readable nolint directive format `//nolint:all` and that you mention what linter is being suppressed, as shown above when we write `//nolint:gosec`.\n\n"
  },
  {
    "path": "pkg/golinters/nolintlint/internal/issues.go",
    "content": "package internal\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"unicode\"\n)\n\nfunc formatExtraLeadingSpace(fullDirective string) string {\n\treturn fmt.Sprintf(\"directive `%s` should not have more than one leading space\", fullDirective)\n}\n\nfunc formatNotMachine(fullDirective string) string {\n\texpected := fullDirective[:2] + strings.TrimLeftFunc(fullDirective[2:], unicode.IsSpace)\n\treturn fmt.Sprintf(\"directive `%s` should be written without leading space as `%s`\",\n\t\tfullDirective, expected)\n}\n\nfunc formatNotSpecific(fullDirective, directiveWithOptionalLeadingSpace string) string {\n\treturn fmt.Sprintf(\"directive `%s` should mention specific linter such as `%s:my-linter`\",\n\t\tfullDirective, directiveWithOptionalLeadingSpace)\n}\n\nfunc formatParseError(fullDirective, directiveWithOptionalLeadingSpace string) string {\n\treturn fmt.Sprintf(\"directive `%s` should match `%s[:<comma-separated-linters>] [// <explanation>]`\",\n\t\tfullDirective,\n\t\tdirectiveWithOptionalLeadingSpace)\n}\n\nfunc formatNoExplanation(fullDirective, fullDirectiveWithoutExplanation string) string {\n\treturn fmt.Sprintf(\"directive `%s` should provide explanation such as `%s // this is why`\",\n\t\tfullDirective, fullDirectiveWithoutExplanation)\n}\n\nfunc formatUnusedCandidate(fullDirective, expectedLinter string) string {\n\tdetails := fmt.Sprintf(\"directive `%s` is unused\", fullDirective)\n\tif expectedLinter != \"\" {\n\t\tdetails += fmt.Sprintf(\" for linter %q\", expectedLinter)\n\t}\n\treturn details\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/internal/nolintlint.go",
    "content": "// Package internal provides a linter to ensure that all //nolint directives are followed by explanations\npackage internal\n\nimport (\n\t\"go/token\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst LinterName = \"nolintlint\"\n\nconst (\n\tNeedsMachineOnly Needs = 1 << iota\n\tNeedsSpecific\n\tNeedsExplanation\n\tNeedsUnused\n\tNeedsAll = NeedsMachineOnly | NeedsSpecific | NeedsExplanation\n)\n\ntype Needs uint\n\nconst commentMark = \"//\"\n\nvar commentPattern = regexp.MustCompile(`^//\\s*(nolint)(:\\s*[\\w-]+\\s*(?:,\\s*[\\w-]+\\s*)*)?\\b`)\n\n// matches a complete nolint directive\nvar fullDirectivePattern = regexp.MustCompile(`^//\\s*nolint(?::(\\s*[\\w-]+\\s*(?:,\\s*[\\w-]+\\s*)*))?\\s*(//.*)?\\s*\\n?$`)\n\ntype Linter struct {\n\tneeds           Needs // indicates which linter checks to perform\n\texcludeByLinter map[string]bool\n}\n\n// NewLinter creates a linter that enforces that the provided directives fulfill the provided requirements\nfunc NewLinter(needs Needs, excludes []string) (*Linter, error) {\n\texcludeByName := make(map[string]bool)\n\tfor _, e := range excludes {\n\t\texcludeByName[e] = true\n\t}\n\n\treturn &Linter{\n\t\tneeds:           needs | NeedsMachineOnly,\n\t\texcludeByLinter: excludeByName,\n\t}, nil\n}\n\nvar (\n\tleadingSpacePattern      = regexp.MustCompile(`^//(\\s*)`)\n\ttrailingBlankExplanation = regexp.MustCompile(`\\s*(//\\s*)?$`)\n)\n\n//nolint:funlen,gocyclo // the function is going to be refactored in the future\nfunc (l Linter) Run(pass *analysis.Pass) ([]*goanalysis.Issue, error) {\n\tvar issues []*goanalysis.Issue\n\n\tfor _, file := range pass.Files {\n\t\tfor _, c := range file.Comments {\n\t\t\tfor _, comment := range c.List {\n\t\t\t\tif !commentPattern.MatchString(comment.Text) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// check for a space between the \"//\" and the directive\n\t\t\t\tleadingSpaceMatches := leadingSpacePattern.FindStringSubmatch(comment.Text)\n\n\t\t\t\tvar leadingSpace string\n\t\t\t\tif len(leadingSpaceMatches) > 0 {\n\t\t\t\t\tleadingSpace = leadingSpaceMatches[1]\n\t\t\t\t}\n\n\t\t\t\tdirectiveWithOptionalLeadingSpace := commentMark\n\t\t\t\tif leadingSpace != \"\" {\n\t\t\t\t\tdirectiveWithOptionalLeadingSpace += \" \"\n\t\t\t\t}\n\n\t\t\t\tsplit := strings.Split(strings.SplitN(comment.Text, \":\", 2)[0], commentMark)\n\t\t\t\tdirectiveWithOptionalLeadingSpace += strings.TrimSpace(split[1])\n\n\t\t\t\tpos := pass.Fset.Position(comment.Pos())\n\t\t\t\tend := pass.Fset.Position(comment.End())\n\n\t\t\t\t// check for, report and eliminate leading spaces, so we can check for other issues\n\t\t\t\tif leadingSpace != \"\" {\n\t\t\t\t\tremoveWhitespace := []analysis.SuggestedFix{{\n\t\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\t\tPos:     token.Pos(pos.Offset),\n\t\t\t\t\t\t\tEnd:     token.Pos(pos.Offset + len(commentMark) + len(leadingSpace)),\n\t\t\t\t\t\t\tNewText: []byte(commentMark),\n\t\t\t\t\t\t}},\n\t\t\t\t\t}}\n\n\t\t\t\t\tif (l.needs & NeedsMachineOnly) != 0 {\n\t\t\t\t\t\tissue := &result.Issue{\n\t\t\t\t\t\t\tFromLinter:     LinterName,\n\t\t\t\t\t\t\tText:           formatNotMachine(comment.Text),\n\t\t\t\t\t\t\tPos:            pos,\n\t\t\t\t\t\t\tSuggestedFixes: removeWhitespace,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(issue, pass))\n\t\t\t\t\t} else if len(leadingSpace) > 1 {\n\t\t\t\t\t\tissue := &result.Issue{\n\t\t\t\t\t\t\tFromLinter:     LinterName,\n\t\t\t\t\t\t\tText:           formatExtraLeadingSpace(comment.Text),\n\t\t\t\t\t\t\tPos:            pos,\n\t\t\t\t\t\t\tSuggestedFixes: removeWhitespace,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(issue, pass))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfullMatches := fullDirectivePattern.FindStringSubmatch(comment.Text)\n\t\t\t\tif len(fullMatches) == 0 {\n\t\t\t\t\tissue := &result.Issue{\n\t\t\t\t\t\tFromLinter: LinterName,\n\t\t\t\t\t\tText:       formatParseError(comment.Text, directiveWithOptionalLeadingSpace),\n\t\t\t\t\t\tPos:        pos,\n\t\t\t\t\t}\n\n\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(issue, pass))\n\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tlintersText, explanation := fullMatches[1], fullMatches[2]\n\n\t\t\t\tvar linters []string\n\t\t\t\tif lintersText != \"\" && !strings.HasPrefix(lintersText, \"all\") {\n\t\t\t\t\tlls := strings.Split(lintersText, \",\")\n\t\t\t\t\tlinters = make([]string, 0, len(lls))\n\t\t\t\t\trangeStart := (pos.Column - 1) + len(commentMark) + len(leadingSpace) + len(\"nolint:\")\n\t\t\t\t\tfor i, ll := range lls {\n\t\t\t\t\t\trangeEnd := rangeStart + len(ll)\n\t\t\t\t\t\tif i < len(lls)-1 {\n\t\t\t\t\t\t\trangeEnd++ // include trailing comma\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrimmedLinterName := strings.TrimSpace(ll)\n\t\t\t\t\t\tif trimmedLinterName != \"\" {\n\t\t\t\t\t\t\tlinters = append(linters, trimmedLinterName)\n\t\t\t\t\t\t}\n\t\t\t\t\t\trangeStart = rangeEnd\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (l.needs & NeedsSpecific) != 0 {\n\t\t\t\t\tif len(linters) == 0 {\n\t\t\t\t\t\tissue := &result.Issue{\n\t\t\t\t\t\t\tFromLinter: LinterName,\n\t\t\t\t\t\t\tText:       formatNotSpecific(comment.Text, directiveWithOptionalLeadingSpace),\n\t\t\t\t\t\t\tPos:        pos,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(issue, pass))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// when detecting unused directives, we send all the directives through and filter them out in the nolint processor\n\t\t\t\tif (l.needs & NeedsUnused) != 0 {\n\t\t\t\t\tremoveNolintCompletely := []analysis.SuggestedFix{{\n\t\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\t\tPos:     token.Pos(pos.Offset),\n\t\t\t\t\t\t\tEnd:     token.Pos(end.Offset),\n\t\t\t\t\t\t\tNewText: nil,\n\t\t\t\t\t\t}},\n\t\t\t\t\t}}\n\n\t\t\t\t\tif len(linters) == 0 {\n\t\t\t\t\t\tissue := &result.Issue{\n\t\t\t\t\t\t\tFromLinter:     LinterName,\n\t\t\t\t\t\t\tText:           formatUnusedCandidate(comment.Text, \"\"),\n\t\t\t\t\t\t\tPos:            pos,\n\t\t\t\t\t\t\tExpectNoLint:   true,\n\t\t\t\t\t\t\tSuggestedFixes: removeNolintCompletely,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(issue, pass))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor _, linter := range linters {\n\t\t\t\t\t\t\tissue := &result.Issue{\n\t\t\t\t\t\t\t\tFromLinter:           LinterName,\n\t\t\t\t\t\t\t\tText:                 formatUnusedCandidate(comment.Text, linter),\n\t\t\t\t\t\t\t\tPos:                  pos,\n\t\t\t\t\t\t\t\tExpectNoLint:         true,\n\t\t\t\t\t\t\t\tExpectedNoLintLinter: linter,\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// only offer SuggestedFix if there is a single linter\n\t\t\t\t\t\t\t// because of issues around commas and the possibility of all\n\t\t\t\t\t\t\t// linters being removed\n\t\t\t\t\t\t\tif len(linters) == 1 {\n\t\t\t\t\t\t\t\tissue.SuggestedFixes = removeNolintCompletely\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(issue, pass))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (l.needs&NeedsExplanation) != 0 && (explanation == \"\" || strings.TrimSpace(explanation) == commentMark) {\n\t\t\t\t\tneedsExplanation := len(linters) == 0 // if no linters are mentioned, we must have explanation\n\t\t\t\t\t// otherwise, check if we are excluding all the mentioned linters\n\t\t\t\t\tfor _, ll := range linters {\n\t\t\t\t\t\tif !l.excludeByLinter[ll] { // if a linter does require explanation\n\t\t\t\t\t\t\tneedsExplanation = true\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif needsExplanation {\n\t\t\t\t\t\tfullDirectiveWithoutExplanation := trailingBlankExplanation.ReplaceAllString(comment.Text, \"\")\n\n\t\t\t\t\t\tissue := &result.Issue{\n\t\t\t\t\t\t\tFromLinter: LinterName,\n\t\t\t\t\t\t\tText:       formatNoExplanation(comment.Text, fullDirectiveWithoutExplanation),\n\t\t\t\t\t\t\tPos:        pos,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tissues = append(issues, goanalysis.NewIssue(issue, pass))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn issues, nil\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/internal/nolintlint_test.go",
    "content": "package internal\n\nimport (\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestLinter_Run(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tneeds    Needs\n\t\texcludes []string\n\t\tcontents string\n\t\texpected []*result.Issue\n\t}{\n\t\t{\n\t\t\tdesc:  \"when no explanation is provided\",\n\t\t\tneeds: NeedsExplanation,\n\t\t\tcontents: `package bar\n\n// example\n//nolint\nfunc foo() {\n  bad() //nolint\n  bad() //nolint //\n  bad() //nolint // \n  good() //nolint // this is ok\n\tother() //nolintother\n}\n`,\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `//nolint` should provide explanation such as `//nolint // this is why`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 24, Line: 4, Column: 1},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `//nolint` should provide explanation such as `//nolint // this is why`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 54, Line: 6, Column: 9},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `//nolint //` should provide explanation such as `//nolint // this is why`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 71, Line: 7, Column: 9},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `//nolint // ` should provide explanation such as `//nolint // this is why`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 91, Line: 8, Column: 9},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:  \"when multiple directives on multiple lines\",\n\t\t\tneeds: NeedsExplanation,\n\t\t\tcontents: `package bar\n\n// example\n//nolint // this is ok\n//nolint:dupl\nfunc foo() {}\n`,\n\t\t\texpected: []*result.Issue{{\n\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\tText:       \"directive `//nolint:dupl` should provide explanation such as `//nolint:dupl // this is why`\",\n\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 47, Line: 5, Column: 1},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"when no explanation is needed for a specific linter\",\n\t\t\tneeds:    NeedsExplanation,\n\t\t\texcludes: []string{\"lll\"},\n\t\t\tcontents: `package bar\n\nfunc foo() {\n\tthisIsAReallyLongLine() //nolint:lll\n}\n`,\n\t\t},\n\t\t{\n\t\t\tdesc:  \"when no specific linter is mentioned\",\n\t\t\tneeds: NeedsSpecific,\n\t\t\tcontents: `package bar\n\nfunc foo() {\n  good() //nolint:my-linter\n  bad() //nolint\n  bad() //nolint // because\n}\n`,\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `//nolint` should mention specific linter such as `//nolint:my-linter`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 62, Line: 5, Column: 9},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `//nolint // because` should mention specific linter such as `//nolint:my-linter`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 79, Line: 6, Column: 9},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"when machine-readable style isn't used\",\n\t\t\tcontents: `package bar\n\nfunc foo() {\n  bad() // nolint\n  bad() //   nolint\n  good() //nolint\n}\n`,\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `// nolint` should be written without leading space as `//nolint`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 34, Line: 4, Column: 9},\n\t\t\t\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\t\tPos:     34,\n\t\t\t\t\t\t\tEnd:     37,\n\t\t\t\t\t\t\tNewText: []byte(commentMark),\n\t\t\t\t\t\t}},\n\t\t\t\t\t}},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\t\tText:       \"directive `//   nolint` should be written without leading space as `//nolint`\",\n\t\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 52, Line: 5, Column: 9},\n\t\t\t\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\t\tPos:     52,\n\t\t\t\t\t\t\tEnd:     57,\n\t\t\t\t\t\t\tNewText: []byte(commentMark),\n\t\t\t\t\t\t}},\n\t\t\t\t\t}},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"spaces are allowed in comma-separated list of linters\",\n\t\t\tcontents: `package bar\n\nfunc foo() {\n  good() //nolint:linter1,linter-two\n  bad() //nolint:linter1 linter2\n  good() //nolint: linter1,linter2\n  good() //nolint: linter1, linter2\n}\n`,\n\t\t\texpected: []*result.Issue{{\n\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\tText:       \"directive `//nolint:linter1 linter2` should match `//nolint[:<comma-separated-linters>] [// <explanation>]`\",\n\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 71, Line: 5, Column: 9},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdesc: \"multi-line comments don't confuse parser\",\n\t\t\tcontents: `package bar\n\nfunc foo() {\n  //nolint:test\n  // something else\n}\n`,\n\t\t},\n\t\t{\n\t\t\tdesc:  \"needs unused without specific linter generates replacement\",\n\t\t\tneeds: NeedsUnused,\n\t\t\tcontents: `package bar\n\nfunc foo() {\n  bad() //nolint\n}\n`,\n\t\t\texpected: []*result.Issue{{\n\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\tText:       \"directive `//nolint` is unused\",\n\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 34, Line: 4, Column: 9},\n\t\t\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\tPos: 34,\n\t\t\t\t\t\tEnd: 42,\n\t\t\t\t\t}},\n\t\t\t\t}},\n\t\t\t\tExpectNoLint: true,\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdesc:  \"needs unused with one specific linter generates replacement\",\n\t\t\tneeds: NeedsUnused,\n\t\t\tcontents: `package bar\n\nfunc foo() {\n  bad() //nolint:somelinter\n}\n`,\n\t\t\texpected: []*result.Issue{{\n\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\tText:       \"directive `//nolint:somelinter` is unused for linter \\\"somelinter\\\"\",\n\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 34, Line: 4, Column: 9},\n\t\t\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\tPos: 34,\n\t\t\t\t\t\tEnd: 53,\n\t\t\t\t\t}},\n\t\t\t\t}},\n\t\t\t\tExpectNoLint:         true,\n\t\t\t\tExpectedNoLintLinter: \"somelinter\",\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdesc:  \"needs unused with one specific linter in a new line generates replacement\",\n\t\t\tneeds: NeedsUnused,\n\t\t\tcontents: `package bar\n\n//nolint:somelinter\nfunc foo() {\n  bad()\n}\n`,\n\t\t\texpected: []*result.Issue{{\n\t\t\t\tFromLinter: \"nolintlint\",\n\t\t\t\tText:       \"directive `//nolint:somelinter` is unused for linter \\\"somelinter\\\"\",\n\t\t\t\tPos:        token.Position{Filename: \"testing.go\", Offset: 13, Line: 3, Column: 1},\n\t\t\t\tSuggestedFixes: []analysis.SuggestedFix{{\n\t\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\t\tPos: 13,\n\t\t\t\t\t\tEnd: 32,\n\t\t\t\t\t}},\n\t\t\t\t}},\n\t\t\t\tExpectNoLint:         true,\n\t\t\t\tExpectedNoLintLinter: \"somelinter\",\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tdesc:  \"needs unused with multiple specific linters does not generate replacements\",\n\t\t\tneeds: NeedsUnused,\n\t\t\tcontents: `package bar\n\nfunc foo() {\n  bad() //nolint:linter1,linter2\n}\n`,\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter:           \"nolintlint\",\n\t\t\t\t\tText:                 \"directive `//nolint:linter1,linter2` is unused for linter \\\"linter1\\\"\",\n\t\t\t\t\tPos:                  token.Position{Filename: \"testing.go\", Offset: 34, Line: 4, Column: 9},\n\t\t\t\t\tExpectNoLint:         true,\n\t\t\t\t\tExpectedNoLintLinter: \"linter1\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tFromLinter:           \"nolintlint\",\n\t\t\t\t\tText:                 \"directive `//nolint:linter1,linter2` is unused for linter \\\"linter2\\\"\",\n\t\t\t\t\tPos:                  token.Position{Filename: \"testing.go\", Offset: 34, Line: 4, Column: 9},\n\t\t\t\t\tExpectNoLint:         true,\n\t\t\t\t\tExpectedNoLintLinter: \"linter2\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tlinter, _ := NewLinter(test.needs, test.excludes)\n\n\t\t\tfset := token.NewFileSet()\n\t\t\texpr, err := parser.ParseFile(fset, \"testing.go\", test.contents, parser.ParseComments)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tpass := &analysis.Pass{\n\t\t\t\tFset:  fset,\n\t\t\t\tFiles: []*ast.File{expr},\n\t\t\t}\n\n\t\t\tanalysisIssues, err := linter.Run(pass)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar issues []*result.Issue\n\t\t\tfor _, i := range analysisIssues {\n\t\t\t\tissues = append(issues, i.Issue)\n\t\t\t}\n\n\t\t\tassert.Equal(t, test.expected, issues)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/nolintlint.go",
    "content": "package nolintlint\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\tnolintlint \"github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n)\n\nconst LinterName = nolintlint.LinterName\n\nfunc New(settings *config.NoLintLintSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\tvar needs nolintlint.Needs\n\tif settings.RequireExplanation {\n\t\tneeds |= nolintlint.NeedsExplanation\n\t}\n\tif settings.RequireSpecific {\n\t\tneeds |= nolintlint.NeedsSpecific\n\t}\n\tif !settings.AllowUnused {\n\t\tneeds |= nolintlint.NeedsUnused\n\t}\n\n\tlnt, err := nolintlint.NewLinter(needs, settings.AllowNoExplanation)\n\tif err != nil {\n\t\tinternal.LinterLogger.Fatalf(\"%s: create analyzer: %v\", nolintlint.LinterName, err)\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: nolintlint.LinterName,\n\t\t\tDoc:  \"Reports ill-formed or insufficient nolint directives\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues, err := lnt.Run(pass)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"linter failed to run: %w\", err)\n\t\t\t\t}\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/nolintlint_integration_test.go",
    "content": "package nolintlint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/testdata/fix/in/nolintlint.go",
    "content": "//golangcitest:args -Enolintlint -Elll\n//golangcitest:expected_linter nolintlint\npackage p\n\nimport \"fmt\"\n\nfunc nolintlint() {\n\tfmt.Println() // nolint:bob // leading space should be dropped\n\tfmt.Println() //  nolint:bob // leading spaces should be dropped\n\n\tfmt.Println() //nolint:all // nolint should be dropped\n\tfmt.Println() //nolint:lll // nolint should be dropped\n\n\tfmt.Println() //nolint:alice,lll // we don't drop individual linters from lists\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/testdata/fix/out/nolintlint.go",
    "content": "//golangcitest:args -Enolintlint -Elll\n//golangcitest:expected_linter nolintlint\npackage p\n\nimport \"fmt\"\n\nfunc nolintlint() {\n\tfmt.Println() //nolint:bob // leading space should be dropped\n\tfmt.Println() //nolint:bob // leading spaces should be dropped\n\n\tfmt.Println()\n\tfmt.Println()\n\n\tfmt.Println() //nolint:alice,lll // we don't drop individual linters from lists\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/testdata/nolintlint.go",
    "content": "//golangcitest:args -Enolintlint -Emisspell\n//golangcitest:expected_linter nolintlint\n//golangcitest:config_path nolintlint.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc Foo() {\n\tfmt.Println(\"not specific\")         //nolint // want \"directive `.*` should mention specific linter such as `//nolint:my-linter`\"\n\tfmt.Println(\"not machine readable\") // nolint // want \"directive `.*`  should be written as `//nolint`\"\n\tfmt.Println(\"extra spaces\")         //  nolint:unused // because // want \"directive `.*` should not have more than one leading space\"\n\n\t// test expanded range\n\t//nolint:misspell // deliberate misspelling to trigger nolintlint\n\tfunc() {\n\t\tmispell := true\n\t\tfmt.Println(mispell)\n\t}()\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/testdata/nolintlint.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nolintlint:\n      require-explanation: true\n      require-specific: true\n"
  },
  {
    "path": "pkg/golinters/nolintlint/testdata/nolintlint_cgo.go",
    "content": "//golangcitest:args -Enolintlint -Emisspell\n//golangcitest:expected_linter nolintlint\n//golangcitest:config_path nolintlint.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc Foo() {\n\tfmt.Println(\"not specific\")         //nolint // want \"directive `.*` should mention specific linter such as `//nolint:my-linter`\"\n\tfmt.Println(\"not machine readable\") // nolint // want \"directive `.*`  should be written as `//nolint`\"\n\tfmt.Println(\"extra spaces\")         //  nolint:unused // because // want \"directive `.*` should not have more than one leading space\"\n\n\t// test expanded range\n\t//nolint:misspell // deliberate misspelling to trigger nolintlint\n\tfunc() {\n\t\tmispell := true\n\t\tfmt.Println(mispell)\n\t}()\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/testdata/nolintlint_unused.go",
    "content": "//golangcitest:args -Enolintlint -Emisspell\n//golangcitest:expected_linter nolintlint\n//golangcitest:config_path nolintlint_unused.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc Foo() {\n\tfmt.Println(\"unused\")          //nolint:all // want \"directive `//nolint .*` is unused\"\n\tfmt.Println(\"unused,specific\") //nolint:misspell // want \"directive `//nolint:misspell .*` is unused for linter misspell\"\n\tfmt.Println(\"not run\")         //nolint:unparam // unparam is not run so this is ok\n}\n"
  },
  {
    "path": "pkg/golinters/nolintlint/testdata/nolintlint_unused.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nolintlint:\n      allow-unused: false\n"
  },
  {
    "path": "pkg/golinters/nonamedreturns/nonamedreturns.go",
    "content": "package nonamedreturns\n\nimport (\n\t\"github.com/firefart/nonamedreturns/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.NoNamedReturnsSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\tanalyzer.FlagReportErrorInDefer: settings.ReportErrorInDefer,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.Analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/nonamedreturns/nonamedreturns_integration_test.go",
    "content": "package nonamedreturns\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nonamedreturns/testdata/nonamedreturns.go",
    "content": "//golangcitest:args -Enonamedreturns\npackage testdata\n\nimport \"errors\"\n\nfunc simple() (err error) {\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc twoReturnParams() (i int, err error) { // want `named return \"i\" with type \"int\" found`\n\tdefer func() {\n\t\ti = 0\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc allUnderscoresExceptError() (_ int, err error) {\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc customName() (myName error) {\n\tdefer func() {\n\t\tmyName = nil\n\t}()\n\treturn\n}\n\nfunc errorIsNoAssigned() (err error) { // want `named return \"err\" with type \"error\" found`\n\tdefer func() {\n\t\t_ = err\n\t\tprocessError(err)\n\t\tif err == nil {\n\t\t}\n\t\tswitch err {\n\t\tcase nil:\n\t\tdefault:\n\t\t}\n\t}()\n\treturn\n}\n\nfunc shadowVariable() (err error) { // want `named return \"err\" with type \"error\" found`\n\tdefer func() {\n\t\terr := errors.New(\"xxx\")\n\t\t_ = err\n\t}()\n\treturn\n}\n\nfunc shadowVariableButAssign() (err error) {\n\tdefer func() {\n\t\t{\n\t\t\terr := errors.New(\"xxx\")\n\t\t\t_ = err\n\t\t}\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc shadowVariable2() (err error) { // want `named return \"err\" with type \"error\" found`\n\tdefer func() {\n\t\ta, err := doSomething()\n\t\t_ = a\n\t\t_ = err\n\t}()\n\treturn\n}\n\ntype errorAlias = error\n\nfunc errorAliasIsTheSame() (err errorAlias) {\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\ntype myError error // linter doesn't check underlying type (yet?)\n\nfunc customTypeWithErrorUnderline() (err myError) { // want `named return \"err\" with type \"myError\" found`\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\ntype myError2 interface{ error } // linter doesn't check interfaces\n\nfunc customTypeWithTheSameInterface() (err myError2) { // want `named return \"err\" with type \"myError2\" found`\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nvar _ error = myError3{}\n\ntype myError3 struct{} // linter doesn't check interfaces\n\nfunc (m myError3) Error() string { return \"\" }\n\nfunc customTypeImplementingErrorInterface() (err myError3) { // want `named return \"err\" with type \"myError3\" found`\n\tdefer func() {\n\t\terr = struct{}{}\n\t}()\n\treturn\n}\n\nfunc shadowErrorType() {\n\ttype error interface { // linter understands that this is not built-in error, even if it has the same name\n\t\tError() string\n\t}\n\tdo := func() (err error) { // want `named return \"err\" with type \"error\" found`\n\t\tdefer func() {\n\t\t\terr = nil\n\t\t}()\n\t\treturn\n\t}\n\tdo()\n}\n\nfunc notTheLast() (err error, _ int) {\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc twoErrorsCombined() (err1, err2 error) {\n\tdefer func() {\n\t\terr1 = nil\n\t\terr2 = nil\n\t}()\n\treturn\n}\n\nfunc twoErrorsSeparated() (err1 error, err2 error) {\n\tdefer func() {\n\t\terr1 = nil\n\t\terr2 = nil\n\t}()\n\treturn\n}\n\nfunc errorSlice() (err []error) { // want `named return \"err\" with type \"\\[\\]error\" found`\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc deferWithVariable() (err error) { // want `named return \"err\" with type \"error\" found`\n\tf := func() {\n\t\terr = nil\n\t}\n\tdefer f() // linter can't catch closure passed via variable (yet?)\n\treturn\n}\n\nfunc uberMultierr() (err error) { // want `named return \"err\" with type \"error\" found`\n\tdefer func() {\n\t\tmultierrAppendInto(&err, nil) // linter doesn't allow it (yet?)\n\t}()\n\treturn\n}\n\nfunc deferInDefer() (err error) {\n\tdefer func() {\n\t\tdefer func() {\n\t\t\terr = nil\n\t\t}()\n\t}()\n\treturn\n}\n\nfunc twoDefers() (err error) {\n\tdefer func() {}()\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc callFunction() (err error) {\n\tdefer func() {\n\t\t_, err = doSomething()\n\t}()\n\treturn\n}\n\nfunc callFunction2() (err error) {\n\tdefer func() {\n\t\tvar a int\n\t\ta, err = doSomething()\n\t\t_ = a\n\t}()\n\treturn\n}\n\nfunc deepInside() (err error) {\n\tif true {\n\t\tswitch true {\n\t\tcase false:\n\t\t\tfor i := 0; i < 10; i++ {\n\t\t\t\tgo func() {\n\t\t\t\t\tselect {\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tdefer func() {\n\t\t\t\t\t\t\tif true {\n\t\t\t\t\t\t\t\tswitch true {\n\t\t\t\t\t\t\t\tcase false:\n\t\t\t\t\t\t\t\t\tfor j := 0; j < 10; j++ {\n\t\t\t\t\t\t\t\t\t\tgo func() {\n\t\t\t\t\t\t\t\t\t\t\tselect {\n\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\terr = nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}()\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nvar goodFuncLiteral = func() (err error) {\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nvar badFuncLiteral = func() (err error) { // want `named return \"err\" with type \"error\" found`\n\tdefer func() {\n\t\t_ = err\n\t}()\n\treturn\n}\n\nfunc funcLiteralInsideFunc() error {\n\tdo := func() (err error) {\n\t\tdefer func() {\n\t\t\terr = nil\n\t\t}()\n\t\treturn\n\t}\n\treturn do()\n}\n\ntype x struct{}\n\nfunc (x) goodMethod() (err error) {\n\tdefer func() {\n\t\terr = nil\n\t}()\n\treturn\n}\n\nfunc (x) badMethod() (err error) { // want `named return \"err\" with type \"error\" found`\n\tdefer func() {\n\t\t_ = err\n\t}()\n\treturn\n}\n\nfunc processError(error)                    {}\nfunc doSomething() (int, error)             { return 10, nil }\nfunc multierrAppendInto(*error, error) bool { return false } // https://pkg.go.dev/go.uber.org/multierr#AppendInto\n"
  },
  {
    "path": "pkg/golinters/nonamedreturns/testdata/nonamedreturns_cgo.go",
    "content": "//golangcitest:args -Enonamedreturns\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() (i int, err error) { // want `named return \"i\" with type \"int\" found`\n\tdefer func() {\n\t\ti = math.MaxInt\n\t\terr = nil\n\t}()\n\treturn\n}\n"
  },
  {
    "path": "pkg/golinters/nonamedreturns/testdata/nonamedreturns_custom.go",
    "content": "//golangcitest:args -Enonamedreturns\n//golangcitest:config_path testdata/nonamedreturns_custom.yml\npackage testdata\n\nimport \"fmt\"\n\ntype asdf struct {\n\ttest string\n}\n\nfunc noParams() {\n\treturn\n}\n\nvar c = func() {\n\treturn\n}\n\nvar d = func() error {\n\treturn nil\n}\n\nvar e = func() (err error) { // want `named return \"err\" with type \"error\" found`\n\terr = nil\n\treturn\n}\n\nvar e2 = func() (_ error) {\n\treturn\n}\n\nfunc deferWithError() (err error) { // want `named return \"err\" with type \"error\" found`\n\tdefer func() {\n\t\terr = nil // use flag to allow this\n\t}()\n\treturn\n}\n\nvar (\n\tf = func() {\n\t\treturn\n\t}\n\n\tg = func() error {\n\t\treturn nil\n\t}\n\n\th = func() (err error) { // want `named return \"err\" with type \"error\" found`\n\t\terr = nil\n\t\treturn\n\t}\n\n\th2 = func() (_ error) {\n\t\treturn\n\t}\n)\n\n// this should not match as the implementation does not need named parameters (see below)\ntype funcDefinition func(arg1, arg2 interface{}) (num int, err error)\n\nfunc funcDefinitionImpl(arg1, arg2 interface{}) (int, error) {\n\treturn 0, nil\n}\n\nfunc funcDefinitionImpl2(arg1, arg2 interface{}) (num int, err error) { // want `named return \"num\" with type \"int\" found`\n\treturn 0, nil\n}\n\nfunc funcDefinitionImpl3(arg1, arg2 interface{}) (num int, _ error) { // want `named return \"num\" with type \"int\" found`\n\treturn 0, nil\n}\n\nfunc funcDefinitionImpl4(arg1, arg2 interface{}) (_ int, _ error) {\n\treturn 0, nil\n}\n\nvar funcVar = func() (msg string) { // want `named return \"msg\" with type \"string\" found`\n\tmsg = \"c\"\n\treturn msg\n}\n\nvar funcVar2 = func() (_ string) {\n\tmsg := \"c\"\n\treturn msg\n}\n\nfunc test() {\n\ta := funcVar()\n\t_ = a\n\n\tvar function funcDefinition\n\tfunction = funcDefinitionImpl\n\ti, err := function(\"\", \"\")\n\t_ = i\n\t_ = err\n\tfunction = funcDefinitionImpl2\n\ti, err = function(\"\", \"\")\n\t_ = i\n\t_ = err\n}\n\nfunc good(i string) string {\n\treturn i\n}\n\nfunc bad(i string, a, b int) (ret1 string, ret2 interface{}, ret3, ret4 int, ret5 asdf) { // want `named return \"ret1\" with type \"string\" found`\n\tx := \"dummy\"\n\treturn fmt.Sprintf(\"%s\", x), nil, 1, 2, asdf{}\n}\n\nfunc bad2() (msg string, err error) { // want `named return \"msg\" with type \"string\" found`\n\tmsg = \"\"\n\terr = nil\n\treturn\n}\n\nfunc myLog(format string, args ...interface{}) {\n\treturn\n}\n\ntype obj struct{}\n\nfunc (o *obj) func1() (err error) { return nil } // want `named return \"err\" with type \"error\" found`\n\nfunc (o *obj) func2() (_ error) { return nil }\n"
  },
  {
    "path": "pkg/golinters/nonamedreturns/testdata/nonamedreturns_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    nonamedreturns:\n      report-error-in-defer: true\n"
  },
  {
    "path": "pkg/golinters/nosprintfhostport/nosprintfhostport.go",
    "content": "package nosprintfhostport\n\nimport (\n\t\"github.com/stbenjam/no-sprintf-host-port/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/nosprintfhostport/nosprintfhostport_integration_test.go",
    "content": "package nosprintfhostport\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/nosprintfhostport/testdata/nosprintfhostport.go",
    "content": "//golangcitest:args -Enosprintfhostport\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"net\"\n)\n\nfunc _() {\n\n\t_ = fmt.Sprintf(\"postgres://%s:%s@127.0.0.1/%s\", \"foo\", \"bar\", \"baz\")\n\n\t_ = fmt.Sprintf(\"http://api.%s/foo\", \"example.com\")\n\n\t_ = fmt.Sprintf(\"http://api.%s:6443/foo\", \"example.com\")\n\n\t_ = fmt.Sprintf(\"http://%s/foo\", net.JoinHostPort(\"foo\", \"80\"))\n\n\t_ = fmt.Sprintf(\"9invalidscheme://%s:%d\", \"myHost\", 70)\n\n\t_ = fmt.Sprintf(\"gopher://%s/foo\", net.JoinHostPort(\"foo\", \"80\"))\n\n\t_ = fmt.Sprintf(\"telnet+ssl://%s/foo\", net.JoinHostPort(\"foo\", \"80\"))\n\n\t_ = fmt.Sprintf(\"http://%s/foo:bar\", net.JoinHostPort(\"foo\", \"80\"))\n\n\t_ = fmt.Sprintf(\"http://user:password@%s/foo:bar\", net.JoinHostPort(\"foo\", \"80\"))\n\n\t_ = fmt.Sprintf(\"http://example.com:9211\")\n\n\t_ = fmt.Sprintf(\"gopher://%s:%d\", \"myHost\", 70)\n\n\t_ = fmt.Sprintf(\"telnet+ssl://%s:%d\", \"myHost\", 23)\n\n\t_ = fmt.Sprintf(\"weird3.6://%s:%d\", \"myHost\", 23)\n\n\t_ = fmt.Sprintf(\"https://user@%s:%d\", \"myHost\", 8443) // want \"host:port in url should be constructed with net.JoinHostPort and not directly with fmt.Sprintf\"\n\n\t_ = fmt.Sprintf(\"postgres://%s:%s@%s:5050/%s\", \"foo\", \"bar\", \"baz\", \"qux\") // want \"host:port in url should be constructed with net.JoinHostPort and not directly with fmt.Sprintf\"\n\n\t_ = fmt.Sprintf(\"https://%s:%d\", \"myHost\", 8443)\n\n\t_ = fmt.Sprintf(\"https://%s:9211\", \"myHost\")\n\n\tip := \"fd00::1\"\n\t_ = fmt.Sprintf(\"http://%s:1936/healthz\", ip) // want \"host:port in url should be constructed with net.JoinHostPort and not directly with fmt.Sprintf\"\n}\n"
  },
  {
    "path": "pkg/golinters/nosprintfhostport/testdata/nosprintfhostport_cgo.go",
    "content": "//golangcitest:args -Enosprintfhostport\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tip := \"fd00::1\"\n\t_ = fmt.Sprintf(\"http://%s:1936/healthz\", ip) // want \"host:port in url should be constructed with net.JoinHostPort and not directly with fmt.Sprintf\"\n}\n"
  },
  {
    "path": "pkg/golinters/paralleltest/paralleltest.go",
    "content": "package paralleltest\n\nimport (\n\t\"github.com/kunwardeep/paralleltest/pkg/paralleltest\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.ParallelTestSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"i\":                     settings.IgnoreMissing,\n\t\t\t\"ignoremissingsubtests\": settings.IgnoreMissingSubtests,\n\t\t}\n\n\t\tif config.IsGoGreaterThanOrEqual(settings.Go, \"1.22\") {\n\t\t\tcfg[\"ignoreloopVar\"] = true\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(paralleltest.NewAnalyzer()).\n\t\tWithDesc(\"Detects missing usage of t.Parallel() method in your Go test\").\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/paralleltest/paralleltest_integration_test.go",
    "content": "package paralleltest\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/paralleltest/testdata/paralleltest_custom_test.go",
    "content": "//golangcitest:args -Eparalleltest\n//golangcitest:config_path testdata/paralleltest_custom_test.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestParallelTestIgnore(t *testing.T) {\n\ttestCases := []struct {\n\t\tname string\n\t}{{name: \"foo\"}}\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\t\t\tfmt.Println(tc.name)\n\t\t})\n\t}\n}\n\nfunc TestParallelTestEmptyIgnore(t *testing.T) {}\n"
  },
  {
    "path": "pkg/golinters/paralleltest/testdata/paralleltest_custom_test.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    paralleltest:\n      ignore-missing: true\n"
  },
  {
    "path": "pkg/golinters/paralleltest/testdata/paralleltest_test.go",
    "content": "//golangcitest:args -Eparalleltest\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestFunctionSuccessfulRangeTest(t *testing.T) {\n\tt.Parallel()\n\n\ttestCases := []struct {\n\t\tname string\n\t}{{name: \"foo\"}}\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\t\t\tfmt.Println(tc.name)\n\t\t})\n\t}\n}\n\nfunc TestFunctionMissingCallToParallel(t *testing.T) {} // want \"Function TestFunctionMissingCallToParallel missing the call to method parallel\"\n"
  },
  {
    "path": "pkg/golinters/perfsprint/perfsprint.go",
    "content": "package perfsprint\n\nimport (\n\t\"github.com/catenacyber/perfsprint/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.PerfSprintSettings) *goanalysis.Linter {\n\tcfg := map[string]any{\n\t\t\"fiximports\": false,\n\t}\n\n\tif settings != nil {\n\t\t// NOTE: The option `ignore-tests` is not handled because it should be managed with `linters.exclusions.rules`\n\n\t\tcfg[\"integer-format\"] = settings.IntegerFormat\n\t\tcfg[\"int-conversion\"] = settings.IntConversion\n\n\t\tcfg[\"error-format\"] = settings.ErrorFormat\n\t\tcfg[\"err-error\"] = settings.ErrError\n\t\tcfg[\"errorf\"] = settings.ErrorF\n\n\t\tcfg[\"string-format\"] = settings.StringFormat\n\t\tcfg[\"sprintf1\"] = settings.SprintF1\n\t\tcfg[\"strconcat\"] = settings.StrConcat\n\n\t\tcfg[\"bool-format\"] = settings.BoolFormat\n\t\tcfg[\"hex-format\"] = settings.HexFormat\n\n\t\tcfg[\"concat-loop\"] = settings.ConcatLoop\n\t\tcfg[\"loop-other-ops\"] = settings.LoopOtherOps\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.New()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/perfsprint/perfsprint_integration_test.go",
    "content": "package perfsprint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/perfsprint/testdata/fix/in/perfsprint.go",
    "content": "//golangcitest:args -Eperfsprint\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"fmt\"\n)\n\nfunc TestPerfsprint() {\n\tvar (\n\t\ts   string\n\t\terr error\n\t\tb   bool\n\t\ti   int\n\t\ti64 int64\n\t\tui  uint\n\t)\n\n\tfmt.Sprintf(\"%s\", s) // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprint(s)        // want \"fmt.Sprint can be replaced with just using the string\"\n\tfmt.Sprintf(\"%s\", err)\n\tfmt.Sprint(err)\n\tfmt.Sprintf(\"%t\", b)           // want \"fmt.Sprintf can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprint(b)                  // want \"fmt.Sprint can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprintf(\"%d\", i)           // want \"fmt.Sprintf can be replaced with faster strconv.Itoa\"\n\tfmt.Sprint(i)                  // want \"fmt.Sprint can be replaced with faster strconv.Itoa\"\n\tfmt.Sprintf(\"%d\", i64)         // want \"fmt.Sprintf can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprint(i64)                // want \"fmt.Sprint can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprintf(\"%d\", ui)          // want \"fmt.Sprintf can be replaced with faster strconv.FormatUint\"\n\tfmt.Sprint(ui)                 // want \"fmt.Sprint can be replaced with faster strconv.FormatUint\"\n\tfmt.Sprintf(\"%x\", []byte{'a'}) // want \"fmt.Sprintf can be replaced with faster hex.EncodeToString\"\n\tfmt.Errorf(\"hello\")            // want \"fmt.Errorf can be replaced with errors.New\"\n\tfmt.Sprintf(\"Hello %s\", s)     // want \"fmt.Sprintf can be replaced with string concatenation\"\n\n\tfmt.Sprint(\"test\", 42)\n\tfmt.Sprint(42, 42)\n\tfmt.Sprintf(\"test\") // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%v\")   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%d\")   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%d\", 42, 42)\n\tfmt.Sprintf(\"%#d\", 42)\n\tfmt.Sprintf(\"value %d\", 42)\n\tfmt.Sprintf(\"val%d\", 42)\n\tfmt.Sprintf(\"%s %v\", \"hello\", \"world\")\n\tfmt.Sprintf(\"%#v\", 42)\n\tfmt.Sprintf(\"%T\", struct{ string }{})\n\tfmt.Sprintf(\"%%v\", 42)\n\tfmt.Sprintf(\"%3d\", 42)\n\tfmt.Sprintf(\"% d\", 42)\n\tfmt.Sprintf(\"%-10d\", 42)\n\tfmt.Sprintf(\"%[2]d %[1]d\\n\", 11, 22)\n\tfmt.Sprintf(\"%[3]*.[2]*[1]f\", 12.0, 2, 6)\n\tfmt.Sprintf(\"%d %d %#[1]x %#x\", 16, 17)\n}\n"
  },
  {
    "path": "pkg/golinters/perfsprint/testdata/fix/out/perfsprint.go",
    "content": "//golangcitest:args -Eperfsprint\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"fmt\"\n)\n\nfunc TestPerfsprint() {\n\tvar (\n\t\ts   string\n\t\terr error\n\t\tb   bool\n\t\ti   int\n\t\ti64 int64\n\t\tui  uint\n\t)\n\n\ts // want \"fmt.Sprintf can be replaced with just using the string\"\n\ts // want \"fmt.Sprint can be replaced with just using the string\"\n\tfmt.Sprintf(\"%s\", err)\n\tfmt.Sprint(err)\n\tstrconv.FormatBool(b)              // want \"fmt.Sprintf can be replaced with faster strconv.FormatBool\"\n\tstrconv.FormatBool(b)              // want \"fmt.Sprint can be replaced with faster strconv.FormatBool\"\n\tstrconv.Itoa(i)                    // want \"fmt.Sprintf can be replaced with faster strconv.Itoa\"\n\tstrconv.Itoa(i)                    // want \"fmt.Sprint can be replaced with faster strconv.Itoa\"\n\tstrconv.FormatInt(i64, 10)         // want \"fmt.Sprintf can be replaced with faster strconv.FormatInt\"\n\tstrconv.FormatInt(i64, 10)         // want \"fmt.Sprint can be replaced with faster strconv.FormatInt\"\n\tstrconv.FormatUint(uint64(ui), 10) // want \"fmt.Sprintf can be replaced with faster strconv.FormatUint\"\n\tstrconv.FormatUint(uint64(ui), 10) // want \"fmt.Sprint can be replaced with faster strconv.FormatUint\"\n\thex.EncodeToString([]byte{'a'})    // want \"fmt.Sprintf can be replaced with faster hex.EncodeToString\"\n\terrors.New(\"hello\")                // want \"fmt.Errorf can be replaced with errors.New\"\n\t\"Hello \" + s                       // want \"fmt.Sprintf can be replaced with string concatenation\"\n\n\tfmt.Sprint(\"test\", 42)\n\tfmt.Sprint(42, 42)\n\t\"test\" // want \"fmt.Sprintf can be replaced with just using the string\"\n\t\"%v\"   // want \"fmt.Sprintf can be replaced with just using the string\"\n\t\"%d\"   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%d\", 42, 42)\n\tfmt.Sprintf(\"%#d\", 42)\n\tfmt.Sprintf(\"value %d\", 42)\n\tfmt.Sprintf(\"val%d\", 42)\n\tfmt.Sprintf(\"%s %v\", \"hello\", \"world\")\n\tfmt.Sprintf(\"%#v\", 42)\n\tfmt.Sprintf(\"%T\", struct{ string }{})\n\tfmt.Sprintf(\"%%v\", 42)\n\tfmt.Sprintf(\"%3d\", 42)\n\tfmt.Sprintf(\"% d\", 42)\n\tfmt.Sprintf(\"%-10d\", 42)\n\tfmt.Sprintf(\"%[2]d %[1]d\\n\", 11, 22)\n\tfmt.Sprintf(\"%[3]*.[2]*[1]f\", 12.0, 2, 6)\n\tfmt.Sprintf(\"%d %d %#[1]x %#x\", 16, 17)\n}\n"
  },
  {
    "path": "pkg/golinters/perfsprint/testdata/perfsprint.go",
    "content": "//golangcitest:args -Eperfsprint\npackage testdata\n\nimport (\n\t\"fmt\"\n)\n\nfunc TestPerfsprint() {\n\tvar (\n\t\ts   string\n\t\terr error\n\t\tb   bool\n\t\ti   int\n\t\ti64 int64\n\t\tui  uint\n\t)\n\n\tfmt.Sprintf(\"%s\", s) // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprint(s)        // want \"fmt.Sprint can be replaced with just using the string\"\n\tfmt.Sprintf(\"%s\", err)\n\tfmt.Sprint(err)\n\tfmt.Sprintf(\"%t\", b)           // want \"fmt.Sprintf can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprint(b)                  // want \"fmt.Sprint can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprintf(\"%d\", i)           // want \"fmt.Sprintf can be replaced with faster strconv.Itoa\"\n\tfmt.Sprint(i)                  // want \"fmt.Sprint can be replaced with faster strconv.Itoa\"\n\tfmt.Sprintf(\"%d\", i64)         // want \"fmt.Sprintf can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprint(i64)                // want \"fmt.Sprint can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprintf(\"%d\", ui)          // want \"fmt.Sprintf can be replaced with faster strconv.FormatUint\"\n\tfmt.Sprint(ui)                 // want \"fmt.Sprint can be replaced with faster strconv.FormatUint\"\n\tfmt.Sprintf(\"%x\", []byte{'a'}) // want \"fmt.Sprintf can be replaced with faster hex.EncodeToString\"\n\tfmt.Errorf(\"hello\")            // want \"fmt.Errorf can be replaced with errors.New\"\n\tfmt.Sprintf(\"Hello %s\", s)     // want \"fmt.Sprintf can be replaced with string concatenation\"\n\n\tfmt.Sprint(\"test\", 42)\n\tfmt.Sprint(42, 42)\n\tfmt.Sprintf(\"test\") // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%v\")   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%d\")   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%d\", 42, 42)\n\tfmt.Sprintf(\"%#d\", 42)\n\tfmt.Sprintf(\"value %d\", 42)\n\tfmt.Sprintf(\"val%d\", 42)\n\tfmt.Sprintf(\"%s %v\", \"hello\", \"world\")\n\tfmt.Sprintf(\"%#v\", 42)\n\tfmt.Sprintf(\"%T\", struct{ string }{})\n\tfmt.Sprintf(\"%%v\", 42)\n\tfmt.Sprintf(\"%3d\", 42)\n\tfmt.Sprintf(\"% d\", 42)\n\tfmt.Sprintf(\"%-10d\", 42)\n\tfmt.Sprintf(\"%[2]d %[1]d\\n\", 11, 22)\n\tfmt.Sprintf(\"%[3]*.[2]*[1]f\", 12.0, 2, 6)\n\tfmt.Sprintf(\"%d %d %#[1]x %#x\", 16, 17)\n}\n"
  },
  {
    "path": "pkg/golinters/perfsprint/testdata/perfsprint_cgo.go",
    "content": "//golangcitest:args -Eperfsprint\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tvar (\n\t\ts   string\n\t\terr error\n\t\tb   bool\n\t\ti   int\n\t\ti64 int64\n\t\tui  uint\n\t)\n\n\tfmt.Sprintf(\"%s\", s) // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprint(s)        // want \"fmt.Sprint can be replaced with just using the string\"\n\tfmt.Sprintf(\"%s\", err)\n\tfmt.Sprint(err)\n\tfmt.Sprintf(\"%t\", b)           // want \"fmt.Sprintf can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprint(b)                  // want \"fmt.Sprint can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprintf(\"%d\", i)           // want \"fmt.Sprintf can be replaced with faster strconv.Itoa\"\n\tfmt.Sprint(i)                  // want \"fmt.Sprint can be replaced with faster strconv.Itoa\"\n\tfmt.Sprintf(\"%d\", i64)         // want \"fmt.Sprintf can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprint(i64)                // want \"fmt.Sprint can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprintf(\"%d\", ui)          // want \"fmt.Sprintf can be replaced with faster strconv.FormatUint\"\n\tfmt.Sprint(ui)                 // want \"fmt.Sprint can be replaced with faster strconv.FormatUint\"\n\tfmt.Sprintf(\"%x\", []byte{'a'}) // want \"fmt.Sprintf can be replaced with faster hex.EncodeToString\"\n\tfmt.Errorf(\"hello\")            // want \"fmt.Errorf can be replaced with errors.New\"\n\tfmt.Sprintf(\"Hello %s\", s)     // want \"fmt.Sprintf can be replaced with string concatenation\"\n\n\tfmt.Sprint(\"test\", 42)\n\tfmt.Sprint(42, 42)\n\tfmt.Sprintf(\"test\") // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%v\")   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%d\")   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprintf(\"%d\", 42, 42)\n\tfmt.Sprintf(\"%#d\", 42)\n\tfmt.Sprintf(\"value %d\", 42)\n\tfmt.Sprintf(\"val%d\", 42)\n\tfmt.Sprintf(\"%s %v\", \"hello\", \"world\")\n\tfmt.Sprintf(\"%#v\", 42)\n\tfmt.Sprintf(\"%T\", struct{ string }{})\n\tfmt.Sprintf(\"%%v\", 42)\n\tfmt.Sprintf(\"%3d\", 42)\n\tfmt.Sprintf(\"% d\", 42)\n\tfmt.Sprintf(\"%-10d\", 42)\n\tfmt.Sprintf(\"%[2]d %[1]d\\n\", 11, 22)\n\tfmt.Sprintf(\"%[3]*.[2]*[1]f\", 12.0, 2, 6)\n\tfmt.Sprintf(\"%d %d %#[1]x %#x\", 16, 17)\n}\n"
  },
  {
    "path": "pkg/golinters/perfsprint/testdata/perfsprint_custom.go",
    "content": "//golangcitest:args -Eperfsprint\n//golangcitest:config_path testdata/perfsprint_custom.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n)\n\nfunc TestPerfsprint2() {\n\tvar (\n\t\ts   string\n\t\terr error\n\t\tb   bool\n\t\ti   int\n\t\ti64 int64\n\t\tui  uint\n\t)\n\n\tfmt.Sprintf(\"%s\", s)   // want \"fmt.Sprintf can be replaced with just using the string\"\n\tfmt.Sprint(s)          // want \"fmt.Sprint can be replaced with just using the string\"\n\tfmt.Sprintf(\"%s\", err) // want \"fmt.Sprintf can be replaced with err.Error()\"\n\tfmt.Sprint(err)        // want \"fmt.Sprint can be replaced with err.Error()\"\n\tfmt.Sprintf(\"%t\", b)   // want \"fmt.Sprintf can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprint(b)          // want \"fmt.Sprint can be replaced with faster strconv.FormatBool\"\n\tfmt.Sprintf(\"%d\", i)   // want \"fmt.Sprintf can be replaced with faster strconv.Itoa\"\n\tfmt.Sprint(i)          // want \"fmt.Sprint can be replaced with faster strconv.Itoa\"\n\tfmt.Sprintf(\"%d\", i64) // want \"fmt.Sprintf can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprint(i64)        // want \"fmt.Sprint can be replaced with faster strconv.FormatInt\"\n\tfmt.Sprintf(\"%d\", ui)\n\tfmt.Sprint(ui)\n\tfmt.Sprintf(\"%x\", []byte{'a'}) // want \"fmt.Sprintf can be replaced with faster hex.EncodeToString\"\n\tfmt.Errorf(\"hello\")\n\tfmt.Sprintf(\"Hello %s\", s) // want \"fmt.Sprintf can be replaced with string concatenation\"\n\n\tfmt.Sprint(\"test\", 42)\n\tfmt.Sprint(42, 42)\n\tfmt.Sprintf(\"test\")\n\tfmt.Sprintf(\"%v\")\n\tfmt.Sprintf(\"%d\")\n\tfmt.Sprintf(\"%d\", 42, 42)\n\tfmt.Sprintf(\"%#d\", 42)\n\tfmt.Sprintf(\"value %d\", 42)\n\tfmt.Sprintf(\"val%d\", 42)\n\tfmt.Sprintf(\"%s %v\", \"hello\", \"world\")\n\tfmt.Sprintf(\"%#v\", 42)\n\tfmt.Sprintf(\"%T\", struct{ string }{})\n\tfmt.Sprintf(\"%%v\", 42)\n\tfmt.Sprintf(\"%3d\", 42)\n\tfmt.Sprintf(\"% d\", 42)\n\tfmt.Sprintf(\"%-10d\", 42)\n\tfmt.Sprintf(\"%[2]d %[1]d\\n\", 11, 22)\n\tfmt.Sprintf(\"%[3]*.[2]*[1]f\", 12.0, 2, 6)\n\tfmt.Sprintf(\"%d %d %#[1]x %#x\", 16, 17)\n}\n"
  },
  {
    "path": "pkg/golinters/perfsprint/testdata/perfsprint_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    perfsprint:\n      int-conversion: false\n      err-error: true\n      errorf: false\n      sprintf1: false\n"
  },
  {
    "path": "pkg/golinters/prealloc/prealloc.go",
    "content": "package prealloc\n\nimport (\n\t\"github.com/alexkohler/prealloc/pkg\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.PreallocSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"prealloc\",\n\t\t\tDoc:  \"Find slice declarations that could potentially be pre-allocated\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tpkg.Check(pass, settings.Simple, settings.RangeLoops, settings.ForLoops)\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/prealloc/prealloc_integration_test.go",
    "content": "package prealloc\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/prealloc/testdata/prealloc.go",
    "content": "//golangcitest:args -Eprealloc\npackage testdata\n\nfunc Prealloc(source []int) []int {\n\tvar dest []int // want `Consider preallocating dest with capacity len\\(source\\)`\n\tfor _, v := range source {\n\t\tdest = append(dest, v)\n\t}\n\n\treturn dest\n}\n"
  },
  {
    "path": "pkg/golinters/prealloc/testdata/prealloc_cgo.go",
    "content": "//golangcitest:args -Eprealloc\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(source []int) []int {\n\tvar dest []int // want `Consider preallocating dest with capacity len\\(source\\)`\n\tfor _, v := range source {\n\t\tdest = append(dest, v)\n\t}\n\n\treturn dest\n}\n"
  },
  {
    "path": "pkg/golinters/predeclared/predeclared.go",
    "content": "package predeclared\n\nimport (\n\t\"strings\"\n\n\t\"github.com/nishanths/predeclared/passes/predeclared\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.PredeclaredSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\tpredeclared.IgnoreFlag:    strings.Join(settings.Ignore, \",\"),\n\t\t\tpredeclared.QualifiedFlag: settings.Qualified,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(predeclared.Analyzer).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/predeclared/predeclared_integration_test.go",
    "content": "package predeclared\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/predeclared/testdata/predeclared.go",
    "content": "//golangcitest:args -Epredeclared\npackage testdata\n\nfunc hello() {\n\tvar real int // want \"variable real has same name as predeclared identifier\"\n\ta := A{}\n\tcopy := Clone(a) // want \"variable copy has same name as predeclared identifier\"\n\n\t// suppress any \"declared but not used\" errors\n\t_ = real\n\t_ = a\n\t_ = copy\n}\n\ntype A struct {\n\ttrue bool\n\tfoo  int\n}\n\nfunc Clone(a A) A {\n\treturn A{\n\t\ttrue: a.true,\n\t\tfoo:  a.foo,\n\t}\n}\n\nfunc recover() {} // want \"function recover has same name as predeclared identifier\"\n"
  },
  {
    "path": "pkg/golinters/predeclared/testdata/predeclared_cgo.go",
    "content": "//golangcitest:args -Epredeclared\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tvar real int // want \"variable real has same name as predeclared identifier\"\n\ta := A{}\n\tcopy := Clone(a) // want \"variable copy has same name as predeclared identifier\"\n\n\t// suppress any \"declared but not used\" errors\n\t_ = real\n\t_ = a\n\t_ = copy\n}\n"
  },
  {
    "path": "pkg/golinters/predeclared/testdata/predeclared_custom.go",
    "content": "//golangcitest:args -Epredeclared\n//golangcitest:config_path testdata/predeclared_custom.yml\npackage testdata\n\nfunc hello() {\n\tvar real int\n\ta := A{}\n\tcopy := Clone(a) // want \"variable copy has same name as predeclared identifier\"\n\n\t// suppress any \"declared but not used\" errors\n\t_ = real\n\t_ = a\n\t_ = copy\n}\n\ntype A struct {\n\ttrue bool // want \"field true has same name as predeclared identifier\"\n\tfoo  int\n}\n\nfunc Clone(a A) A {\n\treturn A{\n\t\ttrue: a.true,\n\t\tfoo:  a.foo,\n\t}\n}\n\nfunc recover() {}\n"
  },
  {
    "path": "pkg/golinters/predeclared/testdata/predeclared_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    predeclared:\n      ignore:\n        - real\n        - recover\n      qualified-name: true\n"
  },
  {
    "path": "pkg/golinters/promlinter/promlinter.go",
    "content": "package promlinter\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/yeya24/promlinter\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"promlinter\"\n\nfunc New(settings *config.PromlinterSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\tvar promSettings promlinter.Setting\n\tif settings != nil {\n\t\tpromSettings = promlinter.Setting{\n\t\t\tStrict:            settings.Strict,\n\t\t\tDisabledLintFuncs: settings.DisabledLinters,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Check Prometheus metrics naming via promlint\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues := runPromLinter(pass, promSettings)\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\nfunc runPromLinter(pass *analysis.Pass, promSettings promlinter.Setting) []*goanalysis.Issue {\n\tlintIssues := promlinter.RunLint(pass.Fset, pass.Files, promSettings)\n\n\tif len(lintIssues) == 0 {\n\t\treturn nil\n\t}\n\n\tissues := make([]*goanalysis.Issue, len(lintIssues))\n\tfor k, i := range lintIssues {\n\t\tissue := result.Issue{\n\t\t\tPos:        i.Pos,\n\t\t\tText:       fmt.Sprintf(\"Metric: %s Error: %s\", i.Metric, i.Text),\n\t\t\tFromLinter: linterName,\n\t\t}\n\n\t\tissues[k] = goanalysis.NewIssue(&issue, pass)\n\t}\n\n\treturn issues\n}\n"
  },
  {
    "path": "pkg/golinters/promlinter/promlinter_integration_test.go",
    "content": "package promlinter\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/promlinter/testdata/promlinter.go",
    "content": "//golangcitest:args -Epromlinter\npackage testdata\n\nimport (\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n)\n\nvar (\n\t_ = promauto.NewCounterVec(\n\t\tprometheus.CounterOpts{ // want `Metric: test_metric_name Error: counter metrics should have \"_total\" suffix`\n\t\t\tName: \"test_metric_name\",\n\t\t\tHelp: \"test help text\",\n\t\t}, []string{},\n\t)\n\n\t_ = promauto.NewCounterVec(\n\t\tprometheus.CounterOpts{ // want \"Metric: test_metric_total Error: no help text\"\n\t\t\tName: \"test_metric_total\",\n\t\t}, []string{},\n\t)\n\n\t_ = promauto.NewCounterVec(\n\t\tprometheus.CounterOpts{ // want `Metric: metric_type_in_name_counter_total Error: metric name should not include type 'counter'`\n\t\t\tName: \"metric_type_in_name_counter_total\",\n\t\t\tHelp: \"foo\",\n\t\t}, []string{},\n\t)\n\n\t_ = prometheus.NewHistogram(prometheus.HistogramOpts{ // want `Metric: test_duration_milliseconds Error: use base unit \"seconds\" instead of \"milliseconds\"`\n\t\tName: \"test_duration_milliseconds\",\n\t\tHelp: \"\",\n\t})\n)\n"
  },
  {
    "path": "pkg/golinters/promlinter/testdata/promlinter_cgo.go",
    "content": "//golangcitest:args -Epromlinter\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nvar (\n\t_ = promauto.NewCounterVec(\n\t\tprometheus.CounterOpts{ // want `Metric: test_metric_name Error: counter metrics should have \"_total\" suffix`\n\t\t\tName: \"test_metric_name\",\n\t\t\tHelp: \"test help text\",\n\t\t}, []string{},\n\t)\n\n\t_ = promauto.NewCounterVec(\n\t\tprometheus.CounterOpts{ // want \"Metric: test_metric_total Error: no help text\"\n\t\t\tName: \"test_metric_total\",\n\t\t}, []string{},\n\t)\n\n\t_ = promauto.NewCounterVec(\n\t\tprometheus.CounterOpts{ // want `Metric: metric_type_in_name_counter_total Error: metric name should not include type 'counter'`\n\t\t\tName: \"metric_type_in_name_counter_total\",\n\t\t\tHelp: \"foo\",\n\t\t}, []string{},\n\t)\n\n\t_ = prometheus.NewHistogram(prometheus.HistogramOpts{ // want `Metric: test_duration_milliseconds Error: use base unit \"seconds\" instead of \"milliseconds\"`\n\t\tName: \"test_duration_milliseconds\",\n\t\tHelp: \"\",\n\t})\n)\n"
  },
  {
    "path": "pkg/golinters/protogetter/protogetter.go",
    "content": "package protogetter\n\nimport (\n\t\"github.com/ghostiam/protogetter\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.ProtoGetterSettings) *goanalysis.Linter {\n\tvar cfg protogetter.Config\n\n\tif settings != nil {\n\t\tcfg = protogetter.Config{\n\t\t\tSkipGeneratedBy:         settings.SkipGeneratedBy,\n\t\t\tSkipFiles:               settings.SkipFiles,\n\t\t\tSkipAnyGenerated:        settings.SkipAnyGenerated,\n\t\t\tReplaceFirstArgInAppend: settings.ReplaceFirstArgInAppend,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(protogetter.NewAnalyzer(&cfg)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/protogetter/protogetter_integration_test.go",
    "content": "package protogetter\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/go.mod",
    "content": "module protogetter\n\ngo 1.25.0\n\nrequire (\n\tgoogle.golang.org/grpc v1.79.1\n\tgoogle.golang.org/protobuf v1.36.11\n)\n\nrequire (\n\tgolang.org/x/net v0.48.0 // indirect\n\tgolang.org/x/sys v0.39.0 // indirect\n\tgolang.org/x/text v0.32.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect\n)\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/go.sum",
    "content": "github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngo.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\ngo.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=\ngo.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=\ngo.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=\ngo.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=\ngo.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=\ngo.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=\ngo.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=\ngo.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=\ngo.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=\ngo.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=\ngo.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=\ngolang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=\ngolang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=\ngolang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=\ngolang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=\ngolang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=\ngonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=\ngonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=\ngoogle.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY=\ngoogle.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/proto/test.go",
    "content": "package proto\n\nfunc (x *Embedded) CustomMethod() interface{} {\n\treturn nil\n}\n\ntype Other struct {\n}\n\nfunc (x *Other) MyMethod(certs *Test) *Embedded {\n\treturn nil\n}\n\nfunc (x *Test) Equal(v *Test) bool {\n\treturn false\n}\n\nfunc (x *Embedded) SetS(s string) {\n\tx.S = s\n}\n\nfunc (x *Embedded) SetMap(_ map[string]string) {\n}\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/proto/test.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.31.0\n// \tprotoc        v4.23.4\n// source: test.proto\n\npackage proto\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Test struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tD                 float64     `protobuf:\"fixed64,1,opt,name=d,proto3\" json:\"d,omitempty\"`\n\tF                 float32     `protobuf:\"fixed32,2,opt,name=f,proto3\" json:\"f,omitempty\"`\n\tI32               int32       `protobuf:\"varint,3,opt,name=i32,proto3\" json:\"i32,omitempty\"`\n\tI64               int64       `protobuf:\"varint,4,opt,name=i64,proto3\" json:\"i64,omitempty\"`\n\tU32               uint32      `protobuf:\"varint,5,opt,name=u32,proto3\" json:\"u32,omitempty\"`\n\tU64               uint64      `protobuf:\"varint,6,opt,name=u64,proto3\" json:\"u64,omitempty\"`\n\tT                 bool        `protobuf:\"varint,7,opt,name=t,proto3\" json:\"t,omitempty\"`\n\tB                 []byte      `protobuf:\"bytes,8,opt,name=b,proto3\" json:\"b,omitempty\"`\n\tS                 string      `protobuf:\"bytes,9,opt,name=s,proto3\" json:\"s,omitempty\"`\n\tEmbedded          *Embedded   `protobuf:\"bytes,10,opt,name=embedded,proto3\" json:\"embedded,omitempty\"`\n\tRepeatedEmbeddeds []*Embedded `protobuf:\"bytes,11,rep,name=repeated_embeddeds,json=repeatedEmbeddeds,proto3\" json:\"repeated_embeddeds,omitempty\"`\n}\n\nfunc (x *Test) Reset() {\n\t*x = Test{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_test_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Test) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Test) ProtoMessage() {}\n\nfunc (x *Test) ProtoReflect() protoreflect.Message {\n\tmi := &file_test_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Test.ProtoReflect.Descriptor instead.\nfunc (*Test) Descriptor() ([]byte, []int) {\n\treturn file_test_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Test) GetD() float64 {\n\tif x != nil {\n\t\treturn x.D\n\t}\n\treturn 0\n}\n\nfunc (x *Test) GetF() float32 {\n\tif x != nil {\n\t\treturn x.F\n\t}\n\treturn 0\n}\n\nfunc (x *Test) GetI32() int32 {\n\tif x != nil {\n\t\treturn x.I32\n\t}\n\treturn 0\n}\n\nfunc (x *Test) GetI64() int64 {\n\tif x != nil {\n\t\treturn x.I64\n\t}\n\treturn 0\n}\n\nfunc (x *Test) GetU32() uint32 {\n\tif x != nil {\n\t\treturn x.U32\n\t}\n\treturn 0\n}\n\nfunc (x *Test) GetU64() uint64 {\n\tif x != nil {\n\t\treturn x.U64\n\t}\n\treturn 0\n}\n\nfunc (x *Test) GetT() bool {\n\tif x != nil {\n\t\treturn x.T\n\t}\n\treturn false\n}\n\nfunc (x *Test) GetB() []byte {\n\tif x != nil {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\nfunc (x *Test) GetS() string {\n\tif x != nil {\n\t\treturn x.S\n\t}\n\treturn \"\"\n}\n\nfunc (x *Test) GetEmbedded() *Embedded {\n\tif x != nil {\n\t\treturn x.Embedded\n\t}\n\treturn nil\n}\n\nfunc (x *Test) GetRepeatedEmbeddeds() []*Embedded {\n\tif x != nil {\n\t\treturn x.RepeatedEmbeddeds\n\t}\n\treturn nil\n}\n\ntype Embedded struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tS        string    `protobuf:\"bytes,1,opt,name=s,proto3\" json:\"s,omitempty\"`\n\tEmbedded *Embedded `protobuf:\"bytes,2,opt,name=embedded,proto3\" json:\"embedded,omitempty\"`\n}\n\nfunc (x *Embedded) Reset() {\n\t*x = Embedded{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_test_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Embedded) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Embedded) ProtoMessage() {}\n\nfunc (x *Embedded) ProtoReflect() protoreflect.Message {\n\tmi := &file_test_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Embedded.ProtoReflect.Descriptor instead.\nfunc (*Embedded) Descriptor() ([]byte, []int) {\n\treturn file_test_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Embedded) GetS() string {\n\tif x != nil {\n\t\treturn x.S\n\t}\n\treturn \"\"\n}\n\nfunc (x *Embedded) GetEmbedded() *Embedded {\n\tif x != nil {\n\t\treturn x.Embedded\n\t}\n\treturn nil\n}\n\nvar File_test_proto protoreflect.FileDescriptor\n\nvar file_test_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf5, 0x01, 0x0a,\n\t0x04, 0x54, 0x65, 0x73, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01,\n\t0x52, 0x01, 0x64, 0x12, 0x0c, 0x0a, 0x01, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01,\n\t0x66, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03,\n\t0x69, 0x33, 0x32, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x36, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x03, 0x69, 0x36, 0x34, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x33, 0x32, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x0d, 0x52, 0x03, 0x75, 0x33, 0x32, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x36, 0x34, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x75, 0x36, 0x34, 0x12, 0x0c, 0x0a, 0x01, 0x74, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x01, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x62, 0x18, 0x08, 0x20, 0x01,\n\t0x28, 0x0c, 0x52, 0x01, 0x62, 0x12, 0x0c, 0x0a, 0x01, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x01, 0x73, 0x12, 0x25, 0x0a, 0x08, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x18,\n\t0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,\n\t0x52, 0x08, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x12, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x73,\n\t0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65,\n\t0x64, 0x52, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6d, 0x62, 0x65, 0x64,\n\t0x64, 0x65, 0x64, 0x73, 0x22, 0x3f, 0x0a, 0x08, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,\n\t0x12, 0x0c, 0x0a, 0x01, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x73, 0x12, 0x25,\n\t0x0a, 0x08, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x09, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x52, 0x08, 0x65, 0x6d, 0x62,\n\t0x65, 0x64, 0x64, 0x65, 0x64, 0x32, 0x1f, 0x0a, 0x07, 0x54, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67,\n\t0x12, 0x14, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x05, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x1a,\n\t0x05, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x61, 0x6d, 0x2f, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x74, 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61,\n\t0x74, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_test_proto_rawDescOnce sync.Once\n\tfile_test_proto_rawDescData = file_test_proto_rawDesc\n)\n\nfunc file_test_proto_rawDescGZIP() []byte {\n\tfile_test_proto_rawDescOnce.Do(func() {\n\t\tfile_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_proto_rawDescData)\n\t})\n\treturn file_test_proto_rawDescData\n}\n\nvar file_test_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_test_proto_goTypes = []interface{}{\n\t(*Test)(nil),     // 0: Test\n\t(*Embedded)(nil), // 1: Embedded\n}\nvar file_test_proto_depIdxs = []int32{\n\t1, // 0: Test.embedded:type_name -> Embedded\n\t1, // 1: Test.repeated_embeddeds:type_name -> Embedded\n\t1, // 2: Embedded.embedded:type_name -> Embedded\n\t0, // 3: Testing.call:input_type -> Test\n\t0, // 4: Testing.call:output_type -> Test\n\t4, // [4:5] is the sub-list for method output_type\n\t3, // [3:4] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_test_proto_init() }\nfunc file_test_proto_init() {\n\tif File_test_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Test); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Embedded); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_test_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_test_proto_goTypes,\n\t\tDependencyIndexes: file_test_proto_depIdxs,\n\t\tMessageInfos:      file_test_proto_msgTypes,\n\t}.Build()\n\tFile_test_proto = out.File\n\tfile_test_proto_rawDesc = nil\n\tfile_test_proto_goTypes = nil\n\tfile_test_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/proto/test.proto",
    "content": "syntax = \"proto3\";\n\noption go_package = \"github.com/ghostiam/protogetter/testdata/proto\";\n\nmessage Test {\n  double d = 1;\n  float f = 2;\n  int32 i32 = 3;\n  int64 i64 = 4;\n  uint32 u32 = 5;\n  uint64 u64 = 6;\n  bool t = 7;\n  bytes b = 8;\n  string s = 9;\n  Embedded embedded = 10;\n  repeated Embedded repeated_embeddeds = 11;\n}\n\nmessage Embedded {\n  string s = 1;\n  Embedded embedded = 2;\n}\n\nservice Testing {\n  rpc call(Test) returns (Test);\n}\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/proto/test_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             v4.23.4\n// source: test.proto\n\npackage proto\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tTesting_Call_FullMethodName = \"/Testing/call\"\n)\n\n// TestingClient is the client API for Testing service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype TestingClient interface {\n\tCall(ctx context.Context, in *Test, opts ...grpc.CallOption) (*Test, error)\n}\n\ntype testingClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewTestingClient(cc grpc.ClientConnInterface) TestingClient {\n\treturn &testingClient{cc}\n}\n\nfunc (c *testingClient) Call(ctx context.Context, in *Test, opts ...grpc.CallOption) (*Test, error) {\n\tout := new(Test)\n\terr := c.cc.Invoke(ctx, Testing_Call_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// TestingServer is the server API for Testing service.\n// All implementations must embed UnimplementedTestingServer\n// for forward compatibility\ntype TestingServer interface {\n\tCall(context.Context, *Test) (*Test, error)\n\tmustEmbedUnimplementedTestingServer()\n}\n\n// UnimplementedTestingServer must be embedded to have forward compatible implementations.\ntype UnimplementedTestingServer struct {\n}\n\nfunc (UnimplementedTestingServer) Call(context.Context, *Test) (*Test, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Call not implemented\")\n}\nfunc (UnimplementedTestingServer) mustEmbedUnimplementedTestingServer() {}\n\n// UnsafeTestingServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to TestingServer will\n// result in compilation errors.\ntype UnsafeTestingServer interface {\n\tmustEmbedUnimplementedTestingServer()\n}\n\nfunc RegisterTestingServer(s grpc.ServiceRegistrar, srv TestingServer) {\n\ts.RegisterService(&Testing_ServiceDesc, srv)\n}\n\nfunc _Testing_Call_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(Test)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(TestingServer).Call(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: Testing_Call_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(TestingServer).Call(ctx, req.(*Test))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// Testing_ServiceDesc is the grpc.ServiceDesc for Testing service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar Testing_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"Testing\",\n\tHandlerType: (*TestingServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"call\",\n\t\t\tHandler:    _Testing_Call_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"test.proto\",\n}\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/protogetter.go",
    "content": "//golangcitest:args -Eprotogetter\npackage protogetter\n\nimport (\n\t\"fmt\"\n\n\t\"protogetter/proto\"\n)\n\ntype Test struct {\n\tEmbedded *proto.Embedded\n}\n\nfunc testInvalid(t *proto.Test) {\n\tfunc(...interface{}) {}(t.B, t.D)      // want `avoid direct access to proto field t\\.B, use t\\.GetB\\(\\) instead`\n\tfunc(...interface{}) {}(t.GetB(), t.D) // want `avoid direct access to proto field t\\.D, use t\\.GetD\\(\\) instead`\n\tfunc(...interface{}) {}(t.B, t.GetD()) // want `avoid direct access to proto field t\\.B, use t\\.GetB\\(\\) instead`\n\n\t_ = t.D                                             // want `avoid direct access to proto field t\\.D, use t\\.GetD\\(\\) instead`\n\t_ = t.F                                             // want `avoid direct access to proto field t\\.F, use t\\.GetF\\(\\) instead`\n\t_ = t.I32                                           // want `avoid direct access to proto field t\\.I32, use t\\.GetI32\\(\\) instead`\n\t_ = t.I64                                           // want `avoid direct access to proto field t\\.I64, use t\\.GetI64\\(\\) instead`\n\t_ = t.U32                                           // want `avoid direct access to proto field t\\.U32, use t\\.GetU32\\(\\) instead`\n\t_ = t.U64                                           // want `avoid direct access to proto field t\\.U64, use t\\.GetU64\\(\\) instead`\n\t_ = t.T                                             // want `avoid direct access to proto field t\\.T, use t\\.GetT\\(\\) instead`\n\t_ = t.B                                             // want `avoid direct access to proto field t\\.B, use t\\.GetB\\(\\) instead`\n\t_ = t.S                                             // want `avoid direct access to proto field t\\.S, use t\\.GetS\\(\\) instead`\n\t_ = t.Embedded                                      // want `avoid direct access to proto field t\\.Embedded, use t\\.GetEmbedded\\(\\) instead`\n\t_ = t.Embedded.S                                    // want `avoid direct access to proto field t\\.Embedded\\.S, use t\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = t.GetEmbedded().S                               // want `avoid direct access to proto field t\\.GetEmbedded\\(\\)\\.S, use t\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = t.Embedded.Embedded                             // want `avoid direct access to proto field t\\.Embedded\\.Embedded, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\) instead`\n\t_ = t.GetEmbedded().Embedded                        // want `avoid direct access to proto field t\\.GetEmbedded\\(\\)\\.Embedded, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\) instead`\n\t_ = t.Embedded.Embedded.S                           // want `avoid direct access to proto field t\\.Embedded\\.Embedded\\.S, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.GetEmbedded().GetEmbedded().S                 // want `avoid direct access to proto field t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\)\\.S, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds                             // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0]                          // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0].S                        // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[0\\]\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetS\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[0].S                   // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetS\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0].Embedded                 // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[0\\]\\.Embedded, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetEmbedded\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[0].Embedded            // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.Embedded, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetEmbedded\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0].Embedded.S               // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[0\\]\\.Embedded\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\].GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[0].GetEmbedded().S     // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\].GetEmbedded\\(\\).S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\].GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[t.I64].Embedded.S           // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[t.I64\\]\\.Embedded\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[t\\.GetI64\\(\\)\\].GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[t.I64].GetEmbedded().S // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[t\\.I64\\]\\.GetEmbedded\\(\\)\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[t\\.GetI64\\(\\)\\]\\.GetEmbedded\\(\\).GetS\\(\\) instead`\n\n\tvar many []*proto.Test\n\tmanyIndex := 42\n\n\t_ = many[0].T                   // want `avoid direct access to proto field many\\[0\\]\\.T, use many\\[0\\]\\.GetT\\(\\) instead`\n\t_ = many[1].Embedded.S          // want `avoid direct access to proto field many\\[1\\]\\.Embedded\\.S, use many\\[1\\]\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = many[2].GetEmbedded().S     // want `avoid direct access to proto field many\\[2\\]\\.GetEmbedded\\(\\)\\.S, use many\\[2\\].GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = many[3].Embedded.Embedded.S // want `avoid direct access to proto field many\\[3\\]\\.Embedded\\.Embedded\\.S, use many\\[3\\].GetEmbedded\\(\\)\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = many[manyIndex].S           // want `avoid direct access to proto field many\\[manyIndex\\]\\.S, use many\\[manyIndex\\]\\.GetS\\(\\) instead`\n\n\ttest := many[0].Embedded.S == \"\" || t.Embedded.CustomMethod() == nil || t.S == \"\" || t.Embedded == nil // want `avoid direct access to proto field many\\[0\\]\\.Embedded\\.S, use many\\[0\\]\\.GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = test\n\n\tother := proto.Other{}\n\t_ = other.MyMethod(nil).S // want `avoid direct access to proto field other\\.MyMethod\\(nil\\)\\.S, use other\\.MyMethod\\(nil\\)\\.GetS\\(\\) instead`\n\n\tems := t.RepeatedEmbeddeds // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = ems[len(ems)-1].S      // want `avoid direct access to proto field ems\\[len\\(ems\\)-1\\]\\.S, use ems\\[len\\(ems\\)-1\\]\\.GetS\\(\\) instead`\n\n\tch := make(chan string)\n\tch <- t.S // want `avoid direct access to proto field t\\.S, use t\\.GetS\\(\\) instead`\n\n\tfor _, v := range t.RepeatedEmbeddeds { // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t\t_ = v\n\t}\n\n\tfn := func(...interface{}) bool { return false }\n\tfn((*proto.Test)(nil).S) // want `avoid direct access to proto field \\(\\*proto\\.Test\\)\\(nil\\)\\.S, use \\(\\*proto\\.Test\\)\\(nil\\)\\.GetS\\(\\) instead`\n\n\tvar ptrs *[]proto.Test\n\t_ = (*ptrs)[42].RepeatedEmbeddeds    // want `avoid direct access to proto field \\(\\*ptrs\\)\\[42\\]\\.RepeatedEmbeddeds, use \\(\\*ptrs\\)\\[42\\].GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = (*ptrs)[t.I64].RepeatedEmbeddeds // want `avoid direct access to proto field \\(\\*ptrs\\)\\[t\\.I64\\]\\.RepeatedEmbeddeds, use \\(\\*ptrs\\)\\[t\\.GetI64\\(\\)\\].GetRepeatedEmbeddeds\\(\\) instead`\n\n\tvar anyType interface{}\n\t_ = anyType.(*proto.Test).S // want `avoid direct access to proto field anyType\\.\\(\\*proto\\.Test\\)\\.S, use anyType\\.\\(\\*proto\\.Test\\)\\.GetS\\(\\) instead`\n\n\tt.Embedded.SetS(\"test\")                              // want `avoid direct access to proto field t\\.Embedded\\.SetS\\(\"test\"\\), use t\\.GetEmbedded\\(\\)\\.SetS\\(\"test\"\\) instead`\n\tt.Embedded.SetMap(map[string]string{\"test\": \"test\"}) // want `avoid direct access to proto field t\\.Embedded\\.SetMap\\(map\\[string\\]string{\"test\": \"test\"}\\), use t\\.GetEmbedded\\(\\)\\.SetMap\\(map\\[string\\]string{\"test\": \"test\"}\\) instead`\n}\n\nfunc testValid(t *proto.Test) {\n\tfunc(...interface{}) {}(t.GetB(), t.GetD())\n\tfunc(...interface{}) {}(&t.B, &t.D)\n\n\t_, t.T = true, true\n\t_, t.T, _ = true, true, false\n\t_, _, t.T = true, true, false\n\tt.T, _ = true, true\n\tt.D = 2\n\tt.I32++\n\tt.I32 += 2\n\n\tfmt.Scanf(\"Test\", &t.S, &t.B, &t.T)\n\n\tt.D = 1.0\n\tt.F = 1.0\n\tt.I32 = 1\n\tt.I64 = 1\n\tt.U32 = 1\n\tt.U64 = 1\n\tt.T = true\n\tt.B = []byte{1}\n\tt.S = \"1\"\n\tt.Embedded = &proto.Embedded{}\n\tt.Embedded.S = \"1\"\n\tt.GetEmbedded().S = \"1\"\n\tt.Embedded.Embedded = &proto.Embedded{}\n\tt.GetEmbedded().Embedded = &proto.Embedded{}\n\tt.Embedded.Embedded.S = \"1\"\n\tt.GetEmbedded().GetEmbedded().S = \"1\"\n\tt.RepeatedEmbeddeds = []*proto.Embedded{{S: \"1\"}}\n\n\t_ = t.GetD()\n\t_ = t.GetF()\n\t_ = t.GetI32()\n\t_ = t.GetI64()\n\t_ = t.GetU32()\n\t_ = t.GetU64()\n\t_ = t.GetT()\n\t_ = t.GetB()\n\t_ = t.GetS()\n\t_ = t.GetEmbedded()\n\t_ = t.GetEmbedded().GetS()\n\t_ = t.GetEmbedded().GetEmbedded()\n\t_ = t.GetEmbedded().GetEmbedded().GetS()\n\t_ = t.GetRepeatedEmbeddeds()\n\t_ = t.GetRepeatedEmbeddeds()[0]\n\t_ = t.GetRepeatedEmbeddeds()[0].GetS()\n\t_ = t.GetRepeatedEmbeddeds()[0].GetEmbedded()\n\t_ = t.GetRepeatedEmbeddeds()[0].GetEmbedded().GetS()\n\n\tother := proto.Other{}\n\tother.MyMethod(nil).CustomMethod()\n\tother.MyMethod(nil).GetS()\n\n\tvar tt Test\n\t_ = tt.Embedded.GetS()\n\t_ = tt.Embedded.GetEmbedded().GetS()\n\n\tems := t.GetRepeatedEmbeddeds()\n\t_ = ems[len(ems)-1].GetS()\n\n\tch := make(chan string)\n\tch <- t.GetS()\n\n\tt.Equal(&proto.Test{S: \"test\", I64: 42})\n}\n"
  },
  {
    "path": "pkg/golinters/protogetter/testdata/protogetter_cgo.go",
    "content": "//golangcitest:args -Eprotogetter\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n\n\t\"protogetter/proto\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype Test struct {\n\tEmbedded *proto.Embedded\n}\n\nfunc _(t *proto.Test) {\n\tfunc(...interface{}) {}(t.B, t.D)      // want `avoid direct access to proto field t\\.B, use t\\.GetB\\(\\) instead`\n\tfunc(...interface{}) {}(t.GetB(), t.D) // want `avoid direct access to proto field t\\.D, use t\\.GetD\\(\\) instead`\n\tfunc(...interface{}) {}(t.B, t.GetD()) // want `avoid direct access to proto field t\\.B, use t\\.GetB\\(\\) instead`\n\n\t_ = t.D                                             // want `avoid direct access to proto field t\\.D, use t\\.GetD\\(\\) instead`\n\t_ = t.F                                             // want `avoid direct access to proto field t\\.F, use t\\.GetF\\(\\) instead`\n\t_ = t.I32                                           // want `avoid direct access to proto field t\\.I32, use t\\.GetI32\\(\\) instead`\n\t_ = t.I64                                           // want `avoid direct access to proto field t\\.I64, use t\\.GetI64\\(\\) instead`\n\t_ = t.U32                                           // want `avoid direct access to proto field t\\.U32, use t\\.GetU32\\(\\) instead`\n\t_ = t.U64                                           // want `avoid direct access to proto field t\\.U64, use t\\.GetU64\\(\\) instead`\n\t_ = t.T                                             // want `avoid direct access to proto field t\\.T, use t\\.GetT\\(\\) instead`\n\t_ = t.B                                             // want `avoid direct access to proto field t\\.B, use t\\.GetB\\(\\) instead`\n\t_ = t.S                                             // want `avoid direct access to proto field t\\.S, use t\\.GetS\\(\\) instead`\n\t_ = t.Embedded                                      // want `avoid direct access to proto field t\\.Embedded, use t\\.GetEmbedded\\(\\) instead`\n\t_ = t.Embedded.S                                    // want `avoid direct access to proto field t\\.Embedded\\.S, use t\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = t.GetEmbedded().S                               // want `avoid direct access to proto field t\\.GetEmbedded\\(\\)\\.S, use t\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = t.Embedded.Embedded                             // want `avoid direct access to proto field t\\.Embedded\\.Embedded, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\) instead`\n\t_ = t.GetEmbedded().Embedded                        // want `avoid direct access to proto field t\\.GetEmbedded\\(\\)\\.Embedded, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\) instead`\n\t_ = t.Embedded.Embedded.S                           // want `avoid direct access to proto field t\\.Embedded\\.Embedded\\.S, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.GetEmbedded().GetEmbedded().S                 // want `avoid direct access to proto field t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\)\\.S, use t\\.GetEmbedded\\(\\)\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds                             // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0]                          // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0].S                        // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[0\\]\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetS\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[0].S                   // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetS\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0].Embedded                 // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[0\\]\\.Embedded, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetEmbedded\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[0].Embedded            // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.Embedded, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\]\\.GetEmbedded\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[0].Embedded.S               // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[0\\]\\.Embedded\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\].GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[0].GetEmbedded().S     // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\].GetEmbedded\\(\\).S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[0\\].GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.RepeatedEmbeddeds[t.I64].Embedded.S           // want `avoid direct access to proto field t\\.RepeatedEmbeddeds\\[t.I64\\]\\.Embedded\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[t\\.GetI64\\(\\)\\].GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = t.GetRepeatedEmbeddeds()[t.I64].GetEmbedded().S // want `avoid direct access to proto field t\\.GetRepeatedEmbeddeds\\(\\)\\[t\\.I64\\]\\.GetEmbedded\\(\\)\\.S, use t\\.GetRepeatedEmbeddeds\\(\\)\\[t\\.GetI64\\(\\)\\]\\.GetEmbedded\\(\\).GetS\\(\\) instead`\n\n\tvar many []*proto.Test\n\tmanyIndex := 42\n\n\t_ = many[0].T                   // want `avoid direct access to proto field many\\[0\\]\\.T, use many\\[0\\]\\.GetT\\(\\) instead`\n\t_ = many[1].Embedded.S          // want `avoid direct access to proto field many\\[1\\]\\.Embedded\\.S, use many\\[1\\]\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = many[2].GetEmbedded().S     // want `avoid direct access to proto field many\\[2\\]\\.GetEmbedded\\(\\)\\.S, use many\\[2\\].GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = many[3].Embedded.Embedded.S // want `avoid direct access to proto field many\\[3\\]\\.Embedded\\.Embedded\\.S, use many\\[3\\].GetEmbedded\\(\\)\\.GetEmbedded\\(\\)\\.GetS\\(\\) instead`\n\t_ = many[manyIndex].S           // want `avoid direct access to proto field many\\[manyIndex\\]\\.S, use many\\[manyIndex\\]\\.GetS\\(\\) instead`\n\n\ttest := many[0].Embedded.S == \"\" || t.Embedded.CustomMethod() == nil || t.S == \"\" || t.Embedded == nil // want `avoid direct access to proto field many\\[0\\]\\.Embedded\\.S, use many\\[0\\]\\.GetEmbedded\\(\\).GetS\\(\\) instead`\n\t_ = test\n\n\tother := proto.Other{}\n\t_ = other.MyMethod(nil).S // want `avoid direct access to proto field other\\.MyMethod\\(nil\\)\\.S, use other\\.MyMethod\\(nil\\)\\.GetS\\(\\) instead`\n\n\tems := t.RepeatedEmbeddeds // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = ems[len(ems)-1].S      // want `avoid direct access to proto field ems\\[len\\(ems\\)-1\\]\\.S, use ems\\[len\\(ems\\)-1\\]\\.GetS\\(\\) instead`\n\n\tch := make(chan string)\n\tch <- t.S // want `avoid direct access to proto field t\\.S, use t\\.GetS\\(\\) instead`\n\n\tfor _, v := range t.RepeatedEmbeddeds { // want `avoid direct access to proto field t\\.RepeatedEmbeddeds, use t\\.GetRepeatedEmbeddeds\\(\\) instead`\n\t\t_ = v\n\t}\n\n\tfn := func(...interface{}) bool { return false }\n\tfn((*proto.Test)(nil).S) // want `avoid direct access to proto field \\(\\*proto\\.Test\\)\\(nil\\)\\.S, use \\(\\*proto\\.Test\\)\\(nil\\)\\.GetS\\(\\) instead`\n\n\tvar ptrs *[]proto.Test\n\t_ = (*ptrs)[42].RepeatedEmbeddeds    // want `avoid direct access to proto field \\(\\*ptrs\\)\\[42\\]\\.RepeatedEmbeddeds, use \\(\\*ptrs\\)\\[42\\].GetRepeatedEmbeddeds\\(\\) instead`\n\t_ = (*ptrs)[t.I64].RepeatedEmbeddeds // want `avoid direct access to proto field \\(\\*ptrs\\)\\[t\\.I64\\]\\.RepeatedEmbeddeds, use \\(\\*ptrs\\)\\[t\\.GetI64\\(\\)\\].GetRepeatedEmbeddeds\\(\\) instead`\n\n\tvar anyType interface{}\n\t_ = anyType.(*proto.Test).S // want `avoid direct access to proto field anyType\\.\\(\\*proto\\.Test\\)\\.S, use anyType\\.\\(\\*proto\\.Test\\)\\.GetS\\(\\) instead`\n\n\tt.Embedded.SetS(\"test\")                              // want `avoid direct access to proto field t\\.Embedded\\.SetS\\(\"test\"\\), use t\\.GetEmbedded\\(\\)\\.SetS\\(\"test\"\\) instead`\n\tt.Embedded.SetMap(map[string]string{\"test\": \"test\"}) // want `avoid direct access to proto field t\\.Embedded\\.SetMap\\(map\\[string\\]string{\"test\": \"test\"}\\), use t\\.GetEmbedded\\(\\)\\.SetMap\\(map\\[string\\]string{\"test\": \"test\"}\\) instead`\n}\n"
  },
  {
    "path": "pkg/golinters/reassign/reassign.go",
    "content": "package reassign\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/curioswitch/go-reassign\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.ReassignSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil && len(settings.Patterns) > 0 {\n\t\tcfg = map[string]any{\n\t\t\treassign.FlagPattern: fmt.Sprintf(\"^(%s)$\", strings.Join(settings.Patterns, \"|\")),\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(reassign.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/reassign/reassign_integration_test.go",
    "content": "package reassign\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/reassign/testdata/reassign.go",
    "content": "//golangcitest:args -Ereassign\npackage testdata\n\nimport (\n\t\"io\"\n\t\"net/http\"\n)\n\nfunc reassignTest() {\n\thttp.DefaultClient = nil\n\thttp.DefaultTransport = nil\n\tio.EOF = nil // want `reassigning variable EOF in other package io`\n}\n"
  },
  {
    "path": "pkg/golinters/reassign/testdata/reassign_cgo.go",
    "content": "//golangcitest:args -Ereassign\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"io\"\n\t\"net/http\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\thttp.DefaultClient = nil\n\thttp.DefaultTransport = nil\n\tio.EOF = nil // want `reassigning variable EOF in other package io`\n}\n"
  },
  {
    "path": "pkg/golinters/reassign/testdata/reassign_patterns.go",
    "content": "//golangcitest:args -Ereassign\n//golangcitest:config_path testdata/reassign_patterns.yml\npackage testdata\n\nimport (\n\t\"io\"\n\t\"net/http\"\n)\n\nfunc reassignTestPatterns() {\n\thttp.DefaultClient = nil    // want `reassigning variable DefaultClient in other package http`\n\thttp.DefaultTransport = nil // want `reassigning variable DefaultTransport in other package http`\n\tio.EOF = nil\n}\n"
  },
  {
    "path": "pkg/golinters/reassign/testdata/reassign_patterns.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    reassign:\n      patterns:\n        - DefaultClient\n        - DefaultTransport\n"
  },
  {
    "path": "pkg/golinters/recvcheck/recvcheck.go",
    "content": "package recvcheck\n\nimport (\n\t\"github.com/raeperd/recvcheck\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.RecvcheckSettings) *goanalysis.Linter {\n\tvar cfg recvcheck.Settings\n\n\tif settings != nil {\n\t\tcfg.DisableBuiltin = settings.DisableBuiltin\n\t\tcfg.Exclusions = settings.Exclusions\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(recvcheck.NewAnalyzer(cfg)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/recvcheck/recvcheck_integration_test.go",
    "content": "package recvcheck_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/recvcheck/testdata/recvcheck.go",
    "content": "//golangcitest:args -Erecvcheck\npackage testdata\n\nimport \"fmt\"\n\ntype Bar struct{} // want `the methods of \"Bar\" use pointer receiver and non-pointer receiver.`\n\nfunc (b Bar) A() {\n\tfmt.Println(\"A\")\n}\n\nfunc (b *Bar) B() {\n\tfmt.Println(\"B\")\n}\n"
  },
  {
    "path": "pkg/golinters/recvcheck/testdata/recvcheck_cgo.go",
    "content": "//golangcitest:args -Erecvcheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype Bar struct{} // want `the methods of \"Bar\" use pointer receiver and non-pointer receiver.`\n\nfunc (b Bar) A() {\n\tfmt.Println(\"A\")\n}\n\nfunc (b *Bar) B() {\n\tfmt.Println(\"B\")\n}\n"
  },
  {
    "path": "pkg/golinters/revive/revive.go",
    "content": "package revive\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"fmt\"\n\t\"go/token\"\n\t\"os\"\n\t\"reflect\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/BurntSushi/toml\"\n\thcversion \"github.com/hashicorp/go-version\"\n\treviveConfig \"github.com/mgechev/revive/config\"\n\t\"github.com/mgechev/revive/lint\"\n\t\"github.com/mgechev/revive/rule\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"revive\"\n\nvar (\n\tdebugf  = logutils.Debug(logutils.DebugKeyRevive)\n\tisDebug = logutils.HaveDebugTag(logutils.DebugKeyRevive)\n)\n\nfunc New(settings *config.ReviveSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\tanalyzer := &analysis.Analyzer{\n\t\tName: linterName,\n\t\tDoc:  \"Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint.\",\n\t\tRun:  goanalysis.DummyRun,\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer).\n\t\tWithContextSetter(func(lintCtx *linter.Context) {\n\t\t\tw, err := newWrapper(settings)\n\t\t\tif err != nil {\n\t\t\t\tlintCtx.Log.Errorf(\"setup revive: %v\", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tanalyzer.Run = func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues, err := w.run(pass)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\ntype wrapper struct {\n\trevive       lint.Linter\n\tlintingRules []lint.Rule\n\tconf         *lint.Config\n}\n\nfunc newWrapper(settings *config.ReviveSettings) (*wrapper, error) {\n\tconf, err := getConfig(settings)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdisplayRules(conf)\n\n\tconf.GoVersion, err = hcversion.NewVersion(settings.Go)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tlintingRules, err := reviveConfig.GetLintingRules(conf, []lint.Rule{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &wrapper{\n\t\trevive:       lint.New(os.ReadFile, settings.MaxOpenFiles),\n\t\tlintingRules: lintingRules,\n\t\tconf:         conf,\n\t}, nil\n}\n\nfunc (w *wrapper) run(pass *analysis.Pass) ([]*goanalysis.Issue, error) {\n\tpackages := [][]string{internal.GetGoFileNames(pass)}\n\n\tfailures, err := w.revive.Lint(packages, w.lintingRules, *w.conf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar issues []*goanalysis.Issue\n\tfor failure := range failures {\n\t\tif failure.Confidence < w.conf.Confidence {\n\t\t\tcontinue\n\t\t}\n\n\t\tissues = append(issues, w.toIssue(pass, &failure))\n\t}\n\n\treturn issues, nil\n}\n\nfunc (w *wrapper) toIssue(pass *analysis.Pass, failure *lint.Failure) *goanalysis.Issue {\n\tlineRangeTo := failure.Position.End.Line\n\tif failure.RuleName == (&rule.ExportedRule{}).Name() {\n\t\tlineRangeTo = failure.Position.Start.Line\n\t}\n\n\tissue := &result.Issue{\n\t\tSeverity: string(severity(w.conf, failure)),\n\t\tText:     fmt.Sprintf(\"%s: %s\", failure.RuleName, failure.Failure),\n\t\tPos: token.Position{\n\t\t\tFilename: failure.Position.Start.Filename,\n\t\t\tLine:     failure.Position.Start.Line,\n\t\t\tOffset:   failure.Position.Start.Offset,\n\t\t\tColumn:   failure.Position.Start.Column,\n\t\t},\n\t\tLineRange: &result.Range{\n\t\t\tFrom: failure.Position.Start.Line,\n\t\t\tTo:   lineRangeTo,\n\t\t},\n\t\tFromLinter: linterName,\n\t}\n\n\tif failure.ReplacementLine != \"\" {\n\t\tf := pass.Fset.File(token.Pos(failure.Position.Start.Offset))\n\n\t\t// Skip cgo files because the positions are wrong.\n\t\tif failure.Filename() == f.Name() {\n\t\t\tissue.SuggestedFixes = []analysis.SuggestedFix{{\n\t\t\t\tTextEdits: []analysis.TextEdit{{\n\t\t\t\t\tPos: f.LineStart(failure.Position.Start.Line),\n\t\t\t\t\tEnd: goanalysis.EndOfLinePos(f, failure.Position.End.Line),\n\t\t\t\t\t// ReplacementLine doesn't contain the full line (missing newline), so we have to add a newline.\n\t\t\t\t\t// Also `failure.Position.End.Offset` is at the end of the node but not the line.\n\t\t\t\t\tNewText: []byte(failure.ReplacementLine + \"\\n\"),\n\t\t\t\t}},\n\t\t\t}}\n\t\t}\n\t}\n\n\treturn goanalysis.NewIssue(issue, pass)\n}\n\n// This function mimics the GetConfig function of revive.\n// This allows to get default values and right types.\n// https://github.com/golangci/golangci-lint/issues/1745\n// https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L249\n// https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L198-L204\nfunc getConfig(cfg *config.ReviveSettings) (*lint.Config, error) {\n\tconf := defaultConfig()\n\n\t// Since the Go version is dynamic, this value must be neutralized in order to compare with a \"zero value\" of the configuration structure.\n\tzero := &config.ReviveSettings{Go: cfg.Go}\n\n\tif !reflect.DeepEqual(cfg, zero) {\n\t\trawRoot := createConfigMap(cfg)\n\t\tbuf := bytes.NewBuffer(nil)\n\n\t\terr := toml.NewEncoder(buf).Encode(rawRoot)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to encode configuration: %w\", err)\n\t\t}\n\n\t\tconf = &lint.Config{}\n\t\t_, err = toml.NewDecoder(buf).Decode(conf)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to decode configuration: %w\", err)\n\t\t}\n\t}\n\n\tnormalizeConfig(conf)\n\n\tfor k, r := range conf.Rules {\n\t\terr := r.Initialize()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error in config of rule %q: %w\", k, err)\n\t\t}\n\t\tconf.Rules[k] = r\n\t}\n\n\treturn conf, nil\n}\n\nfunc createConfigMap(cfg *config.ReviveSettings) map[string]any {\n\trawRoot := map[string]any{\n\t\t\"confidence\":         cfg.Confidence,\n\t\t\"severity\":           cfg.Severity,\n\t\t\"errorCode\":          cfg.ErrorCode,\n\t\t\"warningCode\":        cfg.WarningCode,\n\t\t\"enableAllRules\":     cfg.EnableAllRules,\n\t\t\"enableDefaultRules\": cfg.EnableDefaultRules,\n\n\t\t// Should be managed with `linters.exclusions.generated`.\n\t\t\"ignoreGeneratedHeader\": false,\n\t}\n\n\trawDirectives := map[string]map[string]any{}\n\tfor _, directive := range cfg.Directives {\n\t\trawDirectives[directive.Name] = map[string]any{\n\t\t\t\"severity\": directive.Severity,\n\t\t}\n\t}\n\n\tif len(rawDirectives) > 0 {\n\t\trawRoot[\"directive\"] = rawDirectives\n\t}\n\n\trawRules := map[string]map[string]any{}\n\tfor _, s := range cfg.Rules {\n\t\trawRules[s.Name] = map[string]any{\n\t\t\t\"severity\":  s.Severity,\n\t\t\t\"arguments\": safeTomlSlice(s.Arguments),\n\t\t\t\"disabled\":  s.Disabled,\n\t\t\t\"exclude\":   s.Exclude,\n\t\t}\n\t}\n\n\tif len(rawRules) > 0 {\n\t\trawRoot[\"rule\"] = rawRules\n\t}\n\n\treturn rawRoot\n}\n\nfunc safeTomlSlice(r []any) []any {\n\tif len(r) == 0 {\n\t\treturn nil\n\t}\n\n\tif _, ok := r[0].(map[any]any); !ok {\n\t\treturn r\n\t}\n\n\tvar typed []any\n\tfor _, elt := range r {\n\t\titem := map[string]any{}\n\t\tfor k, v := range elt.(map[any]any) {\n\t\t\titem[k.(string)] = v\n\t\t}\n\n\t\ttyped = append(typed, item)\n\t}\n\n\treturn typed\n}\n\n// This element is not exported by revive, so we need copy the code.\n// Extracted from https://github.com/mgechev/revive/blob/v1.15.0/config/config.go#L16\nvar defaultRules = []lint.Rule{\n\t&rule.VarDeclarationsRule{},\n\t&rule.PackageCommentsRule{},\n\t&rule.DotImportsRule{},\n\t&rule.BlankImportsRule{},\n\t&rule.ExportedRule{},\n\t&rule.VarNamingRule{},\n\t&rule.IndentErrorFlowRule{},\n\t&rule.RangeRule{},\n\t&rule.ErrorfRule{},\n\t&rule.ErrorNamingRule{},\n\t&rule.ErrorStringsRule{},\n\t&rule.ReceiverNamingRule{},\n\t&rule.IncrementDecrementRule{},\n\t&rule.ErrorReturnRule{},\n\t&rule.UnexportedReturnRule{},\n\t&rule.TimeNamingRule{},\n\t&rule.ContextKeysType{},\n\t&rule.ContextAsArgumentRule{},\n\t&rule.EmptyBlockRule{},\n\t&rule.SuperfluousElseRule{},\n\t&rule.UnusedParamRule{},\n\t&rule.UnreachableCodeRule{},\n\t&rule.RedefinesBuiltinIDRule{},\n}\n\nvar allRules = append([]lint.Rule{\n\t&rule.AddConstantRule{},\n\t&rule.ArgumentsLimitRule{},\n\t&rule.AtomicRule{},\n\t&rule.BannedCharsRule{},\n\t&rule.BareReturnRule{},\n\t&rule.BoolLiteralRule{},\n\t&rule.CallToGCRule{},\n\t&rule.CognitiveComplexityRule{},\n\t&rule.CommentsDensityRule{},\n\t&rule.CommentSpacingsRule{},\n\t&rule.ConfusingNamingRule{},\n\t&rule.ConfusingResultsRule{},\n\t&rule.ConstantLogicalExprRule{},\n\t&rule.CyclomaticRule{},\n\t&rule.DataRaceRule{},\n\t&rule.DeepExitRule{},\n\t&rule.DeferRule{},\n\t&rule.DuplicatedImportsRule{},\n\t&rule.EarlyReturnRule{},\n\t&rule.EmptyLinesRule{},\n\t&rule.EnforceMapStyleRule{},\n\t&rule.EnforceRepeatedArgTypeStyleRule{},\n\t&rule.EnforceSliceStyleRule{},\n\t&rule.EnforceSwitchStyleRule{},\n\t&rule.EpochNamingRule{},\n\t&rule.FileHeaderRule{},\n\t&rule.FileLengthLimitRule{},\n\t&rule.FilenameFormatRule{},\n\t&rule.FlagParamRule{},\n\t&rule.ForbiddenCallInWgGoRule{},\n\t&rule.FunctionLength{},\n\t&rule.FunctionResultsLimitRule{},\n\t&rule.GetReturnRule{},\n\t&rule.IdenticalBranchesRule{},\n\t&rule.IdenticalIfElseIfBranchesRule{},\n\t&rule.IdenticalIfElseIfConditionsRule{},\n\t&rule.IdenticalSwitchBranchesRule{},\n\t&rule.IdenticalSwitchConditionsRule{},\n\t&rule.IfReturnRule{},\n\t&rule.ImportAliasNamingRule{},\n\t&rule.ImportsBlocklistRule{},\n\t&rule.ImportShadowingRule{},\n\t&rule.InefficientMapLookupRule{},\n\t&rule.LineLengthLimitRule{},\n\t&rule.MaxControlNestingRule{},\n\t&rule.MaxPublicStructsRule{},\n\t&rule.ModifiesParamRule{},\n\t&rule.ModifiesValRecRule{},\n\t&rule.NestedStructs{},\n\t&rule.OptimizeOperandsOrderRule{},\n\t&rule.PackageDirectoryMismatchRule{},\n\t&rule.PackageNamingRule{},\n\t&rule.RangeValAddress{},\n\t&rule.RangeValInClosureRule{},\n\t&rule.RedundantBuildTagRule{},\n\t&rule.RedundantImportAlias{},\n\t&rule.RedundantTestMainExitRule{},\n\t&rule.StringFormatRule{},\n\t&rule.StringOfIntRule{},\n\t&rule.StructTagRule{},\n\t&rule.TimeDateRule{},\n\t&rule.TimeEqualRule{},\n\t&rule.UncheckedTypeAssertionRule{},\n\t&rule.UnconditionalRecursionRule{},\n\t&rule.UnexportedNamingRule{},\n\t&rule.UnhandledErrorRule{},\n\t&rule.UnnecessaryFormatRule{},\n\t&rule.UnnecessaryIfRule{},\n\t&rule.UnnecessaryStmtRule{},\n\t&rule.UnsecureURLSchemeRule{},\n\t&rule.UnusedReceiverRule{},\n\t&rule.UseAnyRule{},\n\t&rule.UseErrorsNewRule{},\n\t&rule.UseFmtPrintRule{},\n\t&rule.UselessBreak{},\n\t&rule.UselessFallthroughRule{},\n\t&rule.UseSlicesSort{},\n\t&rule.UseWaitGroupGoRule{},\n\t&rule.WaitGroupByValueRule{},\n}, defaultRules...)\n\nconst defaultConfidence = 0.8\n\n// This element is not exported by revive, so we need copy the code.\n// Extracted from https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L209\nfunc normalizeConfig(cfg *lint.Config) {\n\t// NOTE(ldez): this custom section for golangci-lint should be kept.\n\t// ---\n\tcfg.Confidence = cmp.Or(cfg.Confidence, defaultConfidence)\n\tcfg.Severity = cmp.Or(cfg.Severity, lint.SeverityWarning)\n\t// ---\n\n\tif len(cfg.Rules) == 0 {\n\t\tcfg.Rules = map[string]lint.RuleConfig{}\n\t}\n\n\taddRules := func(config *lint.Config, rules []lint.Rule) {\n\t\tfor _, r := range rules {\n\t\t\truleName := r.Name()\n\t\t\tif _, ok := config.Rules[ruleName]; !ok {\n\t\t\t\tconfig.Rules[ruleName] = lint.RuleConfig{}\n\t\t\t}\n\t\t}\n\t}\n\n\tif cfg.EnableAllRules {\n\t\taddRules(cfg, allRules)\n\t} else if cfg.EnableDefaultRules {\n\t\taddRules(cfg, defaultRules)\n\t}\n\n\tseverity := cfg.Severity\n\tif severity != \"\" {\n\t\tfor k, v := range cfg.Rules {\n\t\t\tif v.Severity == \"\" {\n\t\t\t\tv.Severity = severity\n\t\t\t}\n\t\t\tcfg.Rules[k] = v\n\t\t}\n\t\tfor k, v := range cfg.Directives {\n\t\t\tif v.Severity == \"\" {\n\t\t\t\tv.Severity = severity\n\t\t\t}\n\t\t\tcfg.Directives[k] = v\n\t\t}\n\t}\n}\n\n// This element is not exported by revive, so we need copy the code.\n// Extracted from https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L280\nfunc defaultConfig() *lint.Config {\n\tdefaultConfig := lint.Config{\n\t\tConfidence: defaultConfidence,\n\t\tSeverity:   lint.SeverityWarning,\n\t\tRules:      map[string]lint.RuleConfig{},\n\t}\n\tfor _, r := range defaultRules {\n\t\tdefaultConfig.Rules[r.Name()] = lint.RuleConfig{}\n\t}\n\treturn &defaultConfig\n}\n\nfunc displayRules(conf *lint.Config) {\n\tif !isDebug {\n\t\treturn\n\t}\n\n\tvar enabledRules []string\n\tfor k, r := range conf.Rules {\n\t\tif !r.Disabled {\n\t\t\tenabledRules = append(enabledRules, k)\n\t\t}\n\t}\n\n\tslices.Sort(enabledRules)\n\n\tdebugf(\"All available rules (%d): %s.\", len(allRules), strings.Join(extractRulesName(allRules), \", \"))\n\tdebugf(\"Default rules (%d): %s.\", len(defaultRules), strings.Join(extractRulesName(defaultRules), \", \"))\n\tdebugf(\"Enabled by config rules (%d): %s.\", len(enabledRules), strings.Join(enabledRules, \", \"))\n\n\tdebugf(\"revive configuration: %#v\", conf)\n}\n\nfunc extractRulesName(rules []lint.Rule) []string {\n\tvar names []string\n\n\tfor _, r := range rules {\n\t\tnames = append(names, r.Name())\n\t}\n\n\tslices.Sort(names)\n\n\treturn names\n}\n\n// Extracted from https://github.com/mgechev/revive/blob/v1.13.0/formatter/severity.go\n// Modified to use pointers (related to hugeParam rule).\nfunc severity(cfg *lint.Config, failure *lint.Failure) lint.Severity {\n\tif cfg, ok := cfg.Rules[failure.RuleName]; ok && cfg.Severity == lint.SeverityError {\n\t\treturn lint.SeverityError\n\t}\n\tif cfg, ok := cfg.Directives[failure.RuleName]; ok && cfg.Severity == lint.SeverityError {\n\t\treturn lint.SeverityError\n\t}\n\treturn lint.SeverityWarning\n}\n"
  },
  {
    "path": "pkg/golinters/revive/revive_integration_test.go",
    "content": "package revive\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/revive/testdata/fix/in/revive.go",
    "content": "//golangcitest:args -Erevive\n//golangcitest:config_path testdata/revive-fix.yml\n//golangcitest:expected_exitcode 0\npackage in\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n)\n\nfunc _() error {\n\treturn errors.New(fmt.Sprintf(\"foo: %d\", math.MaxInt))\n}\n\nfunc _() (int, error) {\n\tc := errors.New(fmt.Sprintf(\"bar: %d\", math.MaxInt))\n\treturn 1, c\n}\n\nfunc _() (int, error) {\n\tif c := errors.New(fmt.Sprintf(\"bar: %d\", math.MaxInt)); c != nil {\n\t\treturn 0, c\n\t}\n\treturn 1, nil\n}\n"
  },
  {
    "path": "pkg/golinters/revive/testdata/fix/out/revive.go",
    "content": "//golangcitest:args -Erevive\n//golangcitest:config_path testdata/revive-fix.yml\n//golangcitest:expected_exitcode 0\npackage in\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n)\n\nfunc _() error {\n\treturn fmt.Errorf(\"foo: %d\", math.MaxInt)\n}\n\nfunc _() (int, error) {\n\tc := fmt.Errorf(\"bar: %d\", math.MaxInt)\n\treturn 1, c\n}\n\nfunc _() (int, error) {\n\tif c := fmt.Errorf(\"bar: %d\", math.MaxInt); c != nil {\n\t\treturn 0, c\n\t}\n\treturn 1, nil\n}\n"
  },
  {
    "path": "pkg/golinters/revive/testdata/revive-fix.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    revive:\n      severity: warning\n      rules:\n        - name: errorf\n        - name: range\n"
  },
  {
    "path": "pkg/golinters/revive/testdata/revive.go",
    "content": "//golangcitest:args -Erevive\n//golangcitest:config_path testdata/revive.yml\npackage testdata\n\nimport (\n\t\"net/http\"\n\t\"time\"\n\n\t\"golang.org/x/xerrors\"\n)\n\n// want +2 \"exported: exported function SampleRevive should have comment or be unexported\"\n\nfunc SampleRevive(t *time.Duration) error {\n\tif t == nil {\n\t\treturn nil\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc testReviveComplexity(s string) { // want \"cyclomatic: function testReviveComplexity has cyclomatic complexity 22\"\n\tif s == http.MethodGet || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n}\n\nfunc testErrorStrings() {\n\t_ = xerrors.New(\"Some error!\") // want \"error strings should not be capitalized or end with punctuation or a newline\"\n}\n"
  },
  {
    "path": "pkg/golinters/revive/testdata/revive.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    revive:\n      severity: warning\n      rules:\n        - name: exported\n        - name: cognitive-complexity\n          arguments: [ 7 ]\n        - name: line-length-limit\n          arguments: [ 130 ]\n        - name: function-result-limit\n          arguments: [ 3 ]\n        - name: argument-limit\n          arguments: [ 4 ]\n        - name: cyclomatic\n          arguments: [ 10 ]\n        - name: max-public-structs\n          arguments: [ 3 ]\n        - name: error-strings\n          arguments:\n            - \"xerrors.New\"\n"
  },
  {
    "path": "pkg/golinters/revive/testdata/revive_cgo.go",
    "content": "//golangcitest:args -Erevive\n//golangcitest:config_path testdata/revive.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"net/http\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(t *time.Duration) error {\n\tif t == nil {\n\t\treturn nil\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc _(s string) { // want \"cyclomatic: function _ has cyclomatic complexity 22\"\n\tif s == http.MethodGet || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/revive/testdata/revive_default.go",
    "content": "//golangcitest:args -Erevive\n// Package testdata ...\npackage testdata\n\nimport (\n\t\"net/http\"\n\t\"time\"\n)\n\nfunc testReviveDefault(t *time.Duration) error {\n\tif t == nil {\n\t\treturn nil\n\t} else { // want \"indent-error-flow: if block ends with a return statement, .*\"\n\t\treturn nil\n\t}\n}\n\nfunc testReviveComplexityDefault(s string) {\n\tif s == http.MethodGet || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n\n\tif s == \"1\" || s == \"2\" || s == \"3\" || s == \"4\" || s == \"5\" || s == \"6\" || s == \"7\" {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/rowserrcheck/rowserrcheck.go",
    "content": "package rowserrcheck\n\nimport (\n\t\"github.com/jingyugao/rowserrcheck/passes/rowserr\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.RowsErrCheckSettings) *goanalysis.Linter {\n\tvar pkgs []string\n\n\tif settings != nil {\n\t\tpkgs = settings.Packages\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(rowserr.NewAnalyzer(pkgs...)).\n\t\tWithDesc(\"checks whether Rows.Err of rows is checked successfully\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/rowserrcheck/rowserrcheck_integration_test.go",
    "content": "package rowserrcheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/rowserrcheck/testdata/rowserrcheck.go",
    "content": "//golangcitest:args -Erowserrcheck\npackage testdata\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"math/rand\"\n)\n\nfunc RowsErrNotChecked(db *sql.DB) {\n\trows, _ := db.Query(\"select id from tb\") // want \"rows.Err must be checked\"\n\tfor rows.Next() {\n\n\t}\n}\n\nfunc issue943(db *sql.DB) {\n\tvar rows *sql.Rows\n\tvar err error\n\n\tif rand.Float64() < 0.5 {\n\t\trows, err = db.Query(\"select 1\")\n\t} else {\n\t\trows, err = db.Query(\"select 2\")\n\t}\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdefer rows.Close()\n\n\tfor rows.Next() {\n\t\tfmt.Println(\"new rows\")\n\t}\n\n\tif err := rows.Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/rowserrcheck/testdata/rowserrcheck_cgo.go",
    "content": "//golangcitest:args -Erowserrcheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"database/sql\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(db *sql.DB) {\n\trows, _ := db.Query(\"select id from tb\") // want \"rows.Err must be checked\"\n\tfor rows.Next() {\n\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/sloglint.go",
    "content": "package sloglint\n\nimport (\n\t\"go-simpler.org/sloglint\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.SlogLintSettings) *goanalysis.Linter {\n\tvar opts *sloglint.Options\n\n\tif settings != nil {\n\t\topts = &sloglint.Options{\n\t\t\tNoMixedArgs:    settings.NoMixedArgs,\n\t\t\tKVOnly:         settings.KVOnly,\n\t\t\tAttrOnly:       settings.AttrOnly,\n\t\t\tNoGlobal:       settings.NoGlobal,\n\t\t\tContextOnly:    settings.Context,\n\t\t\tStaticMsg:      settings.StaticMsg,\n\t\t\tMsgStyle:       settings.MsgStyle,\n\t\t\tNoRawKeys:      settings.NoRawKeys,\n\t\t\tKeyNamingCase:  settings.KeyNamingCase,\n\t\t\tForbiddenKeys:  settings.ForbiddenKeys,\n\t\t\tArgsOnSepLines: settings.ArgsOnSepLines,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(sloglint.New(opts)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/sloglint_integration_test.go",
    "content": "package sloglint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\npackage testdata\n\nimport \"log/slog\"\n\nfunc test() {\n\tslog.Info(\"msg\", \"foo\", 1, \"bar\", 2)\n\tslog.Info(\"msg\", slog.Int(\"foo\", 1), slog.Int(\"bar\", 2))\n\n\tslog.Info(\"msg\", \"foo\", 1, slog.Int(\"bar\", 2)) // want `key-value pairs and attributes should not be mixed`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_args_on_sep_lines.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_args_on_sep_lines.yml\npackage testdata\n\nimport \"log/slog\"\n\nfunc test() {\n\tslog.Info(\"msg\", \"foo\", 1)\n\tslog.Info(\"msg\",\n\t\t\"foo\", 1,\n\t\t\"bar\", 2,\n\t)\n\n\tslog.Info(\"msg\", \"foo\", 1, \"bar\", 2) // want `arguments should be put on separate lines`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_args_on_sep_lines.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      args-on-sep-lines: true\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_attr_only.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_attr_only.yml\npackage testdata\n\nimport \"log/slog\"\n\nfunc test() {\n\tslog.Info(\"msg\", slog.Int(\"foo\", 1), slog.Int(\"bar\", 2))\n\n\tslog.Info(\"msg\", \"foo\", 1, \"bar\", 2) // want `key-value pairs should not be used`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_attr_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      attr-only: true\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_cgo.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"log/slog\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tslog.Info(\"msg\", \"foo\", 1, \"bar\", 2)\n\tslog.Info(\"msg\", slog.Int(\"foo\", 1), slog.Int(\"bar\", 2))\n\n\tslog.Info(\"msg\", \"foo\", 1, slog.Int(\"bar\", 2)) // want `key-value pairs and attributes should not be mixed`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_context_only.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_context_only.yml\npackage testdata\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n)\n\nfunc test() {\n\tslog.InfoContext(context.Background(), \"msg\")\n\n\tslog.Info(\"msg\") // want `InfoContext should be used instead`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_context_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      context: \"all\"\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_forbidden_keys.go",
    "content": "//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_forbidden_keys.yml\npackage testdata\n\nimport \"log/slog\"\n\nconst (\n\tsnakeKey = \"foo_bar\"\n)\n\nfunc tests() {\n\tslog.Info(\"msg\")\n\tslog.Info(\"msg\", \"foo-bar\", 1)\n\tslog.Info(\"msg\", \"foo_bar\", 1)           // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", snakeKey, 1)            // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Int(\"foo_bar\", 1)) // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Int(snakeKey, 1))  // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{})\n\tslog.Info(\"msg\", slog.Attr{\"foo_bar\", slog.IntValue(1)})             // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{snakeKey, slog.IntValue(1)})              // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{Key: \"foo_bar\"})                          // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{Key: snakeKey})                           // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{Key: \"foo_bar\", Value: slog.IntValue(1)}) // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{Key: snakeKey, Value: slog.IntValue(1)})  // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{Value: slog.IntValue(1), Key: \"foo_bar\"}) // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{Value: slog.IntValue(1), Key: snakeKey})  // want `\"foo_bar\" key is forbidden and should not be used`\n\tslog.Info(\"msg\", slog.Attr{Value: slog.IntValue(1), Key: `foo_bar`}) // want `\"foo_bar\" key is forbidden and should not be used`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_forbidden_keys.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      forbidden-keys:\n        - foo_bar\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_key_naming_case.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_key_naming_case.yml\npackage testdata\n\nimport \"log/slog\"\n\nconst (\n\tsnakeKey = \"foo_bar\"\n\tkebabKey = \"foo-bar\"\n)\n\nfunc test() {\n\tslog.Info(\"msg\", \"foo_bar\", 1)\n\tslog.Info(\"msg\", snakeKey, 1)\n\tslog.Info(\"msg\", slog.Int(\"foo_bar\", 1))\n\tslog.Info(\"msg\", slog.Int(snakeKey, 1))\n\n\tslog.Info(\"msg\", \"foo-bar\", 1)           // want `keys should be written in snake_case`\n\tslog.Info(\"msg\", kebabKey, 1)            // want `keys should be written in snake_case`\n\tslog.Info(\"msg\", slog.Int(\"foo-bar\", 1)) // want `keys should be written in snake_case`\n\tslog.Info(\"msg\", slog.Int(kebabKey, 1))  // want `keys should be written in snake_case`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_key_naming_case.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      key-naming-case: snake\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_kv_only.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_kv_only.yml\npackage testdata\n\nimport \"log/slog\"\n\nfunc test() {\n\tslog.Info(\"msg\", \"foo\", 1, \"bar\", 2)\n\n\tslog.Info(\"msg\", slog.Int(\"foo\", 1), slog.Int(\"bar\", 2)) // want `attributes should not be used`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_kv_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      kv-only: true\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_no_raw_keys.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_no_raw_keys.yml\npackage testdata\n\nimport \"log/slog\"\n\nconst foo = \"foo\"\n\nfunc Foo(value int) slog.Attr {\n\treturn slog.Int(\"foo\", value)\n}\n\nfunc test() {\n\tslog.Info(\"msg\", foo, 1)\n\tslog.Info(\"msg\", Foo(1))\n\n\tslog.Info(\"msg\", \"foo\", 1)           // want `raw keys should not be used`\n\tslog.Info(\"msg\", slog.Int(\"foo\", 1)) // want `raw keys should not be used`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_no_raw_keys.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      no-raw-keys: true\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_static_msg.go",
    "content": "//go:build go1.21\n\n//golangcitest:args -Esloglint\n//golangcitest:config_path testdata/sloglint_static_msg.yml\npackage testdata\n\nimport (\n\t\"log/slog\"\n)\n\nfunc test() {\n\tslog.Info(\"msg\")\n\n\tconst msg1 = \"msg\"\n\tslog.Info(msg1)\n\n\tmsg2 := \"msg\"\n\tslog.Info(msg2) // want `message should be a string literal or a constant`\n}\n"
  },
  {
    "path": "pkg/golinters/sloglint/testdata/sloglint_static_msg.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    sloglint:\n      static-msg: true\n"
  },
  {
    "path": "pkg/golinters/spancheck/spancheck.go",
    "content": "package spancheck\n\nimport (\n\t\"github.com/jjti/go-spancheck\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.SpancheckSettings) *goanalysis.Linter {\n\tcfg := spancheck.NewDefaultConfig()\n\n\tif settings != nil {\n\t\tif len(settings.Checks) > 0 {\n\t\t\tcfg.EnabledChecks = settings.Checks\n\t\t}\n\n\t\tif len(settings.IgnoreCheckSignatures) > 0 {\n\t\t\tcfg.IgnoreChecksSignaturesSlice = settings.IgnoreCheckSignatures\n\t\t}\n\n\t\tif len(settings.ExtraStartSpanSignatures) > 0 {\n\t\t\tcfg.StartSpanMatchersSlice = append(cfg.StartSpanMatchersSlice, settings.ExtraStartSpanSignatures...)\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(spancheck.NewAnalyzerWithConfig(cfg)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/spancheck/spancheck_integration_test.go",
    "content": "package spancheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/go.mod",
    "content": "module spancheck\n\ngo 1.25.0\n\nrequire (\n\tgo.opentelemetry.io/otel v1.40.0\n\tgo.opentelemetry.io/otel/trace v1.40.0\n)\n\nrequire (\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/go-logr/logr v1.4.3 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgo.opentelemetry.io/auto/sdk v1.2.1 // indirect\n\tgo.opentelemetry.io/otel/metric v1.40.0 // indirect\n)\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/go.sum",
    "content": "github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngo.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\ngo.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=\ngo.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=\ngo.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=\ngo.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=\ngo.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=\ngo.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=\ngo.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/spancheck.go",
    "content": "//golangcitest:args -Espancheck\npackage spancheck\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/codes\"\n)\n\ntype testDefaultError struct{}\n\nfunc (e *testDefaultError) Error() string {\n\treturn \"foo\"\n}\n\n// incorrect\n\nfunc _() {\n\totel.Tracer(\"foo\").Start(context.Background(), \"bar\")           // want \"span is unassigned, probable memory leak\"\n\tctx, _ := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span is unassigned, probable memory leak\"\n\tfmt.Print(ctx)\n}\n\nfunc _() {\n\tctx, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\tprint(ctx.Done(), span.IsRecording())\n} // want \"return can be reached without calling span.End\"\n\nfunc _() {\n\tvar ctx, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\tprint(ctx.Done(), span.IsRecording())\n} // want \"return can be reached without calling span.End\"\n\nfunc _() {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\t_, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tfmt.Print(span)\n\tdefer span.End()\n} // want \"return can be reached without calling span.End\"\n\n// correct\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\tif true {\n\t\treturn nil\n\t}\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\tif false {\n\t\terr := errors.New(\"foo\")\n\t\tspan.SetStatus(codes.Error, err.Error())\n\t\tspan.RecordError(err)\n\t\treturn err\n\t}\n\n\tif true {\n\t\tspan.SetStatus(codes.Error, \"foo\")\n\t\tspan.RecordError(errors.New(\"foo\"))\n\t\treturn errors.New(\"bar\")\n\t}\n\n\treturn nil\n}\n\nfunc _() {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\t_, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n}\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/spancheck_cgo.go",
    "content": "//golangcitest:args -Espancheck\npackage spancheck\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/codes\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype testDefaultError struct{}\n\nfunc (e *testDefaultError) Error() string {\n\treturn \"foo\"\n}\n\n// incorrect\n\nfunc _() {\n\totel.Tracer(\"foo\").Start(context.Background(), \"bar\")           // want \"span is unassigned, probable memory leak\"\n\tctx, _ := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span is unassigned, probable memory leak\"\n\tfmt.Print(ctx)\n}\n\nfunc _() {\n\tctx, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\tprint(ctx.Done(), span.IsRecording())\n} // want \"return can be reached without calling span.End\"\n\nfunc _() {\n\tvar ctx, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\tprint(ctx.Done(), span.IsRecording())\n} // want \"return can be reached without calling span.End\"\n\nfunc _() {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\t_, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tfmt.Print(span)\n\tdefer span.End()\n} // want \"return can be reached without calling span.End\"\n\n// correct\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\tif true {\n\t\treturn nil\n\t}\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\tif false {\n\t\terr := errors.New(\"foo\")\n\t\tspan.SetStatus(codes.Error, err.Error())\n\t\tspan.RecordError(err)\n\t\treturn err\n\t}\n\n\tif true {\n\t\tspan.SetStatus(codes.Error, \"foo\")\n\t\tspan.RecordError(errors.New(\"foo\"))\n\t\treturn errors.New(\"bar\")\n\t}\n\n\treturn nil\n}\n\nfunc _() {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\t_, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n}\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/spancheck_enable_all.go",
    "content": "//golangcitest:config_path testdata/spancheck_enable_all.yml\n//golangcitest:args -Espancheck\npackage spancheck\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/codes\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\ntype testError struct{}\n\nfunc (e *testError) Error() string {\n\treturn \"foo\"\n}\n\n// incorrect\n\nfunc _() {\n\totel.Tracer(\"foo\").Start(context.Background(), \"bar\")           // want \"span is unassigned, probable memory leak\"\n\tctx, _ := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span is unassigned, probable memory leak\"\n\tfmt.Print(ctx)\n}\n\nfunc _() {\n\tctx, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\tprint(ctx.Done(), span.IsRecording())\n} // want \"return can be reached without calling span.End\"\n\nfunc _() {\n\tvar ctx, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\tprint(ctx.Done(), span.IsRecording())\n} // want \"return can be reached without calling span.End\"\n\nfunc _() {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.End is not called on all paths, possible memory leak\"\n\t_, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tfmt.Print(span)\n\tdefer span.End()\n} // want \"return can be reached without calling span.End\"\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.SetStatus is not called on all paths\"\n\tdefer span.End()\n\n\tif true {\n\t\terr := errors.New(\"foo\")\n\t\tspan.RecordError(err)\n\t\treturn err // want \"return can be reached without calling span.SetStatus\"\n\t}\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.SetStatus is not called on all paths\"\n\tdefer span.End()\n\n\tif true {\n\t\tspan.RecordError(errors.New(\"foo\"))\n\t\treturn errors.New(\"foo\") // want \"return can be reached without calling span.SetStatus\"\n\t}\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.SetStatus is not called on all paths\"\n\tdefer span.End()\n\n\tif true {\n\t\tspan.RecordError(errors.New(\"foo\"))\n\t\treturn &testError{} // want \"return can be reached without calling span.SetStatus\"\n\t}\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.RecordError is not called on all paths\"\n\tdefer span.End()\n\n\tif true {\n\t\tspan.SetStatus(codes.Error, \"foo\")\n\t\treturn &testError{} // want \"return can be reached without calling span.RecordError\"\n\t}\n\n\treturn nil\n}\n\nfunc _() (string, error) {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.SetStatus is not called on all paths\"\n\tdefer span.End()\n\n\tif true {\n\t\tspan.RecordError(errors.New(\"foo\"))\n\t\treturn \"\", &testError{} // want \"return can be reached without calling span.SetStatus\"\n\t}\n\n\treturn \"\", nil\n}\n\nfunc _() (string, error) {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.SetStatus is not called on all paths\"\n\tdefer span.End()\n\n\tif true {\n\t\tspan.RecordError(errors.New(\"foo\"))\n\t\treturn \"\", errors.New(\"foo\") // want \"return can be reached without calling span.SetStatus\"\n\t}\n\n\treturn \"\", nil\n}\n\nfunc _() {\n\tf := func() error {\n\t\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.SetStatus is not called on all paths\"\n\t\tdefer span.End()\n\n\t\tif true {\n\t\t\tspan.RecordError(errors.New(\"foo\"))\n\t\t\treturn errors.New(\"foo\") // want \"return can be reached without calling span.SetStatus\"\n\t\t}\n\n\t\treturn nil\n\t}\n\tfmt.Println(f)\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\") // want \"span.SetStatus is not called on all paths\"\n\tdefer span.End()\n\n\t{\n\t\tif true {\n\t\t\tspan.RecordError(errors.New(\"foo\"))\n\t\t\treturn errors.New(\"foo\") // want \"return can be reached without calling span.SetStatus\"\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// correct\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\tif true {\n\t\treturn nil\n\t}\n\n\treturn nil\n}\n\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\tif false {\n\t\terr := errors.New(\"foo\")\n\t\tspan.SetStatus(codes.Error, err.Error())\n\t\tspan.RecordError(err)\n\t\treturn err\n\t}\n\n\tif true {\n\t\tspan.SetStatus(codes.Error, \"foo\")\n\t\tspan.RecordError(errors.New(\"foo\"))\n\t\treturn errors.New(\"bar\")\n\t}\n\n\treturn nil\n}\n\nfunc _() {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\t_, span = otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n}\n\n// ignore error because of matching func sig\nfunc _() error {\n\t_, span := otel.Tracer(\"foo\").Start(context.Background(), \"bar\")\n\tdefer span.End()\n\n\terr := errors.New(\"foo\")\n\trecordError(span, err)\n\treturn err\n}\n\nfunc recordError(span trace.Span, err error) {}\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/spancheck_enable_all.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    spancheck:\n      checks:\n        - \"end\"\n        - \"record-error\"\n        - \"set-status\"\n      ignore-check-signatures:\n        - \"recordErr\"\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/spancheck_keep_default.go",
    "content": "//golangcitest:args -Espancheck\n//golangcitest:config_path testdata/spancheck_keep_default.yml\npackage spancheck\n\nimport (\n\t\"context\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nfunc StartTrace() (context.Context, trace.Span) {\n\treturn otel.Tracer(\"example.com/main\").Start(context.Background(), \"span name\") // want \"span is unassigned, probable memory leak\"\n}\n\nfunc _() {\n\t_, _ = StartTrace()\n}\n"
  },
  {
    "path": "pkg/golinters/spancheck/testdata/spancheck_keep_default.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    spancheck:\n      extra-start-span-signatures:\n        - dummy:opentelemetry\n"
  },
  {
    "path": "pkg/golinters/sqlclosecheck/sqlclosecheck.go",
    "content": "package sqlclosecheck\n\nimport (\n\t\"github.com/golangci/sqlclosecheck/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewDeferOnlyAnalyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/sqlclosecheck/sqlclosecheck_integration_test.go",
    "content": "package sqlclosecheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/sqlclosecheck/testdata/sqlclosecheck.go",
    "content": "//golangcitest:args -Esqlclosecheck\npackage testdata\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"log\"\n\t\"strings\"\n)\n\nvar (\n\tctx    context.Context\n\tdb     *sql.DB\n\tage    = 27\n\tuserID = 43\n)\n\nfunc rowsCorrectDeferBlock() {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users WHERE age=?\", age)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tdefer func() {\n\t\terr := rows.Close()\n\t\tif err != nil {\n\t\t\tlog.Print(\"problem closing rows\")\n\t\t}\n\t}()\n\n\tnames := make([]string, 0)\n\tfor rows.Next() {\n\t\tvar name string\n\t\tif err := rows.Scan(&name); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\n\t// Check for errors from iterating over rows.\n\tif err := rows.Err(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"%s are %d years old\", strings.Join(names, \", \"), age)\n}\n\nfunc rowsCorrectDefer() {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users WHERE age=?\", age)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer rows.Close()\n\n\tnames := make([]string, 0)\n\tfor rows.Next() {\n\t\tvar name string\n\t\tif err := rows.Scan(&name); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\n\t// Check for errors from iterating over rows.\n\tif err := rows.Err(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"%s are %d years old\", strings.Join(names, \", \"), age)\n}\n\nfunc rowsMissingClose() {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users WHERE age=?\", age) // want \"Rows/Stmt/NamedStmt was not closed\"\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t// defer rows.Close()\n\n\tnames := make([]string, 0)\n\tfor rows.Next() {\n\t\tvar name string\n\t\tif err := rows.Scan(&name); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\n\t// Check for errors from iterating over rows.\n\tif err := rows.Err(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"%s are %d years old\", strings.Join(names, \", \"), age)\n}\n\nfunc rowsMissingCloseG[T ~int64](db *sql.DB, a T) {\n\trows, _ := db.Query(\"select id from tb\") // want \"Rows/Stmt/NamedStmt was not closed\"\n\tfor rows.Next() {\n\t\t// ...\n\t}\n}\n\nfunc rowsNonDeferClose() {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users WHERE age=?\", age)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tnames := make([]string, 0)\n\tfor rows.Next() {\n\t\tvar name string\n\t\tif err := rows.Scan(&name); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\n\t// Check for errors from iterating over rows.\n\tif err := rows.Err(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"%s are %d years old\", strings.Join(names, \", \"), age)\n\n\trows.Close() // want \"Close should use defer\"\n}\n\nfunc rowsPassedAndClosed() {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\trowsClosedPassed(rows)\n}\n\nfunc rowsClosedPassed(rows *sql.Rows) {\n\trows.Close()\n}\n\nfunc rowsPassedAndNotClosed(rows *sql.Rows) {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\trowsDontClosedPassed(rows)\n}\n\nfunc rowsDontClosedPassed(*sql.Rows) {\n\n}\n\nfunc rowsReturn() (*sql.Rows, error) {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users WHERE age=?\", age)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\treturn rows, nil\n}\n\nfunc rowsReturnShort() (*sql.Rows, error) {\n\treturn db.QueryContext(ctx, \"SELECT name FROM users WHERE age=?\", age)\n}\n\nfunc stmtCorrectDeferBlock() {\n\t// In normal use, create one Stmt when your process starts.\n\tstmt, err := db.PrepareContext(ctx, \"SELECT username FROM users WHERE id = ?\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer func() {\n\t\terr := stmt.Close()\n\t\tif err != nil {\n\t\t\tlog.Print(\"problem closing stmt\")\n\t\t}\n\t}()\n\n\t// Then reuse it each time you need to issue the query.\n\tvar username string\n\terr = stmt.QueryRowContext(ctx, userID).Scan(&username)\n\tswitch {\n\tcase err == sql.ErrNoRows:\n\t\tlog.Fatalf(\"no user with id %d\", userID)\n\tcase err != nil:\n\t\tlog.Fatal(err)\n\tdefault:\n\t\tlog.Printf(\"username is %s\\n\", username)\n\t}\n}\n\nfunc stmtCorrectDefer() {\n\t// In normal use, create one Stmt when your process starts.\n\tstmt, err := db.PrepareContext(ctx, \"SELECT username FROM users WHERE id = ?\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer stmt.Close()\n\n\t// Then reuse it each time you need to issue the query.\n\tvar username string\n\terr = stmt.QueryRowContext(ctx, userID).Scan(&username)\n\tswitch {\n\tcase err == sql.ErrNoRows:\n\t\tlog.Fatalf(\"no user with id %d\", userID)\n\tcase err != nil:\n\t\tlog.Fatal(err)\n\tdefault:\n\t\tlog.Printf(\"username is %s\\n\", username)\n\t}\n}\n\nfunc stmtMissingClose() {\n\t// In normal use, create one Stmt when your process starts.\n\tstmt, err := db.PrepareContext(ctx, \"SELECT username FROM users WHERE id = ?\") // want \"Rows/Stmt/NamedStmt was not closed\"\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t// defer stmt.Close()\n\n\t// Then reuse it each time you need to issue the query.\n\tvar username string\n\terr = stmt.QueryRowContext(ctx, userID).Scan(&username)\n\tswitch {\n\tcase err == sql.ErrNoRows:\n\t\tlog.Fatalf(\"no user with id %d\", userID)\n\tcase err != nil:\n\t\tlog.Fatal(err)\n\tdefault:\n\t\tlog.Printf(\"username is %s\\n\", username)\n\t}\n}\n\nfunc stmtNonDeferClose() {\n\t// In normal use, create one Stmt when your process starts.\n\tstmt, err := db.PrepareContext(ctx, \"SELECT username FROM users WHERE id = ?\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Then reuse it each time you need to issue the query.\n\tvar username string\n\terr = stmt.QueryRowContext(ctx, userID).Scan(&username)\n\tswitch {\n\tcase err == sql.ErrNoRows:\n\t\tlog.Fatalf(\"no user with id %d\", userID)\n\tcase err != nil:\n\t\tlog.Fatal(err)\n\tdefault:\n\t\tlog.Printf(\"username is %s\\n\", username)\n\t}\n\n\tstmt.Close() // want \"Close should use defer\"\n}\n\nfunc stmtReturn() (*sql.Stmt, error) {\n\tstmt, err := db.PrepareContext(ctx, \"SELECT username FROM users WHERE id = ?\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn stmt, nil\n}\n\nfunc stmtReturnShort() (*sql.Stmt, error) {\n\treturn db.PrepareContext(ctx, \"SELECT username FROM users WHERE id = ?\")\n}\n"
  },
  {
    "path": "pkg/golinters/sqlclosecheck/testdata/sqlclosecheck_cgo.go",
    "content": "//golangcitest:args -Esqlclosecheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"log\"\n\t\"strings\"\n\t\"unsafe\"\n)\n\nvar (\n\tctx    context.Context\n\tdb     *sql.DB\n\tage    = 27\n\tuserID = 43\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\trows, err := db.QueryContext(ctx, \"SELECT name FROM users WHERE age=?\", age) // want \"Rows/Stmt/NamedStmt was not closed\"\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t// defer rows.Close()\n\n\tnames := make([]string, 0)\n\tfor rows.Next() {\n\t\tvar name string\n\t\tif err := rows.Scan(&name); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\n\t// Check for errors from iterating over rows.\n\tif err := rows.Err(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"%s are %d years old\", strings.Join(names, \", \"), age)\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/staticcheck.go",
    "content": "package staticcheck\n\nimport (\n\t\"slices\"\n\t\"strings\"\n\t\"unicode\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"honnef.co/go/tools/analysis/lint\"\n\tscconfig \"honnef.co/go/tools/config\"\n\t\"honnef.co/go/tools/quickfix\"\n\t\"honnef.co/go/tools/simple\"\n\t\"honnef.co/go/tools/staticcheck\"\n\t\"honnef.co/go/tools/stylecheck\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nvar (\n\tdebugf  = logutils.Debug(logutils.DebugKeyStaticcheck)\n\tisDebug = logutils.HaveDebugTag(logutils.DebugKeyStaticcheck)\n)\n\nfunc New(settings *config.StaticCheckSettings) *goanalysis.Linter {\n\tcfg := createConfig(settings)\n\n\t// `scconfig.Analyzer` is a singleton.\n\tscconfig.Analyzer.Run = func(_ *analysis.Pass) (any, error) {\n\t\treturn cfg, nil\n\t}\n\n\tallAnalyzers := slices.Concat(staticcheck.Analyzers, stylecheck.Analyzers, simple.Analyzers, quickfix.Analyzers)\n\n\tanalyzers := setupAnalyzers(allAnalyzers, cfg.Checks)\n\n\tif isDebug {\n\t\tallAnalyzerNames := extractAnalyzerNames(allAnalyzers)\n\t\tslices.Sort(allAnalyzerNames)\n\t\tdebugf(\"All available checks (%d): %s\", len(allAnalyzers), strings.Join(allAnalyzerNames, \",\"))\n\n\t\tvar cfgAnalyzerNames []string\n\t\tfor _, a := range analyzers {\n\t\t\tcfgAnalyzerNames = append(cfgAnalyzerNames, a.Name)\n\t\t}\n\t\tslices.Sort(cfgAnalyzerNames)\n\t\tdebugf(\"Enabled by config checks (%d): %s\", len(analyzers), strings.Join(cfgAnalyzerNames, \",\"))\n\n\t\tdebugf(\"staticcheck configuration: %#v\", cfg)\n\t}\n\n\treturn goanalysis.NewLinter(\n\t\t\"staticcheck\",\n\t\t\"It's the set of rules from staticcheck.\",\n\t\tanalyzers,\n\t\tnil,\n\t).WithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc createConfig(settings *config.StaticCheckSettings) *scconfig.Config {\n\tdefaultChecks := []string{\"all\", \"-ST1000\", \"-ST1003\", \"-ST1016\", \"-ST1020\", \"-ST1021\", \"-ST1022\"}\n\n\tvar cfg *scconfig.Config\n\n\tif settings == nil || !settings.HasConfiguration() {\n\t\treturn &scconfig.Config{\n\t\t\tChecks:                  defaultChecks,\n\t\t\tInitialisms:             scconfig.DefaultConfig.Initialisms,\n\t\t\tDotImportWhitelist:      scconfig.DefaultConfig.DotImportWhitelist,\n\t\t\tHTTPStatusCodeWhitelist: scconfig.DefaultConfig.HTTPStatusCodeWhitelist,\n\t\t}\n\t}\n\n\tcfg = &scconfig.Config{\n\t\tChecks:                  settings.Checks,\n\t\tInitialisms:             settings.Initialisms,\n\t\tDotImportWhitelist:      settings.DotImportWhitelist,\n\t\tHTTPStatusCodeWhitelist: settings.HTTPStatusCodeWhitelist,\n\t}\n\n\tif cfg.Checks == nil {\n\t\tcfg.Checks = defaultChecks\n\t}\n\n\tif cfg.Initialisms == nil {\n\t\tcfg.Initialisms = append(cfg.Initialisms, scconfig.DefaultConfig.Initialisms...)\n\t}\n\n\tif cfg.DotImportWhitelist == nil {\n\t\tcfg.DotImportWhitelist = append(cfg.DotImportWhitelist, scconfig.DefaultConfig.DotImportWhitelist...)\n\t}\n\n\tif cfg.HTTPStatusCodeWhitelist == nil {\n\t\tcfg.HTTPStatusCodeWhitelist = append(cfg.HTTPStatusCodeWhitelist, scconfig.DefaultConfig.HTTPStatusCodeWhitelist...)\n\t}\n\n\tcfg.Checks = normalizeList(cfg.Checks)\n\tcfg.Initialisms = normalizeList(cfg.Initialisms)\n\tcfg.DotImportWhitelist = normalizeList(cfg.DotImportWhitelist)\n\tcfg.HTTPStatusCodeWhitelist = normalizeList(cfg.HTTPStatusCodeWhitelist)\n\n\treturn cfg\n}\n\n// https://github.com/dominikh/go-tools/blob/9bf17c0388a65710524ba04c2d821469e639fdc2/config/config.go#L95-L116\nfunc normalizeList(list []string) []string {\n\tif len(list) > 1 {\n\t\tnlist := make([]string, 0, len(list))\n\t\tnlist = append(nlist, list[0])\n\t\tfor i, el := range list[1:] {\n\t\t\tif el != list[i] {\n\t\t\t\tnlist = append(nlist, el)\n\t\t\t}\n\t\t}\n\t\tlist = nlist\n\t}\n\n\tfor _, el := range list {\n\t\tif el == \"inherit\" {\n\t\t\t// This should never happen, because the default config\n\t\t\t// should not use \"inherit\"\n\t\t\tpanic(`unresolved \"inherit\"`)\n\t\t}\n\t}\n\n\treturn list\n}\n\nfunc setupAnalyzers(src []*lint.Analyzer, checks []string) []*analysis.Analyzer {\n\tfilter := filterAnalyzerNames(extractAnalyzerNames(src), checks)\n\n\tvar ret []*analysis.Analyzer\n\tfor _, a := range src {\n\t\tif filter[a.Analyzer.Name] {\n\t\t\tret = append(ret, a.Analyzer)\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc extractAnalyzerNames(analyzers []*lint.Analyzer) []string {\n\tvar names []string\n\tfor _, a := range analyzers {\n\t\tnames = append(names, a.Analyzer.Name)\n\t}\n\treturn names\n}\n\n// https://github.com/dominikh/go-tools/blob/9bf17c0388a65710524ba04c2d821469e639fdc2/lintcmd/lint.go#L437-L477\n//\n//nolint:gocritic // Keep the original source code.\nfunc filterAnalyzerNames(analyzers []string, checks []string) map[string]bool {\n\tallowedChecks := map[string]bool{}\n\n\tfor _, check := range checks {\n\t\tb := true\n\t\tif len(check) > 1 && check[0] == '-' {\n\t\t\tb = false\n\t\t\tcheck = check[1:]\n\t\t}\n\n\t\tif check == \"*\" || check == \"all\" {\n\t\t\t// Match all\n\t\t\tfor _, c := range analyzers {\n\t\t\t\tallowedChecks[c] = b\n\t\t\t}\n\t\t} else if strings.HasSuffix(check, \"*\") {\n\t\t\t// Glob\n\t\t\tprefix := check[:len(check)-1]\n\t\t\tisCat := strings.IndexFunc(prefix, func(r rune) bool { return unicode.IsNumber(r) }) == -1\n\n\t\t\tfor _, a := range analyzers {\n\t\t\t\tidx := strings.IndexFunc(a, func(r rune) bool { return unicode.IsNumber(r) })\n\t\t\t\tif isCat {\n\t\t\t\t\t// Glob is S*, which should match S1000 but not SA1000\n\t\t\t\t\tcat := a[:idx]\n\t\t\t\t\tif prefix == cat {\n\t\t\t\t\t\tallowedChecks[a] = b\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Glob is S1*\n\t\t\t\t\tif strings.HasPrefix(a, prefix) {\n\t\t\t\t\t\tallowedChecks[a] = b\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Literal check name\n\t\t\tallowedChecks[check] = b\n\t\t}\n\t}\n\treturn allowedChecks\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/staticcheck_integration_test.go",
    "content": "package staticcheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/fix/in/gosimple.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/gosimple.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nfunc _(src []string) {\n\tvar dst []string\n\tfor i, x := range src {\n\t\tdst[i] = x\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/fix/in/staticcheck.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/staticcheck.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"sort\"\n\nfunc _(a []string) {\n\ta = sort.StringSlice(a)\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/fix/in/stylecheck.go",
    "content": "// Package testdata ...\n//\n//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/stylecheck.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nfunc _(x int) {\n\tif 42 == x {\n\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/fix/out/gosimple.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/gosimple.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nfunc _(src []string) {\n\tvar dst []string\n\tcopy(dst, src)\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/fix/out/staticcheck.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/staticcheck.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"sort\"\n\nfunc _(a []string) {\n\tsort.Strings(a)\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/fix/out/stylecheck.go",
    "content": "// Package testdata ...\n//\n//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/stylecheck.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nfunc _(x int) {\n\tif x == 42 {\n\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/gosimple.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/gosimple.yml\npackage testdata\n\nimport (\n\t\"log\"\n)\n\nfunc Gosimple(ss []string) {\n\tif ss != nil { // want \"S1031: unnecessary nil check around range\"\n\t\tfor _, s := range ss {\n\t\t\tlog.Printf(s)\n\t\t}\n\t}\n}\n\nfunc GosimpleNolintGosimple(ss []string) {\n\tif ss != nil { //nolint:staticcheck\n\t\tfor _, s := range ss {\n\t\t\tlog.Printf(s)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/gosimple.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - all\n        - '-SA*'\n        - '-ST*'\n        - '-QF*'\n\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/gosimple_cgo.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/gosimple.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"log\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(ss []string) {\n\tif ss != nil { // want \"S1031: unnecessary nil check around range\"\n\t\tfor _, s := range ss {\n\t\t\tlog.Printf(s)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/staticcheck.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/staticcheck.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n)\n\nfunc Staticcheck() {\n\tvar x int\n\tx = x // want \"self-assignment of x to x\"\n\tfmt.Printf(\"%d\", x)\n}\n\nfunc StaticcheckNolintStaticcheck() {\n\tvar x int\n\tx = x //nolint:staticcheck\n}\n\nfunc StaticcheckPrintf() {\n\tx := \"dummy\"\n\tfmt.Printf(\"%d\", x) // want \"SA5009: Printf format %d has arg #1 of wrong type\"\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/staticcheck.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - all\n        - '-ST*'\n        - '-S*'\n        - '-QF*'\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/staticcheck_cgo.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/staticcheck.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tx := \"dummy\"\n\tfmt.Printf(\"%d\", x) // want \"SA5009: Printf format %d has arg #1 of wrong type\"\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/stylecheck.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/stylecheck.yml\n// Package testdata ...\npackage testdata\n\nfunc Stylecheck(x int) {\n\tswitch x {\n\tcase 1:\n\t\treturn\n\tdefault: // want \"ST1015: default case should be first or last in switch statement\"\n\t\treturn\n\tcase 2:\n\t\treturn\n\t}\n}\n\nfunc StylecheckNolintStylecheck(x int) {\n\tswitch x {\n\tcase 1:\n\t\treturn\n\tdefault: //nolint:staticcheck\n\t\treturn\n\tcase 2:\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/stylecheck.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - all\n        - '-SA*'\n        - '-S*'\n        - '-QF*'\n\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/stylecheck_cgo.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/stylecheck.yml\n// Package testdata ...\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _(x int) {\n\tswitch x {\n\tcase 1:\n\t\treturn\n\tdefault: // want \"ST1015: default case should be first or last in switch statement\"\n\t\treturn\n\tcase 2:\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/stylecheck_empty.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/stylecheck_empty.yml\npackage testdata\n\nimport \"net/http\"\n\nfunc _() {\n\thttp.StatusText(200) // want \"ST1013: should use constant http.StatusOK instead of numeric literal 200\"\n\thttp.StatusText(400) // want \"ST1013: should use constant http.StatusBadRequest instead of numeric literal 400\"\n\thttp.StatusText(404) // want \"ST1013: should use constant http.StatusNotFound instead of numeric literal 404\"\n\thttp.StatusText(418) // want \"ST1013: should use constant http.StatusTeapot instead of numeric literal 418\"\n\thttp.StatusText(500) // want \"ST1013: should use constant http.StatusInternalServerError instead of numeric literal 500\"\n\thttp.StatusText(503) // want \"ST1013: should use constant http.StatusServiceUnavailable instead of numeric literal 503\"\n\thttp.StatusText(600)\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/stylecheck_empty.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    staticcheck:\n      checks: [\"ST1013\"]\n      http-status-code-whitelist: [ ]\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/stylecheck_nil.go",
    "content": "//golangcitest:args -Estaticcheck\n//golangcitest:config_path testdata/stylecheck_nil.yml\npackage testdata\n\nimport \"net/http\"\n\nfunc _() {\n\thttp.StatusText(200)\n\thttp.StatusText(400)\n\thttp.StatusText(404)\n\thttp.StatusText(418) // want \"ST1013: should use constant http.StatusTeapot instead of numeric literal 418\"\n\thttp.StatusText(500)\n\thttp.StatusText(503) // want \"ST1013: should use constant http.StatusServiceUnavailable instead of numeric literal 503\"\n\thttp.StatusText(600)\n}\n"
  },
  {
    "path": "pkg/golinters/staticcheck/testdata/stylecheck_nil.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    staticcheck:\n      checks: [\"ST1013\"]\n"
  },
  {
    "path": "pkg/golinters/swaggo/swaggo.go",
    "content": "package swaggo\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/swaggo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(\n\t\t\tgoformatters.NewAnalyzer(\n\t\t\t\tinternal.LinterLogger.Child(swaggo.Name),\n\t\t\t\t\"Check if swaggo comments are formatted\",\n\t\t\t\tswaggo.New(),\n\t\t\t),\n\t\t).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/swaggo/swaggo_integration_test.go",
    "content": "package swaggo\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/swaggo/testdata/fix/in/swaggo.go",
    "content": "//golangcitest:config_path testdata/swaggo.yml\n//golangcitest:expected_exitcode 0\npackage api\n\nimport \"net/http\"\n\n// @Summary Add a new pet to the store\n// @Description get string by ID\n// @ID get-string-by-int\n// @Accept  json\n// @Produce  json\n// @Param   some_id      path   int     true  \"Some ID\" Format(int64)\n// @Param   some_id      body web.Pet true  \"Some ID\"\n// @Success 200 {string} string\t\"ok\"\n// @Failure 400 {object} web.APIError \"We need ID!!\"\n// @Failure 404 {object} web.APIError \"Can not find ID\"\n// @Router /testapi/get-string-by-int/{some_id} [get]\nfunc GetStringByInt(w http.ResponseWriter, r *http.Request) {}\n"
  },
  {
    "path": "pkg/golinters/swaggo/testdata/fix/out/swaggo.go",
    "content": "//golangcitest:config_path testdata/swaggo.yml\n//golangcitest:expected_exitcode 0\npackage api\n\nimport \"net/http\"\n\n// @Summary\t\tAdd a new pet to the store\n// @Description\tget string by ID\n// @ID\t\t\t\tget-string-by-int\n// @Accept\t\t\tjson\n// @Produce\t\tjson\n// @Param\t\t\tsome_id\tpath\t\tint\t\t\t\ttrue\t\"Some ID\"\tFormat(int64)\n// @Param\t\t\tsome_id\tbody\t\tweb.Pet\t\t\ttrue\t\"Some ID\"\n// @Success\t\t200\t\t{string}\tstring\t\t\t\"ok\"\n// @Failure\t\t400\t\t{object}\tweb.APIError\t\"We need ID!!\"\n// @Failure\t\t404\t\t{object}\tweb.APIError\t\"Can not find ID\"\n// @Router\t\t\t/testapi/get-string-by-int/{some_id} [get]\nfunc GetStringByInt(w http.ResponseWriter, r *http.Request) {}\n"
  },
  {
    "path": "pkg/golinters/swaggo/testdata/swaggo.go",
    "content": "//golangcitest:config_path testdata/swaggo.yml\npackage api\n\nimport \"net/http\"\n\n// want +1 \"File is not properly formatted\"\n// @Summary Add a new pet to the store\n// @Description get string by ID\n// @ID get-string-by-int\n// @Accept  json\n// @Produce  json\n// @Param   some_id      path   int     true  \"Some ID\" Format(int64)\n// @Param   some_id      body web.Pet true  \"Some ID\"\n// @Success 200 {string} string\t\"ok\"\n// @Failure 400 {object} web.APIError \"We need ID!!\"\n// @Failure 404 {object} web.APIError \"Can not find ID\"\n// @Router /testapi/get-string-by-int/{some_id} [get]\nfunc GetStringByInt(w http.ResponseWriter, r *http.Request) {}\n"
  },
  {
    "path": "pkg/golinters/swaggo/testdata/swaggo.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - swaggo\n"
  },
  {
    "path": "pkg/golinters/tagalign/tagalign.go",
    "content": "package tagalign\n\nimport (\n\t\"github.com/4meepo/tagalign\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.TagAlignSettings) *goanalysis.Linter {\n\tvar options []tagalign.Option\n\n\tif settings != nil {\n\t\toptions = append(options, tagalign.WithAlign(settings.Align))\n\n\t\tif settings.Sort || len(settings.Order) > 0 {\n\t\t\toptions = append(options, tagalign.WithSort(settings.Order...))\n\t\t}\n\n\t\t// Strict style will be applied only if Align and Sort are enabled together.\n\t\tif settings.Strict && settings.Align && settings.Sort {\n\t\t\toptions = append(options, tagalign.WithStrictStyle())\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(tagalign.NewAnalyzer(options...)).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/tagalign_integration_test.go",
    "content": "package tagalign\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/fix/in/tagalign.go",
    "content": "//golangcitest:args -Etagalign\n//golangcitest:config_path testdata/tagalign_strict.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"time\"\n\ntype TagAlignExampleStrictKO struct {\n\tFoo    time.Time `json:\"foo,omitempty\" validate:\"required\" zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" validate:\"required\" zip:\"fooBar\" xml:\"fooBar\" json:\"fooBar,omitempty\" yaml:\"fooBar\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/fix/out/tagalign.go",
    "content": "//golangcitest:args -Etagalign\n//golangcitest:config_path testdata/tagalign_strict.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"time\"\n\ntype TagAlignExampleStrictKO struct {\n\tFoo    time.Time `                     json:\"foo,omitempty\"    validate:\"required\"                            zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" json:\"fooBar,omitempty\" validate:\"required\" xml:\"fooBar\" yaml:\"fooBar\" zip:\"fooBar\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign.go",
    "content": "//golangcitest:args -Etagalign\npackage testdata\n\nimport \"time\"\n\ntype TagAlignExampleAlignSort struct {\n\tFoo    time.Duration `json:\"foo,omitempty\" yaml:\"foo\" xml:\"foo\" binding:\"required\" gorm:\"column:foo\" zip:\"foo\" validate:\"required\"`                   // want `binding:\"required\" gorm:\"column:foo\"    json:\"foo,omitempty\"    validate:\"required\" xml:\"foo\"    yaml:\"foo\"    zip:\"foo\"`\n\tBar    int           `validate:\"required\"  yaml:\"bar\" xml:\"bar\" binding:\"required\" json:\"bar,omitempty\" gorm:\"column:bar\" zip:\"bar\" `                 // want `binding:\"required\" gorm:\"column:bar\"    json:\"bar,omitempty\"    validate:\"required\" xml:\"bar\"    yaml:\"bar\"    zip:\"bar\"`\n\tFooBar int           `gorm:\"column:fooBar\" validate:\"required\"   xml:\"fooBar\" binding:\"required\" json:\"fooBar,omitempty\"  zip:\"fooBar\" yaml:\"fooBar\"` // want `binding:\"required\" gorm:\"column:fooBar\" json:\"fooBar,omitempty\" validate:\"required\" xml:\"fooBar\" yaml:\"fooBar\" zip:\"fooBar\"`\n}\n\ntype TagAlignExampleAlignSort2 struct {\n\tFoo int ` xml:\"foo\"  json:\"foo,omitempty\" yaml:\"foo\"  zip:\"foo\"  binding:\"required\" gorm:\"column:foo\"  validate:\"required\"` // want `binding:\"required\" gorm:\"column:foo\" json:\"foo,omitempty\" validate:\"required\" xml:\"foo\" yaml:\"foo\" zip:\"foo\"`\n\tBar int `validate:\"required\" gorm:\"column:bar\"  yaml:\"bar\" xml:\"bar\" binding:\"required\" json:\"bar\" zip:\"bar\" `              // want `binding:\"required\" gorm:\"column:bar\" json:\"bar\"           validate:\"required\" xml:\"bar\" yaml:\"bar\" zip:\"bar\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_align_only.go",
    "content": "//golangcitest:args -Etagalign\n//golangcitest:config_path testdata/tagalign_align_only.yml\npackage testdata\n\nimport \"time\"\n\ntype TagAlignExampleAlignOnlyKO struct {\n\tFoo    time.Time `gorm:\"column:foo\" json:\"foo,omitempty\" xml:\"foo\" yaml:\"foo\" zip:\"foo\"`                // want `gorm:\"column:foo\"    json:\"foo,omitempty\" xml:\"foo\"               yaml:\"foo\"   zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" zip:\"fooBar\" json:\"fooBar,omitempty\" xml:\"fooBar\" yaml:\"fooBar\"` // want  `gorm:\"column:fooBar\" zip:\"fooBar\"         json:\"fooBar,omitempty\" xml:\"fooBar\" yaml:\"fooBar\"`\n\tFooFoo struct {\n\t\tFoo    int    `json:\"foo\" yaml:\"foo\"`   // want `json:\"foo\"    yaml:\"foo\"`\n\t\tBar    int    `yaml:\"bar\"   json:\"bar\"` // want `yaml:\"bar\"    json:\"bar\"`\n\t\tBarBar string `json:\"barBar\" yaml:\"barBar\"`\n\t} `xml:\"fooFoo\" json:\"fooFoo\"`\n\tNoTag  struct{}\n\tBarBar struct{} `json:\"barBar,omitempty\" gorm:\"column:barBar\" yaml:\"barBar\" xml:\"barBar\" zip:\"barBar\"`\n\tBoo    struct{} `gorm:\"column:boo\" json:\"boo,omitempty\" xml:\"boo\" yaml:\"boo\" zip:\"boo\"` // want `gorm:\"column:boo\"       json:\"boo,omitempty\" xml:\"boo\"     yaml:\"boo\"   zip:\"boo\"`\n}\n\ntype TagAlignExampleAlignOnlyOK struct {\n\tFoo    time.Time `gorm:\"column:foo\"    json:\"foo,omitempty\" xml:\"foo\"               yaml:\"foo\"   zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" zip:\"fooBar\"         json:\"fooBar,omitempty\" xml:\"fooBar\" yaml:\"fooBar\"`\n\tFooFoo struct {\n\t\tFoo    int    `json:\"foo\"    yaml:\"foo\"`\n\t\tBar    int    `yaml:\"bar\"    json:\"bar\"`\n\t\tBarBar string `json:\"barBar\" yaml:\"barBar\"`\n\t} `xml:\"fooFoo\" json:\"fooFoo\"`\n\tNoTag  struct{}\n\tBarBar struct{} `json:\"barBar,omitempty\" gorm:\"column:barBar\" yaml:\"barBar\" xml:\"barBar\" zip:\"barBar\"`\n\tBoo    struct{} `gorm:\"column:boo\"       json:\"boo,omitempty\" xml:\"boo\"     yaml:\"boo\"   zip:\"boo\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_align_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    tagalign:\n      sort: false\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_cgo.go",
    "content": "//golangcitest:args -Etagalign\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype TagAlignExampleAlignSort struct {\n\tFoo    time.Duration `json:\"foo,omitempty\" yaml:\"foo\" xml:\"foo\" binding:\"required\" gorm:\"column:foo\" zip:\"foo\" validate:\"required\"`                   // want `binding:\"required\" gorm:\"column:foo\"    json:\"foo,omitempty\"    validate:\"required\" xml:\"foo\"    yaml:\"foo\"    zip:\"foo\"`\n\tBar    int           `validate:\"required\"  yaml:\"bar\" xml:\"bar\" binding:\"required\" json:\"bar,omitempty\" gorm:\"column:bar\" zip:\"bar\" `                 // want `binding:\"required\" gorm:\"column:bar\"    json:\"bar,omitempty\"    validate:\"required\" xml:\"bar\"    yaml:\"bar\"    zip:\"bar\"`\n\tFooBar int           `gorm:\"column:fooBar\" validate:\"required\"   xml:\"fooBar\" binding:\"required\" json:\"fooBar,omitempty\"  zip:\"fooBar\" yaml:\"fooBar\"` // want `binding:\"required\" gorm:\"column:fooBar\" json:\"fooBar,omitempty\" validate:\"required\" xml:\"fooBar\" yaml:\"fooBar\" zip:\"fooBar\"`\n}\n\ntype TagAlignExampleAlignSort2 struct {\n\tFoo int ` xml:\"foo\"  json:\"foo,omitempty\" yaml:\"foo\"  zip:\"foo\"  binding:\"required\" gorm:\"column:foo\"  validate:\"required\"` // want `binding:\"required\" gorm:\"column:foo\" json:\"foo,omitempty\" validate:\"required\" xml:\"foo\" yaml:\"foo\" zip:\"foo\"`\n\tBar int `validate:\"required\" gorm:\"column:bar\"  yaml:\"bar\" xml:\"bar\" binding:\"required\" json:\"bar\" zip:\"bar\" `              // want `binding:\"required\" gorm:\"column:bar\" json:\"bar\"           validate:\"required\" xml:\"bar\" yaml:\"bar\" zip:\"bar\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_order_only.go",
    "content": "//golangcitest:args -Etagalign\n//golangcitest:config_path testdata/tagalign_order_only.yml\npackage testdata\n\nimport \"time\"\n\ntype TagAlignExampleOrderOnlyKO struct {\n\tFoo    time.Time `xml:\"foo\" json:\"foo,omitempty\" yaml:\"foo\" zip:\"foo\" gorm:\"column:foo\" validate:\"required\"`                // want `xml:\"foo\" json:\"foo,omitempty\" yaml:\"foo\" gorm:\"column:foo\" validate:\"required\" zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" validate:\"required\" zip:\"fooBar\" xml:\"fooBar\" json:\"fooBar,omitempty\" yaml:\"fooBar\"` // want `xml:\"fooBar\" json:\"fooBar,omitempty\" yaml:\"fooBar\" gorm:\"column:fooBar\" validate:\"required\" zip:\"fooBar\"`\n}\n\ntype TagAlignExampleOrderOnlyOK struct {\n\tFoo    time.Time `xml:\"foo\" json:\"foo,omitempty\" yaml:\"foo\" gorm:\"column:foo\" validate:\"required\" zip:\"foo\"`\n\tFooBar struct{}  `xml:\"fooBar\" json:\"fooBar,omitempty\" yaml:\"fooBar\" gorm:\"column:fooBar\" validate:\"required\" zip:\"fooBar\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_order_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    tagalign:\n      align: false\n      order:\n        - \"xml\"\n        - \"json\"\n        - \"yaml\"\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_sort_only.go",
    "content": "//golangcitest:args -Etagalign\n//golangcitest:config_path testdata/tagalign_sort_only.yml\npackage testdata\n\nimport \"time\"\n\ntype TagAlignExampleSortOnlyKO struct {\n\tFoo    time.Time `xml:\"foo\" json:\"foo,omitempty\" yaml:\"foo\" gorm:\"column:foo\" validate:\"required\" zip:\"foo\"`                // want `gorm:\"column:foo\" json:\"foo,omitempty\" validate:\"required\" xml:\"foo\" yaml:\"foo\" zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" validate:\"required\" zip:\"fooBar\" xml:\"fooBar\" json:\"fooBar,omitempty\" yaml:\"fooBar\"` // want `gorm:\"column:fooBar\" json:\"fooBar,omitempty\" validate:\"required\" xml:\"fooBar\" yaml:\"fooBar\" zip:\"fooBar\"`\n}\n\ntype TagAlignExampleSortOnlyOK struct {\n\tFoo    time.Time `gorm:\"column:foo\" json:\"foo,omitempty\" validate:\"required\" xml:\"foo\" yaml:\"foo\" zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" json:\"fooBar,omitempty\" validate:\"required\" xml:\"fooBar\" yaml:\"fooBar\" zip:\"fooBar\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_sort_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    tagalign:\n      align: false\n      sort: true\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_strict.go",
    "content": "//golangcitest:args -Etagalign\n//golangcitest:config_path testdata/tagalign_strict.yml\npackage testdata\n\nimport \"time\"\n\ntype TagAlignExampleStrictKO struct {\n\tFoo    time.Time `json:\"foo,omitempty\" validate:\"required\" zip:\"foo\"`                                                       // want `                     json:\"foo,omitempty\"    validate:\"required\"                            zip:\"foo\"`\n\tFooBar struct{}  `gorm:\"column:fooBar\" validate:\"required\" zip:\"fooBar\" xml:\"fooBar\" json:\"fooBar,omitempty\" yaml:\"fooBar\"` // want `gorm:\"column:fooBar\" json:\"fooBar,omitempty\" validate:\"required\" xml:\"fooBar\" yaml:\"fooBar\" zip:\"fooBar\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagalign/testdata/tagalign_strict.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    tagalign:\n      align: true\n      sort: true\n      strict: true\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/tagliatelle.go",
    "content": "package tagliatelle\n\nimport (\n\t\"maps\"\n\t\"strings\"\n\n\t\"github.com/ldez/tagliatelle\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.TagliatelleSettings) *goanalysis.Linter {\n\tcfg := tagliatelle.Config{\n\t\tBase: tagliatelle.Base{\n\t\t\tRules: map[string]string{\n\t\t\t\t\"json\":   \"camel\",\n\t\t\t\t\"yaml\":   \"camel\",\n\t\t\t\t\"header\": \"header\",\n\t\t\t},\n\t\t},\n\t}\n\n\tif settings != nil {\n\t\tmaps.Copy(cfg.Rules, settings.Case.Rules)\n\n\t\tcfg.ExtendedRules = toExtendedRules(settings.Case.ExtendedRules)\n\t\tcfg.UseFieldName = settings.Case.UseFieldName\n\t\tcfg.IgnoredFields = settings.Case.IgnoredFields\n\n\t\tfor _, override := range settings.Case.Overrides {\n\t\t\tcfg.Overrides = append(cfg.Overrides, tagliatelle.Overrides{\n\t\t\t\tBase: tagliatelle.Base{\n\t\t\t\t\tRules:         override.Rules,\n\t\t\t\t\tExtendedRules: toExtendedRules(override.ExtendedRules),\n\t\t\t\t\tUseFieldName:  override.UseFieldName,\n\t\t\t\t\tIgnoredFields: override.IgnoredFields,\n\t\t\t\t\tIgnore:        override.Ignore,\n\t\t\t\t},\n\t\t\t\tPackage: override.Package,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(tagliatelle.New(cfg)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc toExtendedRules(src map[string]config.TagliatelleExtendedRule) map[string]tagliatelle.ExtendedRule {\n\tresult := make(map[string]tagliatelle.ExtendedRule, len(src))\n\n\tfor k, v := range src {\n\t\tinitialismOverrides := make(map[string]bool, len(v.InitialismOverrides))\n\t\tfor ki, vi := range v.InitialismOverrides {\n\t\t\tinitialismOverrides[strings.ToUpper(ki)] = vi\n\t\t}\n\n\t\tresult[k] = tagliatelle.ExtendedRule{\n\t\t\tCase:                v.Case,\n\t\t\tExtraInitialisms:    v.ExtraInitialisms,\n\t\t\tInitialismOverrides: initialismOverrides,\n\t\t}\n\t}\n\n\treturn result\n}\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/tagliatelle_integration_test.go",
    "content": "package tagliatelle\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/testdata/tagliatelle.go",
    "content": "//golangcitest:args -Etagliatelle\npackage testdata\n\nimport \"time\"\n\ntype TglFoo struct {\n\tID     string        `json:\"ID\"`     // want `json\\(camel\\): got 'ID' want 'id'`\n\tUserID string        `json:\"UserID\"` // want `json\\(camel\\): got 'UserID' want 'userId'`\n\tName   string        `json:\"name\"`\n\tValue  time.Duration `json:\"value,omitempty\"`\n\tBar    TglBar        `json:\"bar\"`\n\tBur    `json:\"bur\"`\n}\n\ntype TglBar struct {\n\tName                 string  `json:\"-\"`\n\tValue                string  `json:\"value\"`\n\tCommonServiceFooItem *TglBir `json:\"CommonServiceItem,omitempty\"` // want `json\\(camel\\): got 'CommonServiceItem' want 'commonServiceItem'`\n}\n\ntype TglBir struct {\n\tName             string   `json:\"-\"`\n\tValue            string   `json:\"value\"`\n\tReplaceAllowList []string `mapstructure:\"replace-allow-list\"`\n}\n\ntype Bur struct {\n\tName    string\n\tValue   string `yaml:\"Value\"` // want `yaml\\(camel\\): got 'Value' want 'value'`\n\tMore    string `json:\"-\"`\n\tAlso    string `json:\"also,omitempty\"`\n\tReqPerS string `avro:\"req_per_s\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/testdata/tagliatelle_cgo.go",
    "content": "//golangcitest:args -Etagliatelle\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype TglFoo struct {\n\tID     string        `json:\"ID\"`     // want `json\\(camel\\): got 'ID' want 'id'`\n\tUserID string        `json:\"UserID\"` // want `json\\(camel\\): got 'UserID' want 'userId'`\n\tName   string        `json:\"name\"`\n\tValue  time.Duration `json:\"value,omitempty\"`\n\tBar    TglBar        `json:\"bar\"`\n\tBur    `json:\"bur\"`\n}\n\ntype TglBar struct {\n\tName                 string  `json:\"-\"`\n\tValue                string  `json:\"value\"`\n\tCommonServiceFooItem *TglBir `json:\"CommonServiceItem,omitempty\"` // want `json\\(camel\\): got 'CommonServiceItem' want 'commonServiceItem'`\n}\n\ntype TglBir struct {\n\tName             string   `json:\"-\"`\n\tValue            string   `json:\"value\"`\n\tReplaceAllowList []string `mapstructure:\"replace-allow-list\"`\n}\n\ntype Bur struct {\n\tName    string\n\tValue   string `yaml:\"Value\"` // want `yaml\\(camel\\): got 'Value' want 'value'`\n\tMore    string `json:\"-\"`\n\tAlso    string `json:\"also,omitempty\"`\n\tReqPerS string `avro:\"req_per_s\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/testdata/tagliatelle_ignored_fields.go",
    "content": "//golangcitest:args -Etagliatelle\n//golangcitest:config_path testdata/tagliatelle_ignored_fields.yml\npackage testdata\n\nimport \"time\"\n\ntype TglFoo struct {\n\tID     string        `json:\"ID\"`     // want `json\\(camel\\): got 'ID' want 'id'`\n\tUserID string        `json:\"UserID\"` // want `json\\(camel\\): got 'UserID' want 'userId'`\n\tName   string        `json:\"name\"`\n\tValue  time.Duration `json:\"value,omitempty\"`\n\tBar    TglBar        `json:\"bar\"`\n\tBur    `json:\"bur\"`\n}\n\ntype TglBar struct {\n\tName                 string  `json:\"-\"`\n\tValue                string  `json:\"value\"`\n\tCommonServiceFooItem *TglBir `json:\"CommonServiceItem,omitempty\"`\n}\n\ntype TglBir struct {\n\tName             string   `json:\"-\"`\n\tValue            string   `json:\"value\"`\n\tReplaceAllowList []string `mapstructure:\"replace-allow-list\"`\n}\n\ntype Bur struct {\n\tName    string\n\tValue   string `yaml:\"Value\"` // want `yaml\\(camel\\): got 'Value' want 'value'`\n\tMore    string `json:\"-\"`\n\tAlso    string `json:\"also,omitempty\"`\n\tReqPerS string `avro:\"req_per_s\"`\n}\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/testdata/tagliatelle_ignored_fields.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    tagliatelle:\n      case:\n        ignored-fields:\n          - CommonServiceFooItem\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/testdata/tagliatelle_initialism_overrides.go",
    "content": "//golangcitest:args -Etagliatelle\n//golangcitest:config_path testdata/tagliatelle_initialism_overrides.yml\npackage testdata\n\ntype Foo struct {\n\tUserAMQP   string `json:\"useAmqp\"` // want `json\\(camel\\): got 'useAmqp' want 'useAMQP'`\n\tFooLHS     string `json:\"fooLhs\"`\n\tFooRHS     string `json:\"fooRhs\"`     // want `json\\(camel\\): got 'fooRhs' want 'fooRHS'`\n\tSomeAWSKey string `json:\"someAwsKey\"` // want `json\\(camel\\): got 'someAwsKey' want 'someAWSKey'`\n}\n"
  },
  {
    "path": "pkg/golinters/tagliatelle/testdata/tagliatelle_initialism_overrides.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    tagliatelle:\n      case:\n        rules:\n          json: camel\n        extended-rules:\n          json:\n            case: camel\n            extra-initialisms: true\n            initialism-overrides:\n              LHS: false\n              RHS: true\n              AWS: true\n"
  },
  {
    "path": "pkg/golinters/testableexamples/testableexamples.go",
    "content": "package testableexamples\n\nimport (\n\t\"github.com/maratori/testableexamples/pkg/testableexamples\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(testableexamples.NewAnalyzer()).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/testableexamples/testableexamples_integration_test.go",
    "content": "package testableexamples\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/testableexamples/testdata/testableexamples_test.go",
    "content": "//golangcitest:args -Etestableexamples\npackage testdata\n\nimport \"fmt\"\n\nfunc Example_good() {\n\tfmt.Println(\"hello\")\n\t// Output: hello\n}\n\nfunc Example_goodEmptyOutput() {\n\tfmt.Println(\"\")\n\t// Output:\n}\n\nfunc Example_bad() { // want `^missing output for example, go test can't validate it$`\n\tfmt.Println(\"hello\")\n}\n\n//nolint:testableexamples\nfunc Example_nolint() {\n\tfmt.Println(\"hello\")\n}\n"
  },
  {
    "path": "pkg/golinters/testableexamples/testdata/testableexamples_test_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Etestableexamples\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc Example_good() {\n\tfmt.Println(\"hello\")\n\t// Output: hello\n}\n\nfunc Example_goodEmptyOutput() {\n\tfmt.Println(\"\")\n\t// Output:\n}\n\nfunc Example_bad() { // want `^missing output for example, go test can't validate it$`\n\tfmt.Println(\"hello\")\n}\n\n//nolint:testableexamples\nfunc Example_nolint() {\n\tfmt.Println(\"hello\")\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/fix/in/testifylint.go",
    "content": "//golangcitest:args -Etestifylint\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/stretchr/testify/suite\"\n)\n\ntype Bool bool\n\nfunc TestTestifylint(t *testing.T) {\n\tvar (\n\t\tpredicate   bool\n\t\tresultInt   int\n\t\tresultFloat float64\n\t\tarr         []string\n\t\terr         error\n\t)\n\n\tassert.Equal(t, predicate, true)        // want \"bool-compare: use assert\\\\.True\"\n\tassert.Equal(t, Bool(predicate), false) // want \"bool-compare: use assert\\\\.False\"\n\tassert.True(t, resultInt == 1)          // want \"compares: use assert\\\\.Equal\"\n\tassert.Equal(t, len(arr), 0)            // want \"empty: use assert\\\\.Empty\"\n\tassert.Error(t, err, io.EOF)            // want \"error-is-as: invalid usage of assert\\\\.Error, use assert\\\\.ErrorIs instead\"\n\tassert.Nil(t, err)                      // want \"error-nil: use assert\\\\.NoError\"\n\tassert.Equal(t, resultInt, 42)          // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Equal(t, resultFloat, 42.42)     // want \"float-compare: use assert\\\\.InEpsilon \\\\(or InDelta\\\\)\"\n\tassert.Equal(t, len(arr), 10)           // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Equal(t, 10, len(arr))           // want \"len: use assert\\\\.Len\"\n\n\tassert.True(t, predicate)\n\tassert.Equal(t, resultInt, 1) // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Empty(t, arr)\n\tassert.ErrorIs(t, err, io.EOF) // want \"require-error: for error assertions use require\"\n\tassert.NoError(t, err)         // want \"require-error: for error assertions use require\"\n\tassert.Equal(t, 42, resultInt)\n\tassert.InEpsilon(t, 42.42, resultFloat, 0.0001)\n\tassert.Len(t, arr, 10)\n\n\trequire.ErrorIs(t, err, io.EOF)\n\trequire.NoError(t, err)\n\n\tt.Run(\"formatted\", func(t *testing.T) {\n\t\tassert.Equal(t, predicate, true, \"message\")         // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.Equal(t, predicate, true, \"message %d\", 42)  // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.Equalf(t, predicate, true, \"message\")        // want \"bool-compare: use assert\\\\.Truef\"\n\t\tassert.Equalf(t, predicate, true, \"message %d\", 42) // want \"bool-compare: use assert\\\\.Truef\"\n\n\t\tassert.Equal(t, 1, 2, fmt.Sprintf(\"msg\"))     // want \"formatter: remove unnecessary fmt\\\\.Sprintf\"\n\t\tassert.Equalf(t, 1, 2, \"msg with arg\", \"arg\") // want \"formatter: assert\\\\.Equalf call has arguments but no formatting directives\"\n\t})\n\n\tassert.Equal(t, arr, nil) // want \"nil-compare: use assert\\\\.Nil\"\n\tassert.Nil(t, arr)\n\n\tgo func() {\n\t\tif assert.Error(t, err) {\n\t\t\trequire.ErrorIs(t, err, io.EOF) // want \"go-require: require must only be used in the goroutine running the test function\"\n\t\t}\n\t}()\n}\n\ntype SuiteExample struct {\n\tsuite.Suite\n}\n\nfunc TestSuiteExample(t *testing.T) {\n\tsuite.Run(t, new(SuiteExample))\n}\n\nfunc (s *SuiteExample) TestAll() {\n\tvar b bool\n\ts.Assert().True(b) // want \"suite-extra-assert-call: need to simplify the assertion to s\\\\.True\"\n}\n\nfunc (s *SuiteExample) TestOne() {\n\ts.T().Parallel() // want \"suite-broken-parallel: testify v1 does not support suite's parallel tests and subtests\"\n\n\ts.T().Run(\"subtest\", func(t *testing.T) { // want \"suite-subtest-run: use s\\\\.Run to run subtest\"\n\t\tt.Parallel() // want \"suite-broken-parallel: testify v1 does not support suite's parallel tests and subtests\"\n\n\t\tassert.Equal(s.T(), 1, 2) // want \"suite-dont-use-pkg: use s\\\\.Equal\"\n\t\ts.Equal(1, 2)\n\t})\n\n\ts.Run(\"subtest\", func() {\n\t\ts.T().Parallel() // want \"suite-broken-parallel: testify v1 does not support suite's parallel tests and subtests\"\n\t\ts.Equal(1, 2)\n\t})\n\n\tvar b bool\n\ts.Assert().True(b) // want \"suite-extra-assert-call: need to simplify the assertion to s\\\\.True\"\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/fix/out/testifylint.go",
    "content": "//golangcitest:args -Etestifylint\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/stretchr/testify/suite\"\n)\n\ntype Bool bool\n\nfunc TestTestifylint(t *testing.T) {\n\tvar (\n\t\tpredicate   bool\n\t\tresultInt   int\n\t\tresultFloat float64\n\t\tarr         []string\n\t\terr         error\n\t)\n\n\tassert.True(t, predicate)              // want \"bool-compare: use assert\\\\.True\"\n\tassert.False(t, bool(Bool(predicate))) // want \"bool-compare: use assert\\\\.False\"\n\tassert.Equal(t, resultInt, 1)          // want \"compares: use assert\\\\.Equal\"\n\tassert.Empty(t, arr)                   // want \"empty: use assert\\\\.Empty\"\n\tassert.ErrorIs(t, err, io.EOF)         // want \"error-is-as: invalid usage of assert\\\\.Error, use assert\\\\.ErrorIs instead\"\n\tassert.NoError(t, err)                 // want \"error-nil: use assert\\\\.NoError\"\n\tassert.Equal(t, 42, resultInt)         // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Equal(t, resultFloat, 42.42)    // want \"float-compare: use assert\\\\.InEpsilon \\\\(or InDelta\\\\)\"\n\tassert.Equal(t, 10, len(arr))          // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Len(t, arr, 10)                 // want \"len: use assert\\\\.Len\"\n\n\tassert.True(t, predicate)\n\tassert.Equal(t, 1, resultInt) // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Empty(t, arr)\n\tassert.ErrorIs(t, err, io.EOF) // want \"require-error: for error assertions use require\"\n\tassert.NoError(t, err)         // want \"require-error: for error assertions use require\"\n\tassert.Equal(t, 42, resultInt)\n\tassert.InEpsilon(t, 42.42, resultFloat, 0.0001)\n\tassert.Len(t, arr, 10)\n\n\trequire.ErrorIs(t, err, io.EOF)\n\trequire.NoError(t, err)\n\n\tt.Run(\"formatted\", func(t *testing.T) {\n\t\tassert.True(t, predicate, \"message\")         // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.True(t, predicate, \"message %d\", 42)  // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.Truef(t, predicate, \"message\")        // want \"bool-compare: use assert\\\\.Truef\"\n\t\tassert.Truef(t, predicate, \"message %d\", 42) // want \"bool-compare: use assert\\\\.Truef\"\n\n\t\tassert.Equal(t, 1, 2, \"msg\")                  // want \"formatter: remove unnecessary fmt\\\\.Sprintf\"\n\t\tassert.Equalf(t, 1, 2, \"msg with arg\", \"arg\") // want \"formatter: assert\\\\.Equalf call has arguments but no formatting directives\"\n\t})\n\n\tassert.Nil(t, arr) // want \"nil-compare: use assert\\\\.Nil\"\n\tassert.Nil(t, arr)\n\n\tgo func() {\n\t\tif assert.Error(t, err) {\n\t\t\trequire.ErrorIs(t, err, io.EOF) // want \"go-require: require must only be used in the goroutine running the test function\"\n\t\t}\n\t}()\n}\n\ntype SuiteExample struct {\n\tsuite.Suite\n}\n\nfunc TestSuiteExample(t *testing.T) {\n\tsuite.Run(t, new(SuiteExample))\n}\n\nfunc (s *SuiteExample) TestAll() {\n\tvar b bool\n\ts.True(b) // want \"suite-extra-assert-call: need to simplify the assertion to s\\\\.True\"\n}\n\nfunc (s *SuiteExample) TestOne() {\n\n\ts.T().Run(\"subtest\", func(t *testing.T) { // want \"suite-subtest-run: use s\\\\.Run to run subtest\"\n\n\t\ts.Equal(1, 2) // want \"suite-dont-use-pkg: use s\\\\.Equal\"\n\t\ts.Equal(1, 2)\n\t})\n\n\ts.Run(\"subtest\", func() {\n\t\ts.Equal(1, 2)\n\t})\n\n\tvar b bool\n\ts.True(b) // want \"suite-extra-assert-call: need to simplify the assertion to s\\\\.True\"\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint.go",
    "content": "//golangcitest:args -Etestifylint\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/stretchr/testify/suite\"\n)\n\ntype Bool bool\n\nfunc TestTestifylint(t *testing.T) {\n\tvar (\n\t\tpredicate   bool\n\t\tresultInt   int\n\t\tresultFloat float64\n\t\tarr         []string\n\t\terr         error\n\t)\n\n\tassert.Equal(t, predicate, true)        // want \"bool-compare: use assert\\\\.True\"\n\tassert.Equal(t, Bool(predicate), false) // want \"bool-compare: use assert\\\\.False\"\n\tassert.True(t, resultInt == 1)          // want \"compares: use assert\\\\.Equal\"\n\tassert.Equal(t, len(arr), 0)            // want \"empty: use assert\\\\.Empty\"\n\tassert.Error(t, err, io.EOF)            // want \"error-is-as: invalid usage of assert\\\\.Error, use assert\\\\.ErrorIs instead\"\n\tassert.Nil(t, err)                      // want \"error-nil: use assert\\\\.NoError\"\n\tassert.Equal(t, resultInt, 42)          // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Equal(t, resultFloat, 42.42)     // want \"float-compare: use assert\\\\.InEpsilon \\\\(or InDelta\\\\)\"\n\tassert.Equal(t, len(arr), 10)           // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Equal(t, 10, len(arr))           // want \"len: use assert\\\\.Len\"\n\n\tassert.True(t, predicate)\n\tassert.Equal(t, resultInt, 1) // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Empty(t, arr)\n\tassert.ErrorIs(t, err, io.EOF) // want \"require-error: for error assertions use require\"\n\tassert.NoError(t, err)         // want \"require-error: for error assertions use require\"\n\tassert.Equal(t, 42, resultInt)\n\tassert.InEpsilon(t, 42.42, resultFloat, 0.0001)\n\tassert.Len(t, arr, 10)\n\n\trequire.ErrorIs(t, err, io.EOF)\n\trequire.NoError(t, err)\n\n\tt.Run(\"formatted\", func(t *testing.T) {\n\t\tassert.Equal(t, predicate, true, \"message\")         // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.Equal(t, predicate, true, \"message %d\", 42)  // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.Equalf(t, predicate, true, \"message\")        // want \"bool-compare: use assert\\\\.Truef\"\n\t\tassert.Equalf(t, predicate, true, \"message %d\", 42) // want \"bool-compare: use assert\\\\.Truef\"\n\n\t\tassert.Equal(t, 1, 2, fmt.Sprintf(\"msg\"))     // want \"formatter: remove unnecessary fmt\\\\.Sprintf\"\n\t\tassert.Equalf(t, 1, 2, \"msg with arg\", \"arg\") // want \"formatter: assert\\\\.Equalf call has arguments but no formatting directives\"\n\t})\n\n\tassert.Equal(t, arr, nil) // want \"nil-compare: use assert\\\\.Nil\"\n\tassert.Nil(t, arr)\n\n\tgo func() {\n\t\tif assert.Error(t, err) {\n\t\t\trequire.ErrorIs(t, err, io.EOF) // want \"go-require: require must only be used in the goroutine running the test function\"\n\t\t}\n\t}()\n}\n\ntype SuiteExample struct {\n\tsuite.Suite\n}\n\nfunc TestSuiteExample(t *testing.T) {\n\tsuite.Run(t, new(SuiteExample))\n}\n\nfunc (s *SuiteExample) TestAll() {\n\tvar b bool\n\ts.Assert().True(b) // want \"suite-extra-assert-call: need to simplify the assertion to s\\\\.True\"\n}\n\nfunc (s *SuiteExample) TestOne() {\n\ts.T().Parallel() // want \"suite-broken-parallel: testify v1 does not support suite's parallel tests and subtests\"\n\n\ts.T().Run(\"subtest\", func(t *testing.T) { // want \"suite-subtest-run: use s\\\\.Run to run subtest\"\n\t\tt.Parallel() // want \"suite-broken-parallel: testify v1 does not support suite's parallel tests and subtests\"\n\n\t\tassert.Equal(s.T(), 1, 2) // want \"suite-dont-use-pkg: use s\\\\.Equal\"\n\t\ts.Equal(1, 2)\n\t})\n\n\ts.Run(\"subtest\", func() {\n\t\ts.T().Parallel() // want \"suite-broken-parallel: testify v1 does not support suite's parallel tests and subtests\"\n\t\ts.Equal(1, 2)\n\t})\n\n\tvar b bool\n\ts.Assert().True(b) // want \"suite-extra-assert-call: need to simplify the assertion to s\\\\.True\"\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_bool_compare_only.go",
    "content": "//golangcitest:args -Etestifylint\n//golangcitest:config_path testdata/testifylint_bool_compare_only.yml\npackage testdata\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype Bool bool\n\nfunc TestTestifylint(t *testing.T) {\n\tvar predicate bool\n\tassert.Equal(t, predicate, true) // want \"bool-compare: use assert\\\\.True\"\n\tassert.Equal(t, Bool(predicate), false)\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_bool_compare_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    testifylint:\n      disable-all: true\n      enable:\n        - bool-compare\n      bool-compare:\n        ignore-custom-types: true\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_cgo.go",
    "content": "//golangcitest:args -Etestifylint\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"testing\"\n\t\"unsafe\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\ntype Bool bool\n\nfunc TestTestifylint(t *testing.T) {\n\tvar (\n\t\tpredicate   bool\n\t\tresultInt   int\n\t\tresultFloat float64\n\t\tarr         []string\n\t\terr         error\n\t)\n\n\tassert.Equal(t, predicate, true)        // want \"bool-compare: use assert\\\\.True\"\n\tassert.Equal(t, Bool(predicate), false) // want \"bool-compare: use assert\\\\.False\"\n\tassert.True(t, resultInt == 1)          // want \"compares: use assert\\\\.Equal\"\n\tassert.Equal(t, len(arr), 0)            // want \"empty: use assert\\\\.Empty\"\n\tassert.Error(t, err, io.EOF)            // want \"error-is-as: invalid usage of assert\\\\.Error, use assert\\\\.ErrorIs instead\"\n\tassert.Nil(t, err)                      // want \"error-nil: use assert\\\\.NoError\"\n\tassert.Equal(t, resultInt, 42)          // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Equal(t, resultFloat, 42.42)     // want \"float-compare: use assert\\\\.InEpsilon \\\\(or InDelta\\\\)\"\n\tassert.Equal(t, len(arr), 10)           // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Equal(t, 10, len(arr))           // want \"len: use assert\\\\.Len\"\n\n\tassert.True(t, predicate)\n\tassert.Equal(t, resultInt, 1) // want \"expected-actual: need to reverse actual and expected values\"\n\tassert.Empty(t, arr)\n\tassert.ErrorIs(t, err, io.EOF) // want \"require-error: for error assertions use require\"\n\tassert.NoError(t, err)         // want \"require-error: for error assertions use require\"\n\tassert.Equal(t, 42, resultInt)\n\tassert.InEpsilon(t, 42.42, resultFloat, 0.0001)\n\tassert.Len(t, arr, 10)\n\n\trequire.ErrorIs(t, err, io.EOF)\n\trequire.NoError(t, err)\n\n\tt.Run(\"formatted\", func(t *testing.T) {\n\t\tassert.Equal(t, predicate, true, \"message\")         // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.Equal(t, predicate, true, \"message %d\", 42)  // want \"bool-compare: use assert\\\\.True\"\n\t\tassert.Equalf(t, predicate, true, \"message\")        // want \"bool-compare: use assert\\\\.Truef\"\n\t\tassert.Equalf(t, predicate, true, \"message %d\", 42) // want \"bool-compare: use assert\\\\.Truef\"\n\n\t\tassert.Equal(t, 1, 2, fmt.Sprintf(\"msg\"))     // want \"formatter: remove unnecessary fmt\\\\.Sprintf\"\n\t\tassert.Equalf(t, 1, 2, \"msg with arg\", \"arg\") // want \"formatter: assert\\\\.Equalf call has arguments but no formatting directives\"\n\t})\n\n\tassert.Equal(t, arr, nil) // want \"nil-compare: use assert\\\\.Nil\"\n\tassert.Nil(t, arr)\n\n\tgo func() {\n\t\tif assert.Error(t, err) {\n\t\t\trequire.ErrorIs(t, err, io.EOF) // want \"go-require: require must only be used in the goroutine running the test function\"\n\t\t}\n\t}()\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_formatter_dont_require_string_msg.go",
    "content": "//golangcitest:args -Etestifylint\n//golangcitest:config_path testdata/testifylint_formatter_dont_require_string_msg.yml\npackage testdata\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestTestifylint(t *testing.T) {\n\tvar b bool\n\tassert.True(t, b, b)\n\tassert.True(t, b, \"msg %v\", 1)\n\tassert.True(t, b, b, 1) // want \"formatter: using msgAndArgs with non-string first element \\\\(msg\\\\) causes panic\"\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_formatter_dont_require_string_msg.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    testifylint:\n      disable-all: true\n      enable:\n        - formatter\n      formatter:\n        check-format-string: false\n        require-f-funcs: false\n        require-string-msg: false\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_formatter_only.go",
    "content": "//golangcitest:args -Etestifylint\n//golangcitest:config_path testdata/testifylint_formatter_only.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestTestifylint(t *testing.T) {\n\tvar err error\n\tvar args []any\n\tvar b bool\n\tassert.Error(t, err, \"Parse(%v) should fail.\", args) // want \"formatter: use assert\\\\.Errorf$\"\n\n\tassert.Equal(t, 1, 2, fmt.Sprintf(\"msg\")) // want \"formatter: remove unnecessary fmt\\\\.Sprintf and use assert\\\\.Equalf\"\n\tassert.DirExistsf(t, \"\", \"msg with arg\", 42)\n\n\tassert.True(t, b, b)    // want \"formatter: do not use non-string value as first element \\\\(msg\\\\) of msgAndArgs\"\n\tassert.True(t, b, b, 1) // want \"formatter: using msgAndArgs with non-string first element \\\\(msg\\\\) causes panic\"\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_formatter_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    testifylint:\n      disable-all: true\n      enable:\n        - formatter\n      formatter:\n        check-format-string: false\n        require-f-funcs: true\n        require-string-msg: true\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_require_error_only.go",
    "content": "//golangcitest:args -Etestifylint\n//golangcitest:config_path testdata/testifylint_require_error_only.yml\npackage testdata\n\nimport (\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/stretchr/testify/suite\"\n)\n\nfunc TestTestifylint(t *testing.T) {\n\tvar (\n\t\tpredicate   bool\n\t\tresultInt   int\n\t\tresultFloat float64\n\t\tarr         []string\n\t\terr         error\n\t)\n\n\tassert.Equal(t, predicate, true)\n\tassert.True(t, resultInt == 1)\n\tassert.Equal(t, len(arr), 0)\n\tassert.Error(t, err, io.EOF)\n\tassert.Nil(t, err)\n\tassert.Equal(t, resultInt, 42)\n\tassert.Equal(t, resultFloat, 42.42)\n\tassert.Equal(t, len(arr), 10)\n\n\tassert.True(t, predicate)\n\tassert.Equal(t, resultInt, 1)\n\tassert.Empty(t, arr)\n\tassert.ErrorIs(t, err, io.EOF)\n\tassert.NoError(t, err) // want \"require-error: for error assertions use require\"\n\tassert.Equal(t, 42, resultInt)\n\tassert.NoErrorf(t, err, \"boom!\")\n\tassert.InEpsilon(t, 42.42, resultFloat, 0.0001)\n\tassert.Len(t, arr, 10)\n\n\trequire.ErrorIs(t, err, io.EOF)\n\trequire.NoError(t, err)\n\n\tt.Run(\"formatted\", func(t *testing.T) {\n\t\tassert.Equal(t, predicate, true, \"message\")\n\t\tassert.Equal(t, predicate, true, \"message %d\", 42)\n\t\tassert.Equalf(t, predicate, true, \"message\")\n\t\tassert.Equalf(t, predicate, true, \"message %d\", 42)\n\t})\n\n\tassert.Equal(t, arr, nil)\n\tassert.Nil(t, arr)\n\n\tgo func() {\n\t\tif assert.Error(t, err) {\n\t\t\trequire.ErrorIs(t, err, io.EOF)\n\t\t}\n\t}()\n}\n\ntype SuiteExample struct {\n\tsuite.Suite\n}\n\nfunc TestSuiteExample(t *testing.T) {\n\tsuite.Run(t, new(SuiteExample))\n}\n\nfunc (s *SuiteExample) TestAll() {\n\tvar b bool\n\ts.Assert().True(b)\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testdata/testifylint_require_error_only.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    testifylint:\n      disable-all: true\n      enable:\n        - require-error\n      require-error:\n        fn-pattern: ^NoError$\n"
  },
  {
    "path": "pkg/golinters/testifylint/testifylint.go",
    "content": "package testifylint\n\nimport (\n\t\"github.com/Antonboom/testifylint/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.TestifylintSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"enable-all\":  settings.EnableAll,\n\t\t\t\"disable-all\": settings.DisableAll,\n\n\t\t\t\"bool-compare.ignore-custom-types\": settings.BoolCompare.IgnoreCustomTypes,\n\t\t\t\"formatter.require-f-funcs\":        settings.Formatter.RequireFFuncs,\n\t\t\t\"formatter.require-string-msg\":     settings.Formatter.RequireStringMsg,\n\t\t\t\"go-require.ignore-http-handlers\":  settings.GoRequire.IgnoreHTTPHandlers,\n\t\t}\n\t\tif len(settings.EnabledCheckers) > 0 {\n\t\t\tcfg[\"enable\"] = settings.EnabledCheckers\n\t\t}\n\t\tif len(settings.DisabledCheckers) > 0 {\n\t\t\tcfg[\"disable\"] = settings.DisabledCheckers\n\t\t}\n\n\t\tif b := settings.Formatter.CheckFormatString; b != nil {\n\t\t\tcfg[\"formatter.check-format-string\"] = *b\n\t\t}\n\t\tif p := settings.ExpectedActual.ExpVarPattern; p != \"\" {\n\t\t\tcfg[\"expected-actual.pattern\"] = p\n\t\t}\n\t\tif p := settings.RequireError.FnPattern; p != \"\" {\n\t\t\tcfg[\"require-error.fn-pattern\"] = p\n\t\t}\n\t\tif m := settings.SuiteExtraAssertCall.Mode; m != \"\" {\n\t\t\tcfg[\"suite-extra-assert-call.mode\"] = m\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.New()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/testifylint/testifylint_integration_test.go",
    "content": "package testifylint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/testpackage/testdata/testpackage_test.go",
    "content": "//golangcitest:args -Etestpackage\npackage testdata // want \"package should be `testdata_test` instead of `testdata`\"\n"
  },
  {
    "path": "pkg/golinters/testpackage/testpackage.go",
    "content": "package testpackage\n\nimport (\n\t\"strings\"\n\n\t\"github.com/maratori/testpackage/pkg/testpackage\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.TestpackageSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\ttestpackage.SkipRegexpFlagName:    settings.SkipRegexp,\n\t\t\ttestpackage.AllowPackagesFlagName: strings.Join(settings.AllowPackages, \",\"),\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(testpackage.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/testpackage/testpackage_integration_test.go",
    "content": "package testpackage\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/thelper/testdata/thelper.go",
    "content": "//golangcitest:args -Ethelper\npackage testdata\n\nimport \"testing\"\n\nfunc thelperWithHelperAfterAssignment(t *testing.T) { // want \"test helper function should start from t.Helper()\"\n\t_ = 0\n\tt.Helper()\n}\n\nfunc thelperWithNotFirst(s string, t *testing.T, i int) { // want `parameter \\*testing.T should be the first`\n\tt.Helper()\n}\n\nfunc thelperWithIncorrectName(o *testing.T) { // want `parameter \\*testing.T should have name t`\n\to.Helper()\n}\n\nfunc bhelperWithHelperAfterAssignment(b *testing.B) { // want \"test helper function should start from b.Helper()\"\n\t_ = 0\n\tb.Helper()\n}\n\nfunc bhelperWithNotFirst(s string, b *testing.B, i int) { // want `parameter \\*testing.B should be the first`\n\tb.Helper()\n}\n\nfunc bhelperWithIncorrectName(o *testing.B) { // want `parameter \\*testing.B should have name b`\n\to.Helper()\n}\n\nfunc tbhelperWithHelperAfterAssignment(tb testing.TB) { // want \"test helper function should start from tb.Helper()\"\n\t_ = 0\n\ttb.Helper()\n}\n\nfunc tbhelperWithNotFirst(s string, tb testing.TB, i int) { // want `parameter testing.TB should be the first`\n\ttb.Helper()\n}\n\nfunc tbhelperWithIncorrectName(o testing.TB) { // want `parameter testing.TB should have name tb`\n\to.Helper()\n}\n\nfunc TestSubtestShouldNotBeChecked(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc string\n\t}{\n\t\t{\n\t\t\tdesc: \"example\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tt.Error(\"test\")\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/thelper/testdata/thelper.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    thelper:\n      test:\n        name: false\n        begin: true\n"
  },
  {
    "path": "pkg/golinters/thelper/testdata/thelper_cgo.go",
    "content": "//golangcitest:args -Ethelper\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"testing\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc thelperWithHelperAfterAssignment(t *testing.T) { // want \"test helper function should start from t.Helper()\"\n\t_ = 0\n\tt.Helper()\n}\n"
  },
  {
    "path": "pkg/golinters/thelper/testdata/thelper_fuzz.go",
    "content": "//golangcitest:args -Ethelper\npackage testdata\n\nimport \"testing\"\n\nfunc fhelperWithHelperAfterAssignment(f *testing.F) { // want \"test helper function should start from f.Helper()\"\n\t_ = 0\n\tf.Helper()\n}\n\nfunc fhelperWithNotFirst(s string, f *testing.F, i int) { // want `parameter \\*testing.F should be the first`\n\tf.Helper()\n}\n\nfunc fhelperWithIncorrectName(o *testing.F) { // want `parameter \\*testing.F should have name f`\n\to.Helper()\n}\n\nfunc FuzzSubtestShouldNotBeChecked(f *testing.F) {\n\tf.Add(5, \"hello\")\n\tf.Fuzz(func(t *testing.T, a int, b string) {})\n}\n"
  },
  {
    "path": "pkg/golinters/thelper/testdata/thelper_with_options.go",
    "content": "//golangcitest:args -Ethelper\n//golangcitest:config_path testdata/thelper.yml\npackage testdata\n\nimport \"testing\"\n\nfunc thelperWithHelperAfterAssignmentWO(t *testing.T) { // want \"test helper function should start from t.Helper()\"\n\t_ = 0\n\tt.Helper()\n}\n\nfunc thelperWithNotFirstWO(s string, t *testing.T, i int) { // want `parameter \\*testing.T should be the first`\n\tt.Helper()\n}\n\nfunc thelperWithIncorrectNameWO(o *testing.T) {\n\to.Helper()\n}\n"
  },
  {
    "path": "pkg/golinters/thelper/thelper.go",
    "content": "package thelper\n\nimport (\n\t\"maps\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/kulti/thelper/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc New(settings *config.ThelperSettings) *goanalysis.Linter {\n\topts := map[string]struct{}{\n\t\t\"t_name\":  {},\n\t\t\"t_begin\": {},\n\t\t\"t_first\": {},\n\n\t\t\"f_name\":  {},\n\t\t\"f_begin\": {},\n\t\t\"f_first\": {},\n\n\t\t\"b_name\":  {},\n\t\t\"b_begin\": {},\n\t\t\"b_first\": {},\n\n\t\t\"tb_name\":  {},\n\t\t\"tb_begin\": {},\n\t\t\"tb_first\": {},\n\t}\n\n\tif settings != nil {\n\t\tapplyTHelperOptions(settings.Test, \"t_\", opts)\n\t\tapplyTHelperOptions(settings.Fuzz, \"f_\", opts)\n\t\tapplyTHelperOptions(settings.Benchmark, \"b_\", opts)\n\t\tapplyTHelperOptions(settings.TB, \"tb_\", opts)\n\t}\n\n\tif len(opts) == 0 {\n\t\tinternal.LinterLogger.Fatalf(\"thelper: at least one option must be enabled\")\n\t}\n\n\targs := slices.Collect(maps.Keys(opts))\n\n\tcfg := map[string]any{\n\t\t\"checks\": strings.Join(args, \",\"),\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc applyTHelperOptions(o config.ThelperOptions, prefix string, opts map[string]struct{}) {\n\tif o.Name != nil {\n\t\tif !*o.Name {\n\t\t\tdelete(opts, prefix+\"name\")\n\t\t}\n\t}\n\n\tif o.Begin != nil {\n\t\tif !*o.Begin {\n\t\t\tdelete(opts, prefix+\"begin\")\n\t\t}\n\t}\n\n\tif o.First != nil {\n\t\tif !*o.First {\n\t\t\tdelete(opts, prefix+\"first\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/thelper/thelper_integration_test.go",
    "content": "package thelper\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/tparallel/testdata/tparallel_cgo.go",
    "content": "//golangcitest:args -Etparallel\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"testing\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc TestSubtests(t *testing.T) { // want \"TestSubtests's subtests should call t.Parallel\"\n\tt.Parallel()\n\n\tt.Run(\"\", func(t *testing.T) {\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/tparallel/testdata/tparallel_happy_path_test.go",
    "content": "//golangcitest:args -Etparallel\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"testing\"\n)\n\nfunc TestValidHappyPath(t *testing.T) {\n\tt.Parallel()\n\tt.Run(\"\", func(t *testing.T) {\n\t\tt.Parallel()\n\t})\n}\n\nfunc TestValidNoSubTest(t *testing.T) {\n\tt.Parallel()\n}\n"
  },
  {
    "path": "pkg/golinters/tparallel/testdata/tparallel_missing_subtest_test.go",
    "content": "//golangcitest:args -Etparallel\npackage testdata\n\nimport (\n\t\"testing\"\n)\n\nfunc TestSubtests(t *testing.T) { // want \"TestSubtests's subtests should call t.Parallel\"\n\tt.Parallel()\n\n\tt.Run(\"\", func(t *testing.T) {\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/tparallel/testdata/tparallel_missing_toplevel_test.go",
    "content": "//golangcitest:args -Etparallel\npackage testdata\n\nimport (\n\t\"testing\"\n)\n\nfunc TestTopLevel(t *testing.T) { // want \"TestTopLevel should call t.Parallel on the top level as well as its subtests\"\n\tt.Run(\"\", func(t *testing.T) {\n\t\tt.Parallel()\n\t})\n}\n"
  },
  {
    "path": "pkg/golinters/tparallel/tparallel.go",
    "content": "package tparallel\n\nimport (\n\t\"github.com/moricho/tparallel\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(tparallel.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/tparallel/tparallel_integration_test.go",
    "content": "package tparallel\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/typecheck.go",
    "content": "package golinters\n\nimport (\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc NewTypecheck() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: \"typecheck\",\n\t\t\tDoc:  \"Like the front-end of a Go compiler, parses and type-checks Go code\",\n\t\t\tRun:  goanalysis.DummyRun,\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeNone)\n}\n"
  },
  {
    "path": "pkg/golinters/unconvert/testdata/unconvert.go",
    "content": "//golangcitest:args -Eunconvert\npackage testdata\n\nimport \"io\"\n\n// Various explicit conversions of untyped constants\n// that cannot be removed.\nfunc _() {\n\tconst (\n\t\t_ = byte(0)\n\t\t_ = int((real)(0i))\n\t\t_ = complex64(complex(1, 2))\n\t\t_ = (bool)(true || false)\n\n\t\tPtrSize = 4 << (^uintptr(0) >> 63)\n\t\tc0      = uintptr(PtrSize)\n\t\tc1      = uintptr((8-PtrSize)/4*2860486313 + (PtrSize-4)/4*33054211828000289)\n\t)\n\n\ti := int64(0)\n\t_ = i\n}\n\n// Make sure we distinguish function calls from\n// conversion to function type.\nfunc _() {\n\ttype F func(F) int\n\tvar f F\n\n\t_ = F(F(nil)) // want \"unnecessary conversion\"\n\t_ = f(F(nil))\n}\n\n// Make sure we don't remove explicit conversions that\n// prevent fusing floating-point operation.\nfunc _() {\n\tvar f1, f2, f3, ftmp float64\n\t_ = f1 + float64(f2*f3)\n\tftmp = float64(f2 * f3)\n\t_ = f1 + ftmp\n\tftmp = f2 * f3\n\t_ = f1 + float64(ftmp)\n\n\tvar c1, c2, c3, ctmp complex128\n\t_ = c1 + complex128(c2*c3)\n\tctmp = complex128(c2 * c3)\n\t_ = c1 + ctmp\n\tctmp = c2 * c3\n\t_ = c1 + complex128(ctmp)\n}\n\n// Basic contains conversion errors for builtin data types\nfunc Basic() {\n\tvar vbool bool\n\tvar vbyte byte\n\tvar vcomplex128 complex128\n\tvar vcomplex64 complex64\n\tvar verror error\n\tvar vfloat32 float32\n\tvar vfloat64 float64\n\tvar vint int\n\tvar vint16 int16\n\tvar vint32 int32\n\tvar vint64 int64\n\tvar vint8 int8\n\tvar vrune rune\n\tvar vstring string\n\tvar vuint uint\n\tvar vuint16 uint16\n\tvar vuint32 uint32\n\tvar vuint64 uint64\n\tvar vuint8 uint8\n\tvar vuintptr uintptr\n\n\t_ = bool(vbool)       // want \"unnecessary conversion\"\n\t_ = byte(vbyte)       // want \"unnecessary conversion\"\n\t_ = error(verror)     // want \"unnecessary conversion\"\n\t_ = int(vint)         // want \"unnecessary conversion\"\n\t_ = int16(vint16)     // want \"unnecessary conversion\"\n\t_ = int32(vint32)     // want \"unnecessary conversion\"\n\t_ = int64(vint64)     // want \"unnecessary conversion\"\n\t_ = int8(vint8)       // want \"unnecessary conversion\"\n\t_ = rune(vrune)       // want \"unnecessary conversion\"\n\t_ = string(vstring)   // want \"unnecessary conversion\"\n\t_ = uint(vuint)       // want \"unnecessary conversion\"\n\t_ = uint16(vuint16)   // want \"unnecessary conversion\"\n\t_ = uint32(vuint32)   // want \"unnecessary conversion\"\n\t_ = uint64(vuint64)   // want \"unnecessary conversion\"\n\t_ = uint8(vuint8)     // want \"unnecessary conversion\"\n\t_ = uintptr(vuintptr) // want \"unnecessary conversion\"\n\n\t_ = float32(vfloat32)\n\t_ = float64(vfloat64)\n\t_ = complex128(vcomplex128)\n\t_ = complex64(vcomplex64)\n\n\t// Pointers\n\t_ = (*bool)(&vbool)             // want \"unnecessary conversion\"\n\t_ = (*byte)(&vbyte)             // want \"unnecessary conversion\"\n\t_ = (*complex128)(&vcomplex128) // want \"unnecessary conversion\"\n\t_ = (*complex64)(&vcomplex64)   // want \"unnecessary conversion\"\n\t_ = (*error)(&verror)           // want \"unnecessary conversion\"\n\t_ = (*float32)(&vfloat32)       // want \"unnecessary conversion\"\n\t_ = (*float64)(&vfloat64)       // want \"unnecessary conversion\"\n\t_ = (*int)(&vint)               // want \"unnecessary conversion\"\n\t_ = (*int16)(&vint16)           // want \"unnecessary conversion\"\n\t_ = (*int32)(&vint32)           // want \"unnecessary conversion\"\n\t_ = (*int64)(&vint64)           // want \"unnecessary conversion\"\n\t_ = (*int8)(&vint8)             // want \"unnecessary conversion\"\n\t_ = (*rune)(&vrune)             // want \"unnecessary conversion\"\n\t_ = (*string)(&vstring)         // want \"unnecessary conversion\"\n\t_ = (*uint)(&vuint)             // want \"unnecessary conversion\"\n\t_ = (*uint16)(&vuint16)         // want \"unnecessary conversion\"\n\t_ = (*uint32)(&vuint32)         // want \"unnecessary conversion\"\n\t_ = (*uint64)(&vuint64)         // want \"unnecessary conversion\"\n\t_ = (*uint8)(&vuint8)           // want \"unnecessary conversion\"\n\t_ = (*uintptr)(&vuintptr)       // want \"unnecessary conversion\"\n}\n\n// Counter is an int64\ntype Counter int64\n\n// ID is a typed identifier\ntype ID string\n\n// Metric is a struct\ntype Metric struct {\n\tID      ID\n\tCounter Counter\n}\n\n// Custom contains conversion errors for builtin data types\nfunc Custom() {\n\ttype Local struct{ id ID }\n\n\tvar counter Counter\n\tvar id ID\n\tvar m Metric\n\tvar local Local\n\tvar x struct{ id ID }\n\n\t_ = Counter(counter)     // want \"unnecessary conversion\"\n\t_ = ID(id)               // want \"unnecessary conversion\"\n\t_ = Metric(m)            // want \"unnecessary conversion\"\n\t_ = Local(local)         // want \"unnecessary conversion\"\n\t_ = (struct{ id ID })(x) // want \"unnecessary conversion\"\n\n\t// Pointers\n\t_ = (*Counter)(&counter)   // want \"unnecessary conversion\"\n\t_ = (*ID)(&id)             // want \"unnecessary conversion\"\n\t_ = (*Metric)(&m)          // want \"unnecessary conversion\"\n\t_ = (*Local)(&local)       // want \"unnecessary conversion\"\n\t_ = (*struct{ id ID })(&x) // want \"unnecessary conversion\"\n}\n\n// Interfaces contains conversion errors for interfaces\nfunc Interfaces() {\n\tvar writer io.Writer\n\n\t_ = (io.Writer)(writer)   // want \"unnecessary conversion\"\n\t_ = (*io.Writer)(&writer) // want \"unnecessary conversion\"\n}\n\n// Constructor is a func type\ntype Constructor func() ID\n\n// Funcs contains conversion errors for func types\nfunc Funcs() {\n\ttype Local func(ID)\n\ttype Recursive func(Recursive)\n\n\tvar ctor Constructor\n\tvar local Local\n\tvar recursive Recursive\n\n\t_ = Constructor(ctor)    // want \"unnecessary conversion\"\n\t_ = Local(local)         // want \"unnecessary conversion\"\n\t_ = Recursive(recursive) // want \"unnecessary conversion\"\n\n\t_ = (*Constructor)(&ctor)    // want \"unnecessary conversion\"\n\t_ = (*Local)(&local)         // want \"unnecessary conversion\"\n\t_ = (*Recursive)(&recursive) // want \"unnecessary conversion\"\n}\n"
  },
  {
    "path": "pkg/golinters/unconvert/testdata/unconvert_cgo.go",
    "content": "//golangcitest:args -Eunconvert\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\n// Various explicit conversions of untyped constants\n// that cannot be removed.\nfunc _() {\n\tconst (\n\t\t_ = byte(0)\n\t\t_ = int((real)(0i))\n\t\t_ = complex64(complex(1, 2))\n\t\t_ = (bool)(true || false)\n\n\t\tPtrSize = 4 << (^uintptr(0) >> 63)\n\t\tc0      = uintptr(PtrSize)\n\t\tc1      = uintptr((8-PtrSize)/4*2860486313 + (PtrSize-4)/4*33054211828000289)\n\t)\n\n\ti := int64(0)\n\t_ = i\n}\n\n// Make sure we distinguish function calls from\n// conversion to function type.\nfunc _() {\n\ttype F func(F) int\n\tvar f F\n\n\t_ = F(F(nil)) // want \"unnecessary conversion\"\n\t_ = f(F(nil))\n}\n\n// Make sure we don't remove explicit conversions that\n// prevent fusing floating-point operation.\nfunc _() {\n\tvar f1, f2, f3, ftmp float64\n\t_ = f1 + float64(f2*f3)\n\tftmp = float64(f2 * f3)\n\t_ = f1 + ftmp\n\tftmp = f2 * f3\n\t_ = f1 + float64(ftmp)\n\n\tvar c1, c2, c3, ctmp complex128\n\t_ = c1 + complex128(c2*c3)\n\tctmp = complex128(c2 * c3)\n\t_ = c1 + ctmp\n\tctmp = c2 * c3\n\t_ = c1 + complex128(ctmp)\n}\n\n// Basic contains conversion errors for builtin data types\nfunc Basic() {\n\tvar vbool bool\n\tvar vbyte byte\n\tvar vcomplex128 complex128\n\tvar vcomplex64 complex64\n\tvar verror error\n\tvar vfloat32 float32\n\tvar vfloat64 float64\n\tvar vint int\n\tvar vint16 int16\n\tvar vint32 int32\n\tvar vint64 int64\n\tvar vint8 int8\n\tvar vrune rune\n\tvar vstring string\n\tvar vuint uint\n\tvar vuint16 uint16\n\tvar vuint32 uint32\n\tvar vuint64 uint64\n\tvar vuint8 uint8\n\tvar vuintptr uintptr\n\n\t_ = bool(vbool)       // want \"unnecessary conversion\"\n\t_ = byte(vbyte)       // want \"unnecessary conversion\"\n\t_ = error(verror)     // want \"unnecessary conversion\"\n\t_ = int(vint)         // want \"unnecessary conversion\"\n\t_ = int16(vint16)     // want \"unnecessary conversion\"\n\t_ = int32(vint32)     // want \"unnecessary conversion\"\n\t_ = int64(vint64)     // want \"unnecessary conversion\"\n\t_ = int8(vint8)       // want \"unnecessary conversion\"\n\t_ = rune(vrune)       // want \"unnecessary conversion\"\n\t_ = string(vstring)   // want \"unnecessary conversion\"\n\t_ = uint(vuint)       // want \"unnecessary conversion\"\n\t_ = uint16(vuint16)   // want \"unnecessary conversion\"\n\t_ = uint32(vuint32)   // want \"unnecessary conversion\"\n\t_ = uint64(vuint64)   // want \"unnecessary conversion\"\n\t_ = uint8(vuint8)     // want \"unnecessary conversion\"\n\t_ = uintptr(vuintptr) // want \"unnecessary conversion\"\n\n\t_ = float32(vfloat32)\n\t_ = float64(vfloat64)\n\t_ = complex128(vcomplex128)\n\t_ = complex64(vcomplex64)\n\n\t// Pointers\n\t_ = (*bool)(&vbool)             // want \"unnecessary conversion\"\n\t_ = (*byte)(&vbyte)             // want \"unnecessary conversion\"\n\t_ = (*complex128)(&vcomplex128) // want \"unnecessary conversion\"\n\t_ = (*complex64)(&vcomplex64)   // want \"unnecessary conversion\"\n\t_ = (*error)(&verror)           // want \"unnecessary conversion\"\n\t_ = (*float32)(&vfloat32)       // want \"unnecessary conversion\"\n\t_ = (*float64)(&vfloat64)       // want \"unnecessary conversion\"\n\t_ = (*int)(&vint)               // want \"unnecessary conversion\"\n\t_ = (*int16)(&vint16)           // want \"unnecessary conversion\"\n\t_ = (*int32)(&vint32)           // want \"unnecessary conversion\"\n\t_ = (*int64)(&vint64)           // want \"unnecessary conversion\"\n\t_ = (*int8)(&vint8)             // want \"unnecessary conversion\"\n\t_ = (*rune)(&vrune)             // want \"unnecessary conversion\"\n\t_ = (*string)(&vstring)         // want \"unnecessary conversion\"\n\t_ = (*uint)(&vuint)             // want \"unnecessary conversion\"\n\t_ = (*uint16)(&vuint16)         // want \"unnecessary conversion\"\n\t_ = (*uint32)(&vuint32)         // want \"unnecessary conversion\"\n\t_ = (*uint64)(&vuint64)         // want \"unnecessary conversion\"\n\t_ = (*uint8)(&vuint8)           // want \"unnecessary conversion\"\n\t_ = (*uintptr)(&vuintptr)       // want \"unnecessary conversion\"\n}\n"
  },
  {
    "path": "pkg/golinters/unconvert/unconvert.go",
    "content": "package unconvert\n\nimport (\n\t\"sync\"\n\n\t\"github.com/golangci/unconvert\"\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"unconvert\"\n\nfunc New(settings *config.UnconvertSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\tunconvert.SetFastMath(settings.FastMath)\n\tunconvert.SetSafe(settings.Safe)\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName: linterName,\n\t\t\tDoc:  \"Remove unnecessary type conversions\",\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\tissues := runUnconvert(pass)\n\n\t\t\t\tif len(issues) == 0 {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\n\t\t\t\tmu.Lock()\n\t\t\t\tresIssues = append(resIssues, issues...)\n\t\t\t\tmu.Unlock()\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {\n\t\t\treturn resIssues\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runUnconvert(pass *analysis.Pass) []*goanalysis.Issue {\n\tpositions := unconvert.Run(pass)\n\n\tvar issues []*goanalysis.Issue\n\tfor _, position := range positions {\n\t\tissues = append(issues, goanalysis.NewIssue(&result.Issue{\n\t\t\tPos:        position,\n\t\t\tText:       \"unnecessary conversion\",\n\t\t\tFromLinter: linterName,\n\t\t}, pass))\n\t}\n\n\treturn issues\n}\n"
  },
  {
    "path": "pkg/golinters/unconvert/unconvert_integration_test.go",
    "content": "package unconvert\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/unparam/testdata/unparam.go",
    "content": "//golangcitest:args -Eunparam\npackage testdata\n\nfunc unparamUnused(a, b uint) uint { // want \"unparamUnused - b is unused\"\n\ta++\n\treturn a\n}\n"
  },
  {
    "path": "pkg/golinters/unparam/testdata/unparam_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Eunparam\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc unparamUnusedCGO(a, b uint) uint { // want \"unparamUnusedCGO - b is unused\"\n\ta++\n\treturn a\n}\n"
  },
  {
    "path": "pkg/golinters/unparam/unparam.go",
    "content": "package unparam\n\nimport (\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/buildssa\"\n\t\"golang.org/x/tools/go/packages\"\n\t\"mvdan.cc/unparam/check\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.UnparamSettings) *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(&analysis.Analyzer{\n\t\t\tName:     \"unparam\",\n\t\t\tDoc:      \"Reports unused function parameters\",\n\t\t\tRequires: []*analysis.Analyzer{buildssa.Analyzer},\n\t\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\t\terr := runUnparam(pass, settings)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t}).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runUnparam(pass *analysis.Pass, settings *config.UnparamSettings) error {\n\tssa := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA)\n\tssaPkg := ssa.Pkg\n\n\tpkg := &packages.Package{\n\t\tFset:      pass.Fset,\n\t\tSyntax:    pass.Files,\n\t\tTypes:     pass.Pkg,\n\t\tTypesInfo: pass.TypesInfo,\n\t}\n\n\tc := &check.Checker{}\n\tc.CheckExportedFuncs(settings.CheckExported)\n\tc.Packages([]*packages.Package{pkg})\n\tc.ProgramSSA(ssaPkg.Prog)\n\n\tunparamIssues, err := c.Check()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, i := range unparamIssues {\n\t\tpass.Report(analysis.Diagnostic{\n\t\t\tPos:     i.Pos(),\n\t\t\tMessage: i.Message(),\n\t\t})\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/unparam/unparam_integration_test.go",
    "content": "package unparam\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/unqueryvet/testdata/unqueryvet.go",
    "content": "//golangcitest:args -Eunqueryvet\npackage testdata\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\nfunc _() {\n\tquery := \"SELECT * FROM users\" // want \"avoid SELECT \\\\* - explicitly specify needed columns for better performance, maintainability and stability\"\n\n\tvar db *sql.DB\n\trows, _ := db.Query(\"SELECT * FROM orders WHERE status = ?\", \"active\") // want \"avoid SELECT \\\\* - explicitly specify needed columns for better performance, maintainability and stability\"\n\t_ = rows\n\n\tcount := \"SELECT COUNT(*) FROM users\"\n\t_ = count\n\n\tgoodQuery := \"SELECT id, name, email FROM users\"\n\t_ = goodQuery\n\n\tfmt.Println(query)\n\n\t_ = strconv.Itoa(42)\n}\n\ntype SQLBuilder interface {\n\tSelect(columns ...string) SQLBuilder\n\tFrom(table string) SQLBuilder\n\tWhere(condition string) SQLBuilder\n\tQuery() string\n}\n\nfunc _(builder SQLBuilder) {\n\tquery := builder.Select(\"*\").From(\"products\")\n\t_ = query\n}\n\nfunc _(builder SQLBuilder) {\n\tquery := builder.Select(\"id\", \"name\", \"price\").From(\"products\")\n\t_ = query\n}\n"
  },
  {
    "path": "pkg/golinters/unqueryvet/testdata/unqueryvet_custom.go",
    "content": "//golangcitest:args -Eunqueryvet\n//golangcitest:config_path testdata/unqueryvet_custom.yml\npackage testdata\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\nfunc _() {\n\tquery := \"SELECT * FROM users\" // want \"avoid SELECT \\\\* - explicitly specify needed columns for better performance, maintainability and stability\"\n\n\tvar db *sql.DB\n\trows, _ := db.Query(\"SELECT * FROM orders WHERE status = ?\", \"active\") // want \"avoid SELECT \\\\* - explicitly specify needed columns for better performance, maintainability and stability\"\n\t_ = rows\n\n\tcount := \"SELECT COUNT(*) FROM users\"\n\t_ = count\n\n\tgoodQuery := \"SELECT id, name, email FROM users\"\n\t_ = goodQuery\n\n\tfmt.Println(query)\n\n\t_ = strconv.Itoa(42)\n}\n\n// Custom allowed patterns test - SELECT * from temp tables should be allowed\n"
  },
  {
    "path": "pkg/golinters/unqueryvet/testdata/unqueryvet_custom.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    unqueryvet:\n      check-sql-builders: false\n"
  },
  {
    "path": "pkg/golinters/unqueryvet/unqueryvet.go",
    "content": "package unqueryvet\n\nimport (\n\t\"github.com/MirrexOne/unqueryvet\"\n\tpkgconfig \"github.com/MirrexOne/unqueryvet/pkg/config\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.UnqueryvetSettings) *goanalysis.Linter {\n\tcfg := pkgconfig.DefaultSettings()\n\n\tif settings != nil {\n\t\t// IgnoredFiles, Ignore, Severity, and Rules are explicitly ignored.\n\t\tcfg.CheckSQLBuilders = settings.CheckSQLBuilders\n\t\tcfg.CheckAliasedWildcard = settings.CheckAliasedWildcard\n\t\tcfg.CheckStringConcat = settings.CheckStringConcat\n\t\tcfg.CheckFormatStrings = settings.CheckFormatStrings\n\t\tcfg.CheckStringBuilder = settings.CheckStringBuilder\n\t\tcfg.CheckSubqueries = settings.CheckSubqueries\n\t\tcfg.N1DetectionEnabled = settings.CheckN1\n\t\tcfg.SQLInjectionDetectionEnabled = settings.CheckSQLInjection\n\t\tcfg.TxLeakDetectionEnabled = settings.CheckTxLeak\n\t\tcfg.IgnoredFunctions = settings.IgnoredFunctions\n\n\t\tfor _, rule := range settings.CustomRules {\n\t\t\t// The field Fix is explicitly ignored.\n\t\t\tcfg.CustomRules = append(cfg.CustomRules, pkgconfig.CustomRule{\n\t\t\t\tID:       rule.ID,\n\t\t\t\tPattern:  rule.Pattern,\n\t\t\t\tPatterns: rule.Patterns,\n\t\t\t\tWhen:     rule.When,\n\t\t\t\tMessage:  rule.Message,\n\t\t\t\tSeverity: \"error\",\n\t\t\t\tAction:   rule.Action,\n\t\t\t})\n\t\t}\n\n\t\tif len(settings.Allow) > 0 {\n\t\t\tcfg.Allow = settings.Allow\n\t\t}\n\n\t\tif len(settings.AllowedPatterns) > 0 {\n\t\t\tcfg.AllowedPatterns = settings.AllowedPatterns\n\t\t}\n\n\t\tcfg.SQLBuilders = pkgconfig.SQLBuildersConfig{\n\t\t\tSquirrel:  settings.SQLBuilders.Squirrel,\n\t\t\tGORM:      settings.SQLBuilders.GORM,\n\t\t\tSQLx:      settings.SQLBuilders.SQLx,\n\t\t\tEnt:       settings.SQLBuilders.Ent,\n\t\t\tPGX:       settings.SQLBuilders.PGX,\n\t\t\tBun:       settings.SQLBuilders.Bun,\n\t\t\tSQLBoiler: settings.SQLBuilders.SQLBoiler,\n\t\t\tJet:       settings.SQLBuilders.Jet,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(unqueryvet.NewWithConfig(&cfg)).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/unqueryvet/unqueryvet_integration_test.go",
    "content": "package unqueryvet\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/unused/testdata/unused.go",
    "content": "//golangcitest:args -Eunused\npackage testdata\n\nfunc fn1() {} // want \"func fn1 is unused\"\n\n//nolint:unused\nfunc fn2() { fn3() }\n\nfunc fn3() {} // want \"func fn3 is unused\"\n\nfunc fn4() { fn5() } // want \"func fn4 is unused\"\n\nfunc fn5() {} // want \"func fn5 is unused\"\n\nfunc fn6() { fn4() } // want \"func fn6 is unused\"\n\ntype unusedStruct struct{} // want \"type unusedStruct is unused\"\n\ntype unusedStructNolintUnused struct{} //nolint:unused\n"
  },
  {
    "path": "pkg/golinters/unused/testdata/unused_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Eunused\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc fn1() {} // want \"func fn1 is unused\"\n"
  },
  {
    "path": "pkg/golinters/unused/unused.go",
    "content": "package unused\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"honnef.co/go/tools/analysis/facts/directives\"\n\t\"honnef.co/go/tools/analysis/facts/generated\"\n\t\"honnef.co/go/tools/analysis/lint\"\n\t\"honnef.co/go/tools/unused\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst linterName = \"unused\"\n\nfunc New(settings *config.UnusedSettings) *goanalysis.Linter {\n\tvar mu sync.Mutex\n\tvar resIssues []*goanalysis.Issue\n\n\tanalyzer := &analysis.Analyzer{\n\t\tName:     linterName,\n\t\tDoc:      unused.Analyzer.Analyzer.Doc,\n\t\tRequires: unused.Analyzer.Analyzer.Requires,\n\t\tRun: func(pass *analysis.Pass) (any, error) {\n\t\t\tissues := runUnused(pass, settings)\n\t\t\tif len(issues) == 0 {\n\t\t\t\treturn nil, nil\n\t\t\t}\n\n\t\t\tmu.Lock()\n\t\t\tresIssues = append(resIssues, issues...)\n\t\t\tmu.Unlock()\n\n\t\t\treturn nil, nil\n\t\t},\n\t}\n\n\treturn goanalysis.NewLinter(\n\t\tlinterName,\n\t\t\"Checks Go code for unused constants, variables, functions and types\",\n\t\t[]*analysis.Analyzer{analyzer},\n\t\tnil,\n\t).WithIssuesReporter(func(_ *linter.Context) []*goanalysis.Issue {\n\t\treturn resIssues\n\t}).WithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n\nfunc runUnused(pass *analysis.Pass, cfg *config.UnusedSettings) []*goanalysis.Issue {\n\tres := getUnusedResults(pass, cfg)\n\n\tused := make(map[string]bool)\n\tfor _, obj := range res.Used {\n\t\tused[fmt.Sprintf(\"%s %d %s\", obj.Position.Filename, obj.Position.Line, obj.Name)] = true\n\t}\n\n\tvar issues []*goanalysis.Issue\n\n\t// Inspired by https://github.com/dominikh/go-tools/blob/d694aadcb1f50c2d8ac0a1dd06217ebb9f654764/lintcmd/lint.go#L177-L197\n\tfor _, object := range res.Unused {\n\t\tif object.Kind == \"type param\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tkey := fmt.Sprintf(\"%s %d %s\", object.Position.Filename, object.Position.Line, object.Name)\n\t\tif used[key] {\n\t\t\tcontinue\n\t\t}\n\n\t\tissue := goanalysis.NewIssue(&result.Issue{\n\t\t\tFromLinter: linterName,\n\t\t\tText:       fmt.Sprintf(\"%s %s is unused\", object.Kind, object.Name),\n\t\t\tPos:        object.Position,\n\t\t}, pass)\n\n\t\tissues = append(issues, issue)\n\t}\n\n\treturn issues\n}\n\nfunc getUnusedResults(pass *analysis.Pass, settings *config.UnusedSettings) unused.Result {\n\topts := unused.Options{\n\t\tFieldWritesAreUses:     settings.FieldWritesAreUses,\n\t\tPostStatementsAreReads: settings.PostStatementsAreReads,\n\t\t// Related to https://github.com/golangci/golangci-lint/issues/4218\n\t\t// https://github.com/dominikh/go-tools/issues/1474#issuecomment-1850760813\n\t\tExportedIsUsed:        true,\n\t\tExportedFieldsAreUsed: settings.ExportedFieldsAreUsed,\n\t\tParametersAreUsed:     settings.ParametersAreUsed,\n\t\tLocalVariablesAreUsed: settings.LocalVariablesAreUsed,\n\t\tGeneratedIsUsed:       settings.GeneratedIsUsed,\n\t}\n\n\t// ref: https://github.com/dominikh/go-tools/blob/4ec1f474ca6c0feb8e10a8fcca4ab95f5b5b9881/internal/cmd/unused/unused.go#L68\n\tnodes := unused.Graph(pass.Fset,\n\t\tpass.Files,\n\t\tpass.Pkg,\n\t\tpass.TypesInfo,\n\t\tpass.ResultOf[directives.Analyzer].([]lint.Directive),\n\t\tpass.ResultOf[generated.Analyzer].(map[string]generated.Generator),\n\t\topts,\n\t)\n\n\tsg := unused.SerializedGraph{}\n\tsg.Merge(nodes)\n\treturn sg.Results()\n}\n"
  },
  {
    "path": "pkg/golinters/unused/unused_integration_test.go",
    "content": "package unused\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/testdata/fix/in/usestdlibvars.go",
    "content": "//golangcitest:args -Eusestdlibvars\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"net/http\"\n\nfunc _200() {\n\t_ = 200\n}\n\nfunc _200_1() {\n\tvar w http.ResponseWriter\n\tw.WriteHeader(200) // want `\"200\" can be replaced by http.StatusOK`\n}\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/testdata/fix/out/usestdlibvars.go",
    "content": "//golangcitest:args -Eusestdlibvars\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"net/http\"\n\nfunc _200() {\n\t_ = 200\n}\n\nfunc _200_1() {\n\tvar w http.ResponseWriter\n\tw.WriteHeader(http.StatusOK) // want `\"200\" can be replaced by http.StatusOK`\n}\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/testdata/usestdlibvars.go",
    "content": "//golangcitest:args -Eusestdlibvars\npackage testdata\n\nimport \"net/http\"\n\nfunc _200() {\n\t_ = 200\n}\n\nfunc _200_1() {\n\tvar w http.ResponseWriter\n\tw.WriteHeader(200) // want `\"200\" can be replaced by http.StatusOK`\n}\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/testdata/usestdlibvars_cgo.go",
    "content": "//golangcitest:args -Eusestdlibvars\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"net/http\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _200() {\n\t_ = 200\n}\n\nfunc _200_1() {\n\tvar w http.ResponseWriter\n\tw.WriteHeader(200) // want `\"200\" can be replaced by http.StatusOK`\n}\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/testdata/usestdlibvars_non_default.go",
    "content": "//golangcitest:args -Eusestdlibvars\n//golangcitest:config_path testdata/usestdlibvars_non_default.yml\npackage testdata\n\nimport (\n\t\"net/http\"\n\t\"time\"\n)\n\nfunc _200() {\n\t_ = 200\n}\n\nfunc _200_1() {\n\tvar w http.ResponseWriter\n\tw.WriteHeader(200)\n}\n\nconst (\n\t_ = \"Bool\"    // want `\"Bool\" can be replaced by constant\\.Bool\\.String\\(\\)`\n\t_ = \"Complex\" // want `\"Complex\" can be replaced by constant\\.Complex\\.String\\(\\)`\n)\n\nconst (\n\t_ = \"BLAKE2b-256\" // want `\"BLAKE2b-256\" can be replaced by crypto\\.BLAKE2b_256\\.String\\(\\)`\n\t_ = \"BLAKE2b-384\" // want `\"BLAKE2b-384\" can be replaced by crypto\\.BLAKE2b_384\\.String\\(\\)`\n)\n\nconst (\n\t_ = \"/_goRPC_\"   // want `\"/_goRPC_\" can be replaced by rpc\\.DefaultRPCPath`\n\t_ = \"/debug/rpc\" // want `\"/debug/rpc\" can be replaced by rpc\\.DefaultDebugPath`\n)\n\nconst (\n\t_ = \"Read Committed\"   // want `\"Read Committed\" can be replaced by sql\\.LevelReadCommitted\\.String\\(\\)`\n\t_ = \"Read Uncommitted\" // want `\"Read Uncommitted\" can be replaced by sql\\.LevelReadUncommitted\\.String\\(\\)`\n)\n\nconst (\n\t_ = \"01/02 03:04:05PM '06 -0700\" // want `\"01/02 03:04:05PM '06 -0700\" can be replaced by time\\.Layout`\n\t_ = \"02 Jan 06 15:04 -0700\"      // want `\"02 Jan 06 15:04 -0700\" can be replaced by time\\.RFC822Z`\n)\n\nconst (\n\t_ = \"April\"  // want `\"April\" can be replaced by time\\.April\\.String\\(\\)`\n\t_ = \"August\" // want `\"August\" can be replaced by time\\.August\\.String\\(\\)`\n)\n\nconst (\n\t_ = \"Friday\" // want `\"Friday\" can be replaced by time\\.Friday\\.String\\(\\)`\n\t_ = \"Monday\" // want `\"Monday\" can be replaced by time\\.Monday\\.String\\(\\)`\n)\n\nconst (\n\t_ = \"ECDSAWithP256AndSHA256\" // want `\"ECDSAWithP256AndSHA256\" can be replaced by tls\\.ECDSAWithP256AndSHA256\\.String\\(\\)`\n\t_ = \"ECDSAWithP384AndSHA384\" // want `\"ECDSAWithP384AndSHA384\" can be replaced by tls\\.ECDSAWithP384AndSHA384\\.String\\(\\)`\n)\n\nfunc _() {\n\tvar _ = time.Date(2023, 1, 2, 3, 4, 5, 0, time.UTC)  // want `\"1\" can be replaced by time\\.January`\n\tvar _ = time.Date(2023, 10, 2, 3, 4, 5, 0, time.UTC) // want `\"10\" can be replaced by time\\.October`\n}\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/testdata/usestdlibvars_non_default.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    usestdlibvars:\n      http-method: false\n      http-status-code: false\n      time-weekday: true\n      time-month: true\n      time-layout: true\n      crypto-hash: true\n      default-rpc-path: true\n      sql-isolation-level: true\n      tls-signature-scheme: true\n      constant-kind: true\n      time-date-month: true\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/usestdlibvars.go",
    "content": "package usestdlibvars\n\nimport (\n\t\"github.com/sashamelentyev/usestdlibvars/pkg/analyzer\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.UseStdlibVarsSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\tanalyzer.ConstantKindFlag:       settings.ConstantKind,\n\t\t\tanalyzer.CryptoHashFlag:         settings.CryptoHash,\n\t\t\tanalyzer.HTTPMethodFlag:         settings.HTTPMethod,\n\t\t\tanalyzer.HTTPStatusCodeFlag:     settings.HTTPStatusCode,\n\t\t\tanalyzer.OSDevNullFlag:          false, // Noop because the linter ignore it.\n\t\t\tanalyzer.RPCDefaultPathFlag:     settings.DefaultRPCPath,\n\t\t\tanalyzer.SQLIsolationLevelFlag:  settings.SQLIsolationLevel,\n\t\t\tanalyzer.SyslogPriorityFlag:     false, // Noop because the linter ignore it.\n\t\t\tanalyzer.TimeLayoutFlag:         settings.TimeLayout,\n\t\t\tanalyzer.TimeMonthFlag:          settings.TimeMonth,\n\t\t\tanalyzer.TimeWeekdayFlag:        settings.TimeWeekday,\n\t\t\tanalyzer.TLSSignatureSchemeFlag: settings.TLSSignatureScheme,\n\t\t\tanalyzer.TimeDateMonthFlag:      settings.TimeDateMonth,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(analyzer.New()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/usestdlibvars/usestdlibvars_integration_test.go",
    "content": "package usestdlibvars\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/usetesting/testdata/fix/in/usetesting.go",
    "content": "//golangcitest:args -Eusetesting\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"os\"\n\t\"testing\"\n)\n\nfunc Test_osCreateTemp(t *testing.T) {\n\tos.CreateTemp(\"\", \"\")   // want `os\\.CreateTemp\\(\"\", \\.\\.\\.\\) could be replaced by os\\.CreateTemp\\(t\\.TempDir\\(\\), \\.\\.\\.\\) in .+`\n\tos.CreateTemp(\"\", \"xx\") // want `os\\.CreateTemp\\(\"\", \\.\\.\\.\\) could be replaced by os\\.CreateTemp\\(t\\.TempDir\\(\\), \\.\\.\\.\\) in .+`\n\tos.CreateTemp(os.TempDir(), \"xx\")\n\tos.CreateTemp(t.TempDir(), \"xx\")\n}\n"
  },
  {
    "path": "pkg/golinters/usetesting/testdata/fix/out/usetesting.go",
    "content": "//golangcitest:args -Eusetesting\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"os\"\n\t\"testing\"\n)\n\nfunc Test_osCreateTemp(t *testing.T) {\n\tos.CreateTemp(t.TempDir(), \"\")   // want `os\\.CreateTemp\\(\"\", \\.\\.\\.\\) could be replaced by os\\.CreateTemp\\(t\\.TempDir\\(\\), \\.\\.\\.\\) in .+`\n\tos.CreateTemp(t.TempDir(), \"xx\") // want `os\\.CreateTemp\\(\"\", \\.\\.\\.\\) could be replaced by os\\.CreateTemp\\(t\\.TempDir\\(\\), \\.\\.\\.\\) in .+`\n\tos.CreateTemp(os.TempDir(), \"xx\")\n\tos.CreateTemp(t.TempDir(), \"xx\")\n}\n"
  },
  {
    "path": "pkg/golinters/usetesting/testdata/usetesting.go",
    "content": "//golangcitest:args -Eusetesting\npackage testdata\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"testing\"\n)\n\nfunc Test_contextBackground(t *testing.T) {\n\tcontext.Background()\n}\n\nfunc Test_contextTODO(t *testing.T) {\n\tcontext.TODO()\n}\n\nfunc Test_osChdir(t *testing.T) {\n\tos.Chdir(\"\") // want `os\\.Chdir\\(\\) could be replaced by t\\.Chdir\\(\\) in .+`\n}\n\nfunc Test_osMkdirTemp(t *testing.T) {\n\tos.MkdirTemp(\"\", \"\") // want `os\\.MkdirTemp\\(\\) could be replaced by t\\.TempDir\\(\\) in .+`\n}\n\nfunc Test_osSetenv(t *testing.T) {\n\tos.Setenv(\"\", \"\") // want `os\\.Setenv\\(\\) could be replaced by t\\.Setenv\\(\\) in .+`\n}\n\nfunc Test_osTempDir(t *testing.T) {\n\tos.TempDir()\n}\n\nfunc Test_osCreateTemp(t *testing.T) {\n\tos.CreateTemp(\"\", \"\")   // want `os\\.CreateTemp\\(\"\", \\.\\.\\.\\) could be replaced by os\\.CreateTemp\\(t\\.TempDir\\(\\), \\.\\.\\.\\) in .+`\n\tos.CreateTemp(\"\", \"xx\") // want `os\\.CreateTemp\\(\"\", \\.\\.\\.\\) could be replaced by os\\.CreateTemp\\(t\\.TempDir\\(\\), \\.\\.\\.\\) in .+`\n\tos.CreateTemp(os.TempDir(), \"xx\")\n\tos.CreateTemp(t.TempDir(), \"xx\")\n}\n"
  },
  {
    "path": "pkg/golinters/usetesting/testdata/usetesting_cgo.go",
    "content": "//golangcitest:args -Eusetesting\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc Test_osMkdirTemp(t *testing.T) {\n\tos.MkdirTemp(\"\", \"\") // want `os\\.MkdirTemp\\(\\) could be replaced by t\\.TempDir\\(\\) in .+`\n}\n"
  },
  {
    "path": "pkg/golinters/usetesting/testdata/usetesting_configuration.go",
    "content": "//golangcitest:args -Eusetesting\n//golangcitest:config_path testdata/usetesting_configuration.yml\npackage testdata\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"testing\"\n)\n\nfunc Test_contextBackground(t *testing.T) {\n\tcontext.Background() // want `context\\.Background\\(\\) could be replaced by t\\.Context\\(\\) in .+`\n}\n\nfunc Test_contextTODO(t *testing.T) {\n\tcontext.TODO() // want `context\\.TODO\\(\\) could be replaced by t\\.Context\\(\\) in .+`\n}\n\nfunc Test_osChdir(t *testing.T) {\n\tos.Chdir(\"\")\n}\n\nfunc Test_osMkdirTemp(t *testing.T) {\n\tos.MkdirTemp(\"\", \"\")\n}\n\nfunc Test_osTempDir(t *testing.T) {\n\tos.TempDir() // want `os\\.TempDir\\(\\) could be replaced by t\\.TempDir\\(\\) in .+`\n}\n\nfunc Test_osSetenv(t *testing.T) {\n\tos.Setenv(\"\", \"\") // want `os\\.Setenv\\(\\) could be replaced by t\\.Setenv\\(\\) in .+`\n}\n\nfunc Test_osCreateTemp(t *testing.T) {\n\tos.CreateTemp(\"\", \"\")\n\tos.CreateTemp(\"\", \"xx\")\n\tos.CreateTemp(os.TempDir(), \"xx\") // want `os\\.TempDir\\(\\) could be replaced by t\\.TempDir\\(\\) in .+`\n\tos.CreateTemp(t.TempDir(), \"xx\")\n}\n"
  },
  {
    "path": "pkg/golinters/usetesting/testdata/usetesting_configuration.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    usetesting:\n      os-create-temp: false\n      os-mkdir-temp: false\n      os-setenv: true\n      os-temp-dir: true\n      os-chdir: false\n      context-background: true\n      context-todo: true\n"
  },
  {
    "path": "pkg/golinters/usetesting/usetesting.go",
    "content": "package usetesting\n\nimport (\n\t\"github.com/ldez/usetesting\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.UseTestingSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"contextbackground\": settings.ContextBackground,\n\t\t\t\"contexttodo\":       settings.ContextTodo,\n\t\t\t\"oschdir\":           settings.OSChdir,\n\t\t\t\"osmkdirtemp\":       settings.OSMkdirTemp,\n\t\t\t\"ossetenv\":          settings.OSSetenv,\n\t\t\t\"ostempdir\":         settings.OSTempDir,\n\t\t\t\"oscreatetemp\":      settings.OSCreateTemp,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(usetesting.NewAnalyzer()).\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/usetesting/usetesting_integration_test.go",
    "content": "package usetesting\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/varnamelen/testdata/varnamelen.go",
    "content": "//golangcitest:args -Evarnamelen\npackage testdata\n\nimport \"math\"\n\nfunc varnamelen() {\n\tx := math.MinInt8 // want \"variable name 'x' is too short for the scope of its usage\"\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n}\n"
  },
  {
    "path": "pkg/golinters/varnamelen/testdata/varnamelen_cgo.go",
    "content": "//golangcitest:args -Evarnamelen\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"math\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tx := math.MinInt8 // want \"variable name 'x' is too short for the scope of its usage\"\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n\tx++\n}\n"
  },
  {
    "path": "pkg/golinters/varnamelen/testdata/varnamelen_configuration.go",
    "content": "//golangcitest:args -Evarnamelen\n//golangcitest:config_path testdata/varnamelen_configuration.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc _() {\n\tok := foo()\n\n\tfmt.Println(\"a\")\n\tfmt.Println(\"b\")\n\tfmt.Println(\"c\")\n\tfmt.Println(\"d\")\n\tprintln(ok)\n}\n\nfunc _() {\n\tfn := foo()\n\n\tfmt.Println(\"a\")\n\tfmt.Println(\"b\")\n\tfmt.Println(\"c\")\n\tfmt.Println(\"d\")\n\tprintln(fn)\n}\n\nfunc foo() bool {\n\treturn true\n}\n"
  },
  {
    "path": "pkg/golinters/varnamelen/testdata/varnamelen_configuration.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    varnamelen:\n      ignore-names:\n        - fn\n      ignore-decls:\n        - ok bool\n"
  },
  {
    "path": "pkg/golinters/varnamelen/varnamelen.go",
    "content": "package varnamelen\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/blizzy78/varnamelen\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.VarnamelenSettings) *goanalysis.Linter {\n\tvar cfg map[string]any\n\n\tif settings != nil {\n\t\tcfg = map[string]any{\n\t\t\t\"checkReceiver\":      strconv.FormatBool(settings.CheckReceiver),\n\t\t\t\"checkReturn\":        strconv.FormatBool(settings.CheckReturn),\n\t\t\t\"checkTypeParam\":     strconv.FormatBool(settings.CheckTypeParam),\n\t\t\t\"ignoreNames\":        strings.Join(settings.IgnoreNames, \",\"),\n\t\t\t\"ignoreTypeAssertOk\": strconv.FormatBool(settings.IgnoreTypeAssertOk),\n\t\t\t\"ignoreMapIndexOk\":   strconv.FormatBool(settings.IgnoreMapIndexOk),\n\t\t\t\"ignoreChanRecvOk\":   strconv.FormatBool(settings.IgnoreChanRecvOk),\n\t\t\t\"ignoreDecls\":        strings.Join(settings.IgnoreDecls, \",\"),\n\t\t}\n\n\t\tif settings.MaxDistance > 0 {\n\t\t\tcfg[\"maxDistance\"] = strconv.Itoa(settings.MaxDistance)\n\t\t}\n\n\t\tif settings.MinNameLength > 0 {\n\t\t\tcfg[\"minNameLength\"] = strconv.Itoa(settings.MinNameLength)\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(varnamelen.NewAnalyzer()).\n\t\tWithDesc(\"checks that the length of a variable's name matches its scope\").\n\t\tWithConfig(cfg).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/varnamelen/varnamelen_integration_test.go",
    "content": "package varnamelen\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/wastedassign/testdata/wastedassign.go",
    "content": "//golangcitest:args -Ewastedassign\npackage testdata\n\nimport \"strings\"\n\nfunc pa(x int) int {\n\treturn x + 1\n}\n\nfunc multiple(val interface{}, times uint) interface{} {\n\n\tswitch hogehoge := val.(type) {\n\tcase int:\n\t\treturn 12\n\tcase string:\n\t\treturn strings.Repeat(hogehoge, int(times))\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc noUseParams(params string) int {\n\ta := 12\n\tprintln(a)\n\treturn a\n}\n\nfunc f(param int) int {\n\tprintln(param)\n\tuseOutOfIf := 1212121 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\tret := 0\n\tif false {\n\t\tuseOutOfIf = 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\t\treturn 0\n\t} else if param == 100 {\n\t\tuseOutOfIf = 100 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t\tuseOutOfIf = 201\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t} else {\n\t\tuseOutOfIf = 100\n\t\tuseOutOfIf += 100\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t}\n\n\tif false {\n\t\tuseOutOfIf = 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\t\treturn 0\n\t} else if param == 200 {\n\t\tuseOutOfIf = 100 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t\tuseOutOfIf = 201\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200\n\t} else {\n\t\tuseOutOfIf = 100\n\t\tuseOutOfIf += 100\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200\n\t}\n\t// useOutOfIf = 12\n\tprintln(useOutOfIf)\n\tuseOutOfIf = 192\n\tuseOutOfIf += 100\n\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\treturn ret\n}\n\nfunc checkLoopTest() int {\n\thoge := 12\n\tnoUse := 1111\n\tprintln(noUse)\n\n\tnoUse = 1111 // want \"assigned to noUse, but never used afterwards\"\n\tfor {\n\t\tif hoge == 14 {\n\t\t\tbreak\n\t\t}\n\t\thoge = hoge + 1\n\t}\n\treturn hoge\n}\n\nfunc r(param int) int {\n\tprintln(param)\n\tuseOutOfIf := 1212121\n\tret := 0\n\tif false {\n\t\tuseOutOfIf = 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\t\treturn 0\n\t} else if param == 100 {\n\t\tret = useOutOfIf\n\t} else if param == 200 {\n\t\tuseOutOfIf = 100 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t\tuseOutOfIf = 100\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t}\n\tuseOutOfIf = 12\n\tprintln(useOutOfIf)\n\tuseOutOfIf = 192\n\tuseOutOfIf += 100\n\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\treturn ret\n}\n\nfunc mugen() {\n\tvar i int\n\tvar hoge int\n\tfor {\n\t\thoge = 5 // want \"assigned to hoge, but reassigned without using the value\"\n\t\t// break\n\t}\n\n\tprintln(i)\n\tprintln(hoge)\n\treturn\n}\n\nfunc mugenG[T ~int](hoge T) {\n\tvar i int\n\tfor {\n\t\thoge = 5 // want \"assigned to hoge, but reassigned without using the value\"\n\t\t// break\n\t}\n\n\tprintln(i)\n\tprintln(hoge)\n\treturn\n}\n\nfunc noMugen() {\n\tvar i int\n\tvar hoge int\n\tfor {\n\t\thoge = 5\n\t\tbreak\n\t}\n\n\tprintln(i)\n\tprintln(hoge)\n\treturn\n}\n\nfunc reassignInsideLoop() {\n\tbar := func(b []byte) ([]byte, error) { return b, nil }\n\tvar err error\n\tvar rest []byte\n\tfor {\n\t\trest, err = bar(rest)\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn\n}\n\nfunc reassignInsideLoop2() {\n\tvar x int = 0\n\tvar y int = 1\n\tfor i := 1; i < 3; i++ {\n\t\tx += y\n\t\ty *= 2 * i\n\t}\n\tprintln(x)\n}\n"
  },
  {
    "path": "pkg/golinters/wastedassign/testdata/wastedassign_cgo.go",
    "content": "//golangcitest:args -Ewastedassign\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"strings\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc pa(x int) int {\n\treturn x + 1\n}\n\nfunc multiple(val interface{}, times uint) interface{} {\n\n\tswitch hogehoge := val.(type) {\n\tcase int:\n\t\treturn 12\n\tcase string:\n\t\treturn strings.Repeat(hogehoge, int(times))\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc noUseParams(params string) int {\n\ta := 12\n\tprintln(a)\n\treturn a\n}\n\nfunc f(param int) int {\n\tprintln(param)\n\tuseOutOfIf := 1212121 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\tret := 0\n\tif false {\n\t\tuseOutOfIf = 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\t\treturn 0\n\t} else if param == 100 {\n\t\tuseOutOfIf = 100 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t\tuseOutOfIf = 201\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t} else {\n\t\tuseOutOfIf = 100\n\t\tuseOutOfIf += 100\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t}\n\n\tif false {\n\t\tuseOutOfIf = 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\t\treturn 0\n\t} else if param == 200 {\n\t\tuseOutOfIf = 100 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t\tuseOutOfIf = 201\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200\n\t} else {\n\t\tuseOutOfIf = 100\n\t\tuseOutOfIf += 100\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200\n\t}\n\t// useOutOfIf = 12\n\tprintln(useOutOfIf)\n\tuseOutOfIf = 192\n\tuseOutOfIf += 100\n\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\treturn ret\n}\n\nfunc checkLoopTest() int {\n\thoge := 12\n\tnoUse := 1111\n\tprintln(noUse)\n\n\tnoUse = 1111 // want \"assigned to noUse, but never used afterwards\"\n\tfor {\n\t\tif hoge == 14 {\n\t\t\tbreak\n\t\t}\n\t\thoge = hoge + 1\n\t}\n\treturn hoge\n}\n\nfunc r(param int) int {\n\tprintln(param)\n\tuseOutOfIf := 1212121\n\tret := 0\n\tif false {\n\t\tuseOutOfIf = 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\t\treturn 0\n\t} else if param == 100 {\n\t\tret = useOutOfIf\n\t} else if param == 200 {\n\t\tuseOutOfIf = 100 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t\tuseOutOfIf = 100\n\t\tuseOutOfIf = pa(useOutOfIf)\n\t\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but reassigned without using the value\"\n\t}\n\tuseOutOfIf = 12\n\tprintln(useOutOfIf)\n\tuseOutOfIf = 192\n\tuseOutOfIf += 100\n\tuseOutOfIf += 200 // want \"assigned to useOutOfIf, but never used afterwards\"\n\treturn ret\n}\n\nfunc mugen() {\n\tvar i int\n\tvar hoge int\n\tfor {\n\t\thoge = 5 // want \"assigned to hoge, but reassigned without using the value\"\n\t\t// break\n\t}\n\n\tprintln(i)\n\tprintln(hoge)\n\treturn\n}\n\nfunc mugenG[T ~int](hoge T) {\n\tvar i int\n\tfor {\n\t\thoge = 5 // want \"assigned to hoge, but reassigned without using the value\"\n\t\t// break\n\t}\n\n\tprintln(i)\n\tprintln(hoge)\n\treturn\n}\n\nfunc noMugen() {\n\tvar i int\n\tvar hoge int\n\tfor {\n\t\thoge = 5\n\t\tbreak\n\t}\n\n\tprintln(i)\n\tprintln(hoge)\n\treturn\n}\n\nfunc reassignInsideLoop() {\n\tbar := func(b []byte) ([]byte, error) { return b, nil }\n\tvar err error\n\tvar rest []byte\n\tfor {\n\t\trest, err = bar(rest)\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn\n}\n\nfunc reassignInsideLoop2() {\n\tvar x int = 0\n\tvar y int = 1\n\tfor i := 1; i < 3; i++ {\n\t\tx += y\n\t\ty *= 2 * i\n\t}\n\tprintln(x)\n}\n"
  },
  {
    "path": "pkg/golinters/wastedassign/wastedassign.go",
    "content": "package wastedassign\n\nimport (\n\t\"github.com/sanposhiho/wastedassign/v2\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(wastedassign.Analyzer).\n\t\tWithDesc(\"Finds wasted assignment statements\").\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/wastedassign/wastedassign_integration_test.go",
    "content": "package wastedassign\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/whitespace/testdata/fix/in/whitespace.go",
    "content": "//golangcitest:args -Ewhitespace\n//golangcitest:config_path testdata/whitespace-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc oneLeadingNewline() {\n\n\tfmt.Println(\"Hello world\")\n}\n\nfunc oneNewlineAtBothEnds() {\n\n\tfmt.Println(\"Hello world\")\n\n}\n\nfunc noNewlineFunc() {\n}\n\nfunc oneNewlineFunc() {\n\n}\n\nfunc twoNewlinesFunc() {\n\n\n}\n\nfunc noNewlineWithCommentFunc() {\n\t// some comment\n}\n\nfunc oneTrailingNewlineWithCommentFunc() {\n\t// some comment\n\n}\n\nfunc oneLeadingNewlineWithCommentFunc() {\n\n\t// some comment\n}\n\nfunc twoLeadingNewlines() {\n\n\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiFuncFunc(a int,\n\tb int) {\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiIfFunc() {\n\tif 1 == 1 &&\n\t\t2 == 2 {\n\t\tfmt.Println(\"Hello multi-line world\")\n\t}\n\n\tif true {\n\t\tif true {\n\t\t\tif true {\n\t\t\t\tif 1 == 1 &&\n\t\t\t\t\t2 == 2 {\n\t\t\t\t\t\tfmt.Println(\"Hello nested multi-line world\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc notGoFmted() {\n         \n        \n\n\n         fmt.Println(\"Hello world\")\n\n\t\t\t\n               \n}\n"
  },
  {
    "path": "pkg/golinters/whitespace/testdata/fix/out/whitespace.go",
    "content": "//golangcitest:args -Ewhitespace\n//golangcitest:config_path testdata/whitespace-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc oneLeadingNewline() {\n\tfmt.Println(\"Hello world\")\n}\n\nfunc oneNewlineAtBothEnds() {\n\tfmt.Println(\"Hello world\")\n}\n\nfunc noNewlineFunc() {\n}\n\nfunc oneNewlineFunc() {\n\n}\n\nfunc twoNewlinesFunc() {\n\n}\n\nfunc noNewlineWithCommentFunc() {\n\t// some comment\n}\n\nfunc oneTrailingNewlineWithCommentFunc() {\n\t// some comment\n\n}\n\nfunc oneLeadingNewlineWithCommentFunc() {\n\n\t// some comment\n}\n\nfunc twoLeadingNewlines() {\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiFuncFunc(a int,\n\tb int) {\n\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiIfFunc() {\n\tif 1 == 1 &&\n\t\t2 == 2 {\n\n\t\tfmt.Println(\"Hello multi-line world\")\n\t}\n\n\tif true {\n\t\tif true {\n\t\t\tif true {\n\t\t\t\tif 1 == 1 &&\n\t\t\t\t\t2 == 2 {\n\n\t\t\t\t\tfmt.Println(\"Hello nested multi-line world\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc notGoFmted() {\n\tfmt.Println(\"Hello world\")\n}\n"
  },
  {
    "path": "pkg/golinters/whitespace/testdata/whitespace-fix.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    whitespace:\n      multi-if: true\n      multi-func: true\n"
  },
  {
    "path": "pkg/golinters/whitespace/testdata/whitespace.go",
    "content": "//golangcitest:args -Ewhitespace\n//golangcitest:config_path testdata/whitespace.yml\npackage testdata\n\nimport \"fmt\"\n\nfunc oneLeadingNewline() { // want \"unnecessary leading newline\"\n\n\tfmt.Println(\"Hello world\")\n}\n\nfunc oneNewlineAtBothEnds() { // want \"unnecessary leading newline\"\n\n\tfmt.Println(\"Hello world\")\n\n} // want \"unnecessary trailing newline\"\n\nfunc noNewlineFunc() {\n}\n\nfunc oneNewlineFunc() {\n\n}\n\nfunc twoNewlinesFunc() {\n\n\n}\n\nfunc noNewlineWithCommentFunc() {\n\t// some comment\n}\n\nfunc oneTrailingNewlineWithCommentFunc() {\n\t// some comment\n\n}\n\nfunc oneLeadingNewlineWithCommentFunc() {\n\n\t// some comment\n}\n\nfunc twoLeadingNewlines() { // want \"unnecessary leading newline\"\n\n\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiFuncFunc(a int,\n\tb int) { // want \"multi-line statement should be followed by a newline\"\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiIfFunc() {\n\tif 1 == 1 &&\n\t\t2 == 2 { // want \"multi-line statement should be followed by a newline\"\n\t\tfmt.Println(\"Hello multi-line world\")\n\t}\n\n\tif true {\n\t\tif true {\n\t\t\tif true {\n\t\t\t\tif 1 == 1 &&\n\t\t\t\t\t2 == 2 { // want \"multi-line statement should be followed by a newline\"\n\t\t\t\t\t\tfmt.Println(\"Hello nested multi-line world\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc notGoFmted() { // want \"unnecessary leading newline\"\n\n\n\n\n         fmt.Println(\"Hello world\")\n\n\n\n} // want \"unnecessary trailing newline\"\n"
  },
  {
    "path": "pkg/golinters/whitespace/testdata/whitespace.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    whitespace:\n      multi-if: true\n      multi-func: true\n"
  },
  {
    "path": "pkg/golinters/whitespace/testdata/whitespace_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Ewhitespace\n//golangcitest:config_path testdata/whitespace.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc oneLeadingNewline() { // want \"unnecessary leading newline\"\n\n\tfmt.Println(\"Hello world\")\n}\n\nfunc oneNewlineAtBothEnds() { // want \"unnecessary leading newline\"\n\n\tfmt.Println(\"Hello world\")\n\n} // want \"unnecessary trailing newline\"\n\nfunc noNewlineFunc() {\n}\n\nfunc oneNewlineFunc() {\n\n}\n\nfunc twoNewlinesFunc() {\n\n\n}\n\nfunc noNewlineWithCommentFunc() {\n\t// some comment\n}\n\nfunc oneTrailingNewlineWithCommentFunc() {\n\t// some comment\n\n}\n\nfunc oneLeadingNewlineWithCommentFunc() {\n\n\t// some comment\n}\n\nfunc twoLeadingNewlines() { // want \"unnecessary leading newline\"\n\n\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiFuncFunc(a int,\n\tb int) { // want \"multi-line statement should be followed by a newline\"\n\tfmt.Println(\"Hello world\")\n}\n\nfunc multiIfFunc() {\n\tif 1 == 1 &&\n\t\t2 == 2 { // want \"multi-line statement should be followed by a newline\"\n\t\tfmt.Println(\"Hello multi-line world\")\n\t}\n\n\tif true {\n\t\tif true {\n\t\t\tif true {\n\t\t\t\tif 1 == 1 &&\n\t\t\t\t\t2 == 2 { // want \"multi-line statement should be followed by a newline\"\n\t\t\t\t\t\tfmt.Println(\"Hello nested multi-line world\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc notGoFmted() { // want \"unnecessary leading newline\"\n\n\n\n\n         fmt.Println(\"Hello world\")\n\n\n\n} // want \"unnecessary trailing newline\"\n"
  },
  {
    "path": "pkg/golinters/whitespace/whitespace.go",
    "content": "package whitespace\n\nimport (\n\t\"github.com/ultraware/whitespace\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.WhitespaceSettings) *goanalysis.Linter {\n\tvar wsSettings whitespace.Settings\n\tif settings != nil {\n\t\twsSettings = whitespace.Settings{\n\t\t\tMultiIf:   settings.MultiIf,\n\t\t\tMultiFunc: settings.MultiFunc,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(whitespace.NewAnalyzer(&wsSettings)).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n"
  },
  {
    "path": "pkg/golinters/whitespace/whitespace_integration_test.go",
    "content": "package whitespace\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/wrapcheck/testdata/wrapcheck.go",
    "content": "//golangcitest:args -Ewrapcheck\npackage testdata\n\nimport (\n\t\"encoding/json\"\n)\n\nfunc do() error {\n\t_, err := json.Marshal(struct{}{})\n\tif err != nil {\n\t\treturn err // want \"error returned from external package is unwrapped\"\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/wrapcheck/testdata/wrapcheck_cgo.go",
    "content": "//golangcitest:args -Ewrapcheck\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"encoding/json\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() error {\n\t_, err := json.Marshal(struct{}{})\n\tif err != nil {\n\t\treturn err // want \"error returned from external package is unwrapped\"\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/golinters/wrapcheck/wrapcheck.go",
    "content": "package wrapcheck\n\nimport (\n\t\"github.com/tomarrell/wrapcheck/v2/wrapcheck\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New(settings *config.WrapcheckSettings) *goanalysis.Linter {\n\tcfg := wrapcheck.NewDefaultConfig()\n\n\tif settings != nil {\n\t\tcfg.ExtraIgnoreSigs = settings.ExtraIgnoreSigs\n\t\tcfg.ReportInternalErrors = settings.ReportInternalErrors\n\n\t\tif len(settings.IgnoreSigs) != 0 {\n\t\t\tcfg.IgnoreSigs = settings.IgnoreSigs\n\t\t}\n\t\tif len(settings.IgnoreSigRegexps) != 0 {\n\t\t\tcfg.IgnoreSigRegexps = settings.IgnoreSigRegexps\n\t\t}\n\t\tif len(settings.IgnorePackageGlobs) != 0 {\n\t\t\tcfg.IgnorePackageGlobs = settings.IgnorePackageGlobs\n\t\t}\n\t\tif len(settings.IgnoreInterfaceRegexps) != 0 {\n\t\t\tcfg.IgnoreInterfaceRegexps = settings.IgnoreInterfaceRegexps\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(wrapcheck.NewAnalyzer(cfg)).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/wrapcheck/wrapcheck_integration_test.go",
    "content": "package wrapcheck\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/fix/in/wsl_v4.go",
    "content": "//golangcitest:args -Ewsl\n//golangcitest:config_path testdata/wsl_v4.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar (\n\t\ty = 0\n\t)\n\tif y < 1 {\n\t\tfmt.Println(\"tight\")\n\t}\n\n\tthisIsNotUsedInIf := true\n\tif 2 > 1 {\n\t\treturn\n\t}\n\n\tone := 1\n\ttwo := 2\n\tthree := 3\n\tif three == 3 {\n\t\tfmt.Println(\"too many cuddled assignments\", one, two, thisIsNotUsedInIf)\n\t}\n\n\tvar a = \"a\"\n\tvar b = \"b\"\n\n\tif true {\n\t\treturn\n\t}\n\tif false {\n\t\treturn\n\t}\n\n\tfor i := range make([]int, 10) {\n\t\tfmt.Println(i)\n\t\tfmt.Println(i + i)\n\t\tcontinue\n\t}\n\n\tassignOne := a\n\tfmt.Println(assignOne)\n\tassignTwo := b\n\tfmt.Println(assignTwo)\n\n\t_, cf1 := context.WithCancel(context.Background())\n\t_, cf2 := context.WithCancel(context.Background())\n\tdefer cf1()\n\tdefer cf2()\n\n\terr := multiline(\n\t\t\"spanning\",\n\t\t\"multiple\",\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tnotErr := multiline(\n\t\t\"spanning\",\n\t\t\"multiple\",\n\t)\n\tif err != nil {\n\t\tpanic(\"not from the line above\")\n\t}\n\n\t// This is OK since we use a variable from the line above, even if we don't\n\t// check it with the if.\n\txx := notErr\n\tif err != nil {\n\t\tpanic(xx)\n\t}\n}\n\nfunc multiline(s ...string) error {\n\treturn nil\n}\n\nfunc f1() int {\n\tx := 1\n\treturn x\n}\n\nfunc f2() int {\n\tx := 1\n\ty := 3\n\treturn x + y\n}\n\nfunc f3() int {\n\tsum := 0\n\tfor _, v := range []int{2, 4, 8} {\n\t\tsum += v\n\t}\n\n\tnotSum := 0\n\tfor _, v := range []int{1, 2, 4} {\n\t\tsum += v\n\t}\n\n\treturn sum + notSum\n}\n\nfunc onelineShouldNotError() error { return nil }\n\nfunc multilineCase() {\n\t// Multiline cases\n\tswitch {\n\tcase true,\n\t\tfalse:\n\t\tfmt.Println(\"ok\")\n\tcase false ||\n\t\ttrue:\n\t\tfmt.Println(\"ok\")\n\tcase true,\n\t\tfalse:\n\t\tfmt.Println(\"ok\")\n\t}\n}\n\nfunc sliceExpr() {\n\t// Index- and slice expressions.\n\tvar aSlice = []int{1, 2, 3}\n\n\tstart := 2\n\tif v := aSlice[start]; v == 1 {\n\t\tfmt.Println(\"ok\")\n\t}\n\n\tnotOk := 1\n\tif v := aSlice[start]; v == 1 {\n\t\tfmt.Println(\"notOk\")\n\t\tfmt.Println(notOk)\n\t}\n\n\tend := 2\n\tif len(aSlice[start:end]) > 2 {\n\t\tfmt.Println(\"ok\")\n\t}\n}\n\nfunc indexExpr() {\n\tvar aMap = map[string]struct{}{\"key\": {}}\n\n\tkey := \"key\"\n\tif k, ok := aMap[key]; ok {\n\t\tfmt.Println(k)\n\t}\n\n\txxx := \"xxx\"\n\tif _, ok := aMap[key]; ok {\n\t\tfmt.Println(\"not ok\")\n\t\tfmt.Println(xxx)\n\t}\n}\n\nfunc allowTrailing(i int) {\n\tswitch i {\n\tcase 1:\n\t\tfmt.Println(\"one\")\n\n\tcase 2:\n\t\tfmt.Println(\"two\")\n\t\t// Comments OK too!\n\tcase 3:\n\t\tfmt.Println(\"three\")\n\t}\n}\n\n// ExampleSomeOutput simulates an example function.\nfunc ExampleSomeOutput() {\n\tfmt.Println(\"Hello, world\")\n\n\t// Output:\n\t// Hello, world\n}\n\nfunc IncDecStmt() {\n\tcounter := 0\n\tfor range make([]int, 5) {\n\t\tcounter++\n\t}\n\n\ttype t struct {\n\t\tcounter int\n\t}\n\n\tx := t{5}\n\n\tx.counter--\n\tif x.counter > 0 {\n\t\tfmt.Println(\"not yet 0\")\n\t}\n}\n\nfunc AnonymousBlock() {\n\tfunc(a, b int) {\n\n\t\tfmt.Println(a + b)\n\t}(1, 1)\n}\n\nfunc MultilineComment() {\n\tif true {\n\t\t/*\n\t\t\tOk to start block with\n\t\t\ta\n\t\t\tlong\n\t\t\tmultiline\n\t\t\tcmoment\n\t\t*/\n\t\tfmt.Println(\"true\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/fix/in/wsl_v5.go",
    "content": "//golangcitest:args -Ewsl_v5\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n)\n\ntype T struct {\n\tI int\n}\n\nfunc NewT() *T {\n\treturn &T{}\n}\n\nfunc (*T) Fn() int {\n\treturn 1\n}\n\nfunc FnC(_ string, fn func() error) error {\n\tfn()\n\treturn nil\n}\n\nfunc strictAppend() {\n\ts := []string{}\n\ts = append(s, \"a\")\n\ts = append(s, \"b\")\n\tx := \"c\"\n\ts = append(s, x)\n\ty := \"e\"\n\ts = append(s, \"d\") // want `missing whitespace above this line \\(no shared variables above append\\)`\n\ts = append(s, y)\n}\n\nfunc incDec() {\n\tx := 1\n\tx++\n\tx--\n\ty := x\n\n\t_ = y\n}\n\nfunc assignAndCall() {\n\tt1 := NewT()\n\tt2 := NewT()\n\n\tt1.Fn()\n\tx := t1.Fn()\n\tt1.Fn()\n\n\t_, _ = t2, x\n}\n\nfunc closureInCall() {\n\tbuf := &bytes.Buffer{}\n\t_ = FnC(\"buf\", func() error {\n\t\treturn json.NewEncoder(buf).Encode(\"x\")\n\t})\n}\n\nfunc assignAfterBlock() {\n\tx := 1\n\tif x > 0 {\n\t\treturn\n\t}\n\tx = 2 // want `missing whitespace above this line \\(invalid statement above assign\\)`\n}\n\nfunc decl() {\n\tvar x string\n\ty := \"\" // want `missing whitespace above this line \\(invalid statement above assign\\)`\n\n\t_, _ = x, y\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/fix/out/wsl_v4.go",
    "content": "//golangcitest:args -Ewsl\n//golangcitest:config_path testdata/wsl_v4.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar (\n\t\ty = 0\n\t)\n\n\tif y < 1 {\n\t\tfmt.Println(\"tight\")\n\t}\n\n\tthisIsNotUsedInIf := true\n\n\tif 2 > 1 {\n\t\treturn\n\t}\n\n\tone := 1\n\ttwo := 2\n\tthree := 3\n\n\tif three == 3 {\n\t\tfmt.Println(\"too many cuddled assignments\", one, two, thisIsNotUsedInIf)\n\t}\n\n\tvar a = \"a\"\n\n\tvar b = \"b\"\n\n\tif true {\n\t\treturn\n\t}\n\n\tif false {\n\t\treturn\n\t}\n\n\tfor i := range make([]int, 10) {\n\t\tfmt.Println(i)\n\t\tfmt.Println(i + i)\n\n\t\tcontinue\n\t}\n\n\tassignOne := a\n\tfmt.Println(assignOne)\n\n\tassignTwo := b\n\tfmt.Println(assignTwo)\n\n\t_, cf1 := context.WithCancel(context.Background())\n\t_, cf2 := context.WithCancel(context.Background())\n\n\tdefer cf1()\n\tdefer cf2()\n\n\terr := multiline(\n\t\t\"spanning\",\n\t\t\"multiple\",\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tnotErr := multiline(\n\t\t\"spanning\",\n\t\t\"multiple\",\n\t)\n\n\tif err != nil {\n\t\tpanic(\"not from the line above\")\n\t}\n\n\t// This is OK since we use a variable from the line above, even if we don't\n\t// check it with the if.\n\txx := notErr\n\tif err != nil {\n\t\tpanic(xx)\n\t}\n}\n\nfunc multiline(s ...string) error {\n\treturn nil\n}\n\nfunc f1() int {\n\tx := 1\n\treturn x\n}\n\nfunc f2() int {\n\tx := 1\n\ty := 3\n\n\treturn x + y\n}\n\nfunc f3() int {\n\tsum := 0\n\tfor _, v := range []int{2, 4, 8} {\n\t\tsum += v\n\t}\n\n\tnotSum := 0\n\n\tfor _, v := range []int{1, 2, 4} {\n\t\tsum += v\n\t}\n\n\treturn sum + notSum\n}\n\nfunc onelineShouldNotError() error { return nil }\n\nfunc multilineCase() {\n\t// Multiline cases\n\tswitch {\n\tcase true,\n\t\tfalse:\n\t\tfmt.Println(\"ok\")\n\tcase false ||\n\t\ttrue:\n\t\tfmt.Println(\"ok\")\n\tcase true,\n\t\tfalse:\n\t\tfmt.Println(\"ok\")\n\t}\n}\n\nfunc sliceExpr() {\n\t// Index- and slice expressions.\n\tvar aSlice = []int{1, 2, 3}\n\n\tstart := 2\n\tif v := aSlice[start]; v == 1 {\n\t\tfmt.Println(\"ok\")\n\t}\n\n\tnotOk := 1\n\n\tif v := aSlice[start]; v == 1 {\n\t\tfmt.Println(\"notOk\")\n\t\tfmt.Println(notOk)\n\t}\n\n\tend := 2\n\tif len(aSlice[start:end]) > 2 {\n\t\tfmt.Println(\"ok\")\n\t}\n}\n\nfunc indexExpr() {\n\tvar aMap = map[string]struct{}{\"key\": {}}\n\n\tkey := \"key\"\n\tif k, ok := aMap[key]; ok {\n\t\tfmt.Println(k)\n\t}\n\n\txxx := \"xxx\"\n\n\tif _, ok := aMap[key]; ok {\n\t\tfmt.Println(\"not ok\")\n\t\tfmt.Println(xxx)\n\t}\n}\n\nfunc allowTrailing(i int) {\n\tswitch i {\n\tcase 1:\n\t\tfmt.Println(\"one\")\n\n\tcase 2:\n\t\tfmt.Println(\"two\")\n\t\t// Comments OK too!\n\tcase 3:\n\t\tfmt.Println(\"three\")\n\t}\n}\n\n// ExampleSomeOutput simulates an example function.\nfunc ExampleSomeOutput() {\n\tfmt.Println(\"Hello, world\")\n\n\t// Output:\n\t// Hello, world\n}\n\nfunc IncDecStmt() {\n\tcounter := 0\n\tfor range make([]int, 5) {\n\t\tcounter++\n\t}\n\n\ttype t struct {\n\t\tcounter int\n\t}\n\n\tx := t{5}\n\n\tx.counter--\n\tif x.counter > 0 {\n\t\tfmt.Println(\"not yet 0\")\n\t}\n}\n\nfunc AnonymousBlock() {\n\tfunc(a, b int) {\n\t\tfmt.Println(a + b)\n\t}(1, 1)\n}\n\nfunc MultilineComment() {\n\tif true {\n\t\t/*\n\t\t\tOk to start block with\n\t\t\ta\n\t\t\tlong\n\t\t\tmultiline\n\t\t\tcmoment\n\t\t*/\n\t\tfmt.Println(\"true\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/fix/out/wsl_v5.go",
    "content": "//golangcitest:args -Ewsl_v5\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n)\n\ntype T struct {\n\tI int\n}\n\nfunc NewT() *T {\n\treturn &T{}\n}\n\nfunc (*T) Fn() int {\n\treturn 1\n}\n\nfunc FnC(_ string, fn func() error) error {\n\tfn()\n\treturn nil\n}\n\nfunc strictAppend() {\n\ts := []string{}\n\ts = append(s, \"a\")\n\ts = append(s, \"b\")\n\tx := \"c\"\n\ts = append(s, x)\n\ty := \"e\"\n\n\ts = append(s, \"d\") // want `missing whitespace above this line \\(no shared variables above append\\)`\n\ts = append(s, y)\n}\n\nfunc incDec() {\n\tx := 1\n\tx++\n\tx--\n\ty := x\n\n\t_ = y\n}\n\nfunc assignAndCall() {\n\tt1 := NewT()\n\tt2 := NewT()\n\n\tt1.Fn()\n\tx := t1.Fn()\n\tt1.Fn()\n\n\t_, _ = t2, x\n}\n\nfunc closureInCall() {\n\tbuf := &bytes.Buffer{}\n\t_ = FnC(\"buf\", func() error {\n\t\treturn json.NewEncoder(buf).Encode(\"x\")\n\t})\n}\n\nfunc assignAfterBlock() {\n\tx := 1\n\tif x > 0 {\n\t\treturn\n\t}\n\n\tx = 2 // want `missing whitespace above this line \\(invalid statement above assign\\)`\n}\n\nfunc decl() {\n\tvar x string\n\n\ty := \"\" // want `missing whitespace above this line \\(invalid statement above assign\\)`\n\n\t_, _ = x, y\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/ws_v4_cgo.go",
    "content": "//go:build ignore\n\n// TODO(ldez) the linter doesn't support cgo.\n\n//golangcitest:args -Ewsl\n//golangcitest:config_path testdata/wsl_v4.yml\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tvar (\n\t\ty = 0\n\t)\n\tif y < 1 { // want \"if statements should only be cuddled with assignments\"\n\t\tfmt.Println(\"tight\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/wsl_v4.go",
    "content": "//golangcitest:args -Ewsl\n//golangcitest:config_path testdata/wsl_v4.yml\npackage testdata\n\nimport (\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar (\n\t\ty = 0\n\t)\n\tif y < 1 { // want \"if statements should only be cuddled with assignments\"\n\t\tfmt.Println(\"tight\")\n\t}\n\n\tthisIsNotUsedInIf := true\n\tif 2 > 1 { // want \"if statements should only be cuddled with assignments used in the if statement itself\"\n\t\treturn\n\t}\n\n\tone := 1\n\ttwo := 2\n\tthree := 3\n\tif three == 3 { // want \"only one cuddle assignment allowed before if statement\"\n\t\tfmt.Println(\"too many cuddled assignments\", one, two, thisIsNotUsedInIf)\n\t}\n\n\tvar a = \"a\"\n\tvar b = \"b\" // want \"declarations should never be cuddled\"\n\n\tif true {\n\t\treturn\n\t}\n\tif false { // want \"if statements should only be cuddled with assignments\"\n\t\treturn\n\t}\n\n\tfor i := range make([]int, 10) {\n\t\tfmt.Println(i)\n\t\tfmt.Println(i + i)\n\t\tcontinue // want \"branch statements should not be cuddled if block has more than two lines\"\n\t}\n\n\tassignOne := a\n\tfmt.Println(assignOne)\n\tassignTwo := b // want \"assignments should only be cuddled with other assignments\"\n\tfmt.Println(assignTwo)\n\n\t_, cf1 := context.WithCancel(context.Background())\n\t_, cf2 := context.WithCancel(context.Background())\n\tdefer cf1() // want \"only one cuddle assignment allowed before defer statement\"\n\tdefer cf2()\n\n\terr := multiline(\n\t\t\"spanning\",\n\t\t\"multiple\",\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tnotErr := multiline(\n\t\t\"spanning\",\n\t\t\"multiple\",\n\t)\n\tif err != nil { // want \"if statements should only be cuddled with assignments used in the if statement itself\"\n\t\tpanic(\"not from the line above\")\n\t}\n\n\t// This is OK since we use a variable from the line above, even if we don't\n\t// check it with the if.\n\txx := notErr\n\tif err != nil {\n\t\tpanic(xx)\n\t}\n}\n\nfunc multiline(s ...string) error {\n\treturn nil\n}\n\nfunc f1() int {\n\tx := 1\n\treturn x\n}\n\nfunc f2() int {\n\tx := 1\n\ty := 3\n\treturn x + y // want \"return statements should not be cuddled if block has more than two lines\"\n}\n\nfunc f3() int {\n\tsum := 0\n\tfor _, v := range []int{2, 4, 8} {\n\t\tsum += v\n\t}\n\n\tnotSum := 0\n\tfor _, v := range []int{1, 2, 4} { // want \"ranges should only be cuddled with assignments used in the iteration\"\n\t\tsum += v\n\t}\n\n\treturn sum + notSum\n}\n\nfunc onelineShouldNotError() error { return nil }\n\nfunc multilineCase() {\n\t// Multiline cases\n\tswitch {\n\tcase true,\n\t\tfalse:\n\t\tfmt.Println(\"ok\")\n\tcase false ||\n\t\ttrue:\n\t\tfmt.Println(\"ok\")\n\tcase true,\n\t\tfalse:\n\t\tfmt.Println(\"ok\")\n\t}\n}\n\nfunc sliceExpr() {\n\t// Index- and slice expressions.\n\tvar aSlice = []int{1, 2, 3}\n\n\tstart := 2\n\tif v := aSlice[start]; v == 1 {\n\t\tfmt.Println(\"ok\")\n\t}\n\n\tnotOk := 1\n\tif v := aSlice[start]; v == 1 { // want \"if statements should only be cuddled with assignments used in the if statement itself\"\n\t\tfmt.Println(\"notOk\")\n\t\tfmt.Println(notOk)\n\t}\n\n\tend := 2\n\tif len(aSlice[start:end]) > 2 {\n\t\tfmt.Println(\"ok\")\n\t}\n}\n\nfunc indexExpr() {\n\tvar aMap = map[string]struct{}{\"key\": {}}\n\n\tkey := \"key\"\n\tif k, ok := aMap[key]; ok {\n\t\tfmt.Println(k)\n\t}\n\n\txxx := \"xxx\"\n\tif _, ok := aMap[key]; ok { // want \"if statements should only be cuddled with assignments used in the if statement itself\"\n\t\tfmt.Println(\"not ok\")\n\t\tfmt.Println(xxx)\n\t}\n}\n\nfunc allowTrailing(i int) {\n\tswitch i {\n\tcase 1:\n\t\tfmt.Println(\"one\")\n\n\tcase 2:\n\t\tfmt.Println(\"two\")\n\t\t// Comments OK too!\n\tcase 3:\n\t\tfmt.Println(\"three\")\n\t}\n}\n\n// ExampleSomeOutput simulates an example function.\nfunc ExampleSomeOutput() {\n\tfmt.Println(\"Hello, world\")\n\n\t// Output:\n\t// Hello, world\n}\n\nfunc IncDecStmt() {\n\tcounter := 0\n\tfor range make([]int, 5) {\n\t\tcounter++\n\t}\n\n\ttype t struct {\n\t\tcounter int\n\t}\n\n\tx := t{5}\n\n\tx.counter--\n\tif x.counter > 0 {\n\t\tfmt.Println(\"not yet 0\")\n\t}\n}\n\nfunc AnonymousBlock() {\n\tfunc(a, b int) { // want \"block should not start with a whitespace\"\n\n\t\tfmt.Println(a + b)\n\t}(1, 1)\n}\n\nfunc MultilineComment() {\n\tif true {\n\t\t/*\n\t\t\tOk to start block with\n\t\t\ta\n\t\t\tlong\n\t\t\tmultiline\n\t\t\tcmoment\n\t\t*/\n\t\tfmt.Println(\"true\")\n\t}\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/wsl_v4.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    wsl:\n      allow-cuddle-declarations: false\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/wsl_v5.go",
    "content": "//golangcitest:args -Ewsl_v5\npackage testdata\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n)\n\ntype T struct {\n\tI int\n}\n\nfunc NewT() *T {\n\treturn &T{}\n}\n\nfunc (*T) Fn() int {\n\treturn 1\n}\n\nfunc FnC(_ string, fn func() error) error {\n\tfn()\n\treturn nil\n}\n\nfunc strictAppend() {\n\ts := []string{}\n\ts = append(s, \"a\")\n\ts = append(s, \"b\")\n\tx := \"c\"\n\ts = append(s, x)\n\ty := \"e\"\n\ts = append(s, \"d\") // want `missing whitespace above this line \\(no shared variables above append\\)`\n\ts = append(s, y)\n}\n\nfunc incDec() {\n\tx := 1\n\tx++\n\tx--\n\ty := x\n\n\t_ = y\n}\n\nfunc assignAndCall() {\n\tt1 := NewT()\n\tt2 := NewT()\n\n\tt1.Fn()\n\tx := t1.Fn()\n\tt1.Fn()\n\n\t_, _ = t2, x\n}\n\nfunc closureInCall() {\n\tbuf := &bytes.Buffer{}\n\t_ = FnC(\"buf\", func() error {\n\t\treturn json.NewEncoder(buf).Encode(\"x\")\n\t})\n}\n\nfunc assignAfterBlock() {\n\tx := 1\n\tif x > 0 {\n\t\treturn\n\t}\n\tx = 2 // want `missing whitespace above this line \\(invalid statement above assign\\)`\n}\n\nfunc decl() {\n\tvar x string\n\ty := \"\" // want `missing whitespace above this line \\(invalid statement above assign\\)`\n\n\t_, _ = x, y\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/wsl_v5_config.go",
    "content": "//golangcitest:args -Ewsl_v5\n//golangcitest:config_path testdata/wsl_v5_config.yml\npackage testdata\n\nfunc fn1(s []string) {\n\ta := \"a\"\n\ts = append(s, a) // want `missing whitespace above this line \\(invalid statement above assign\\)`\n\n\tx := 1\n\ts = append(s, \"s\") // want `missing whitespace above this line \\(invalid statement above assign\\)`\n\n\t_ = x\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/testdata/wsl_v5_config.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    wsl_v5:\n      allow-first-in-block: true\n      allow-whole-block: false\n      branch-max-lines: 2\n      case-max-lines: 0\n      default: all\n"
  },
  {
    "path": "pkg/golinters/wsl/wsl.go",
    "content": "package wsl\n\nimport (\n\t\"slices\"\n\n\twslv4 \"github.com/bombsimon/wsl/v4\"\n\twslv5 \"github.com/bombsimon/wsl/v5\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\n// Deprecated: use NewV5 instead.\nfunc NewV4(settings *config.WSLv4Settings) *goanalysis.Linter {\n\tvar conf *wslv4.Configuration\n\n\tif settings != nil {\n\t\tconf = &wslv4.Configuration{\n\t\t\tStrictAppend:                     settings.StrictAppend,\n\t\t\tAllowAssignAndCallCuddle:         settings.AllowAssignAndCallCuddle,\n\t\t\tAllowAssignAndAnythingCuddle:     settings.AllowAssignAndAnythingCuddle,\n\t\t\tAllowMultiLineAssignCuddle:       settings.AllowMultiLineAssignCuddle,\n\t\t\tForceCaseTrailingWhitespaceLimit: settings.ForceCaseTrailingWhitespaceLimit,\n\t\t\tAllowTrailingComment:             settings.AllowTrailingComment,\n\t\t\tAllowSeparatedLeadingComment:     settings.AllowSeparatedLeadingComment,\n\t\t\tAllowCuddleDeclaration:           settings.AllowCuddleDeclaration,\n\t\t\tAllowCuddleWithCalls:             settings.AllowCuddleWithCalls,\n\t\t\tAllowCuddleWithRHS:               settings.AllowCuddleWithRHS,\n\t\t\tForceCuddleErrCheckAndAssign:     settings.ForceCuddleErrCheckAndAssign,\n\t\t\tAllowCuddleUsedInBlock:           settings.AllowCuddleUsedInBlock,\n\t\t\tErrorVariableNames:               settings.ErrorVariableNames,\n\t\t\tForceExclusiveShortDeclarations:  settings.ForceExclusiveShortDeclarations,\n\t\t\tIncludeGenerated:                 true, // force to true because golangci-lint already have a way to filter generated files.\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(wslv4.NewAnalyzer(conf)).\n\t\tWithLoadMode(goanalysis.LoadModeSyntax)\n}\n\n// Only used the set YAML struct tags.\ntype v5YAML struct {\n\tAllowFirstInBlock bool     `yaml:\"allow-first-in-block\"`\n\tAllowWholeBlock   bool     `yaml:\"allow-whole-block\"`\n\tBranchMaxLines    int      `yaml:\"branch-max-lines,omitempty\"`\n\tCaseMaxLines      int      `yaml:\"case-max-lines,omitempty\"`\n\tEnable            []string `yaml:\"enable,omitempty\"`\n\tDisable           []string `yaml:\"disable,omitempty\"`\n}\n\nfunc Migration(old *config.WSLv4Settings) any {\n\tif old == nil {\n\t\treturn nil\n\t}\n\n\tcfg := v5YAML{\n\t\tAllowFirstInBlock: true,\n\t\tAllowWholeBlock:   false,\n\t\tBranchMaxLines:    2,\n\t\tCaseMaxLines:      old.ForceCaseTrailingWhitespaceLimit,\n\t}\n\n\tif !old.StrictAppend {\n\t\tcfg.Disable = append(cfg.Disable, wslv5.CheckAppend.String())\n\t}\n\n\tif old.AllowAssignAndAnythingCuddle {\n\t\tcfg.Disable = append(cfg.Disable, wslv5.CheckAssign.String())\n\t}\n\n\tif old.AllowMultiLineAssignCuddle {\n\t\tinternal.LinterLogger.Warnf(\"`allow-multiline-assign` is deprecated and always allowed in wsl >= v5\")\n\t}\n\n\tif old.AllowTrailingComment {\n\t\tinternal.LinterLogger.Warnf(\"`allow-trailing-comment` is deprecated and always allowed in wsl >= v5\")\n\t}\n\n\tif old.AllowSeparatedLeadingComment {\n\t\tinternal.LinterLogger.Warnf(\"`allow-separated-leading-comment` is deprecated and always allowed in wsl >= v5\")\n\t}\n\n\tif old.AllowCuddleDeclaration {\n\t\tcfg.Disable = append(cfg.Disable, wslv5.CheckDecl.String())\n\t}\n\n\tif old.ForceCuddleErrCheckAndAssign {\n\t\tcfg.Enable = append(cfg.Enable, wslv5.CheckErr.String())\n\t}\n\n\tif old.ForceExclusiveShortDeclarations {\n\t\tcfg.Enable = append(cfg.Enable, wslv5.CheckAssignExclusive.String())\n\t}\n\n\tif !old.AllowAssignAndCallCuddle {\n\t\tcfg.Enable = append(cfg.Enable, wslv5.CheckAssignExpr.String())\n\t}\n\n\tslices.Sort(cfg.Enable)\n\tslices.Sort(cfg.Disable)\n\n\treturn cfg\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/wsl_integration_test.go",
    "content": "package wsl\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFixPathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "pkg/golinters/wsl/wsl_v5.go",
    "content": "package wsl\n\nimport (\n\t\"github.com/bombsimon/wsl/v5\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/internal\"\n)\n\nfunc NewV5(settings *config.WSLv5Settings) *goanalysis.Linter {\n\tvar conf *wsl.Configuration\n\n\tif settings != nil {\n\t\tcheckSet, err := wsl.NewCheckSet(settings.Default, settings.Enable, settings.Disable)\n\t\tif err != nil {\n\t\t\tinternal.LinterLogger.Fatalf(\"wsl: invalid check: %v\", err)\n\t\t}\n\n\t\tconf = &wsl.Configuration{\n\t\t\tIncludeGenerated:  true, // force to true because golangci-lint already has a way to filter generated files.\n\t\t\tAllowFirstInBlock: settings.AllowFirstInBlock,\n\t\t\tAllowWholeBlock:   settings.AllowWholeBlock,\n\t\t\tBranchMaxLines:    settings.BranchMaxLines,\n\t\t\tCaseMaxLines:      settings.CaseMaxLines,\n\t\t\tChecks:            checkSet,\n\t\t}\n\t}\n\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(wsl.NewAnalyzer(conf)).\n\t\tWithVersion(5). //nolint:mnd // It's the linter version.\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/zerologlint/testdata/go.mod",
    "content": "module zerologlint\n\ngo 1.25.0\n\nrequire github.com/rs/zerolog v1.34.0\n\nrequire (\n\tgithub.com/mattn/go-colorable v0.1.14 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgolang.org/x/sys v0.33.0 // indirect\n)\n"
  },
  {
    "path": "pkg/golinters/zerologlint/testdata/go.sum",
    "content": "github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=\ngithub.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=\ngithub.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=\ngithub.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=\ngolang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\n"
  },
  {
    "path": "pkg/golinters/zerologlint/testdata/zerologlint.go",
    "content": "//golangcitest:args -Ezerologlint\npackage zerologlint\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\n\t\"github.com/rs/zerolog\"\n\t\"github.com/rs/zerolog/log\"\n)\n\nfunc expectWarnings() {\n\tlog.Error() // want \"must be dispatched by Msg or Send method\"\n\tlog.Info()  // want \"must be dispatched by Msg or Send method\"\n\tlog.Fatal() // want \"must be dispatched by Msg or Send method\"\n\tlog.Debug() // want \"must be dispatched by Msg or Send method\"\n\tlog.Warn()  // want \"must be dispatched by Msg or Send method\"\n\n\terr := fmt.Errorf(\"foobarerror\")\n\tlog.Error().Err(err)                                 // want \"must be dispatched by Msg or Send method\"\n\tlog.Error().Err(err).Str(\"foo\", \"bar\").Int(\"foo\", 1) // want \"must be dispatched by Msg or Send method\"\n\n\tlogger := log.Error() // want \"must be dispatched by Msg or Send method\"\n\tlogger.Err(err).Str(\"foo\", \"bar\").Int(\"foo\", 1)\n\n\t// include zerolog.Dict()\n\tlog.Info(). // want \"must be dispatched by Msg or Send method\"\n\t\t\tStr(\"foo\", \"bar\").\n\t\t\tDict(\"dict\", zerolog.Dict().\n\t\t\t\tStr(\"bar\", \"baz\").\n\t\t\t\tInt(\"n\", 1),\n\t\t)\n\n\t// conditional\n\tlogger2 := log.Info() // want \"must be dispatched by Msg or Send method\"\n\tif err != nil {\n\t\tlogger2 = log.Error() // want \"must be dispatched by Msg or Send method\"\n\t}\n\tlogger2.Str(\"foo\", \"bar\")\n}\n\nfunc expectNoWarnings() {\n\tlog.Fatal().Send()\n\tlog.Panic().Msg(\"\")\n\tlog.Debug().Send()\n\tlog.Info().Msg(\"\")\n\tlog.Warn().Send()\n\tlog.Error().Msg(\"\")\n\n\tlog.Error().Str(\"foo\", \"bar\").Send()\n\terr := fmt.Errorf(\"foobarerror\")\n\tlog.Error().Err(err).Str(\"foo\", \"bar\").Int(\"foo\", 1).Msg(\"\")\n\n\tlogger := log.Error()\n\tlogger.Send()\n\n\t// include zerolog.Dict()\n\tlog.Info().\n\t\tStr(\"foo\", \"bar\").\n\t\tDict(\"dict\", zerolog.Dict().\n\t\t\tStr(\"bar\", \"baz\").\n\t\t\tInt(\"n\", 1),\n\t\t).Send()\n\n\t// conditional\n\tlogger2 := log.Info()\n\tif err != nil {\n\t\tlogger2 = log.Error()\n\t}\n\tlogger2.Send()\n}\n\n// https://github.com/ykadowak/zerologlint/pull/2\nfunc packageNil() {\n\ts := []int{1, 2, 3}\n\tslices.Sort(s)\n}\n"
  },
  {
    "path": "pkg/golinters/zerologlint/testdata/zerologlint_cgo.go",
    "content": "//golangcitest:args -Ezerologlint\npackage testdata\n\n/*\n #include <stdio.h>\n #include <stdlib.h>\n\n void myprint(char* s) {\n \tprintf(\"%d\\n\", s);\n }\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"github.com/rs/zerolog\"\n\t\"github.com/rs/zerolog/log\"\n)\n\nfunc _() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc _() {\n\tlog.Error() // want \"must be dispatched by Msg or Send method\"\n\tlog.Info()  // want \"must be dispatched by Msg or Send method\"\n\tlog.Fatal() // want \"must be dispatched by Msg or Send method\"\n\tlog.Debug() // want \"must be dispatched by Msg or Send method\"\n\tlog.Warn()  // want \"must be dispatched by Msg or Send method\"\n\n\terr := fmt.Errorf(\"foobarerror\")\n\tlog.Error().Err(err)                                 // want \"must be dispatched by Msg or Send method\"\n\tlog.Error().Err(err).Str(\"foo\", \"bar\").Int(\"foo\", 1) // want \"must be dispatched by Msg or Send method\"\n\n\tlogger := log.Error() // want \"must be dispatched by Msg or Send method\"\n\tlogger.Err(err).Str(\"foo\", \"bar\").Int(\"foo\", 1)\n\n\t// include zerolog.Dict()\n\tlog.Info(). // want \"must be dispatched by Msg or Send method\"\n\t\tStr(\"foo\", \"bar\").\n\t\tDict(\"dict\", zerolog.Dict().\n\t\t\tStr(\"bar\", \"baz\").\n\t\t\tInt(\"n\", 1),\n\t\t)\n\n\t// conditional\n\tlogger2 := log.Info() // want \"must be dispatched by Msg or Send method\"\n\tif err != nil {\n\t\tlogger2 = log.Error() // want \"must be dispatched by Msg or Send method\"\n\t}\n\tlogger2.Str(\"foo\", \"bar\")\n}\n"
  },
  {
    "path": "pkg/golinters/zerologlint/zerologlint.go",
    "content": "package zerologlint\n\nimport (\n\t\"github.com/ykadowak/zerologlint\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n)\n\nfunc New() *goanalysis.Linter {\n\treturn goanalysis.\n\t\tNewLinterFromAnalyzer(zerologlint.Analyzer).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n}\n"
  },
  {
    "path": "pkg/golinters/zerologlint/zerologlint_integration_test.go",
    "content": "package zerologlint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n"
  },
  {
    "path": "pkg/goutil/env.go",
    "content": "package goutil\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/ldez/grignotin/goenv\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype EnvKey string\n\ntype Env struct {\n\tvars map[string]string\n\tlog  logutils.Log\n}\n\nfunc NewEnv(log logutils.Log) *Env {\n\treturn &Env{\n\t\tvars: map[string]string{},\n\t\tlog:  log,\n\t}\n}\n\nfunc (e Env) Discover(ctx context.Context) error {\n\tstartedAt := time.Now()\n\n\tvar err error\n\te.vars, err = goenv.Get(ctx, goenv.GOCACHE, goenv.GOROOT)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w\", err)\n\t}\n\n\te.log.Infof(\"Read go env for %s: %#v\", time.Since(startedAt), e.vars)\n\n\treturn nil\n}\n\nfunc (e Env) Get(k EnvKey) string {\n\tenvValue := os.Getenv(string(k))\n\tif envValue != \"\" {\n\t\treturn envValue\n\t}\n\n\treturn e.vars[string(k)]\n}\n"
  },
  {
    "path": "pkg/goutil/version.go",
    "content": "package goutil\n\nimport (\n\t\"fmt\"\n\t\"go/version\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\n\thcversion \"github.com/hashicorp/go-version\"\n)\n\nfunc CheckGoVersion(goVersion string) error {\n\trv, err := CleanRuntimeVersion()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"clean runtime version: %w\", err)\n\t}\n\n\tlangVersion := version.Lang(rv)\n\n\truntimeVersion, err := hcversion.NewVersion(strings.TrimPrefix(langVersion, \"go\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttargetedVersion, err := hcversion.NewVersion(TrimGoVersion(goVersion))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif runtimeVersion.LessThan(targetedVersion) {\n\t\treturn fmt.Errorf(\"the Go language version (%s) used to build golangci-lint is lower than the targeted Go version (%s)\",\n\t\t\tlangVersion, goVersion)\n\t}\n\n\treturn nil\n}\n\n// TrimGoVersion Trims the Go version to keep only M.m.\n// Since Go 1.21 the version inside the go.mod can be a patched version (ex: 1.21.0).\n// The version can also include information which we want to remove (ex: 1.21alpha1)\n// https://go.dev/doc/toolchain#versions\n// This a problem with staticcheck and gocritic.\nfunc TrimGoVersion(v string) string {\n\tif v == \"\" {\n\t\treturn \"\"\n\t}\n\n\texp := regexp.MustCompile(`(\\d\\.\\d+)(?:\\.\\d+|[a-z]+\\d)`)\n\n\tif exp.MatchString(v) {\n\t\treturn exp.FindStringSubmatch(v)[1]\n\t}\n\n\treturn v\n}\n\nfunc CleanRuntimeVersion() (string, error) {\n\treturn cleanRuntimeVersion(runtime.Version())\n}\n\nfunc cleanRuntimeVersion(rv string) (string, error) {\n\tfor part := range strings.FieldsSeq(rv) {\n\t\t// Allow to handle:\n\t\t// - GOEXPERIMENT -> \"go1.23.0 X:boringcrypto\"\n\t\t// - devel -> \"devel go1.24-e705a2d Wed Aug 7 01:16:42 2024 +0000 linux/amd64\"\n\t\tif strings.HasPrefix(part, \"go1.\") {\n\t\t\treturn part, nil\n\t\t}\n\t}\n\n\treturn \"\", fmt.Errorf(\"invalid Go runtime version: %s\", rv)\n}\n"
  },
  {
    "path": "pkg/goutil/version_test.go",
    "content": "package goutil\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestCheckGoVersion(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc    string\n\t\tversion string\n\t\trequire require.ErrorAssertionFunc\n\t}{\n\t\t{\n\t\t\tdesc:    \"version greater than runtime version (patch)\",\n\t\t\tversion: \"1.30.1\",\n\t\t\trequire: require.Error,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"version greater than runtime version (family)\",\n\t\t\tversion: \"1.30\",\n\t\t\trequire: require.Error,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"version greater than runtime version (RC)\",\n\t\t\tversion: \"1.30.0-rc1\",\n\t\t\trequire: require.Error,\n\t\t},\n\t\t{\n\t\t\tdesc: \"version equals to runtime version\",\n\t\t\tversion: func() string {\n\t\t\t\trv, _ := CleanRuntimeVersion()\n\t\t\t\treturn rv\n\t\t\t}(),\n\t\t\trequire: require.NoError,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"version lower than runtime version (patch)\",\n\t\t\tversion: \"1.19.1\",\n\t\t\trequire: require.NoError,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"version lower than runtime version (family)\",\n\t\t\tversion: \"1.19\",\n\t\t\trequire: require.NoError,\n\t\t},\n\t\t{\n\t\t\tdesc:    \"version lower than runtime version (RC)\",\n\t\t\tversion: \"1.19.0-rc1\",\n\t\t\trequire: require.NoError,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := CheckGoVersion(test.version)\n\t\t\ttest.require(t, err)\n\t\t})\n\t}\n}\n\nfunc TestTrimGoVersion(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tversion  string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"patched version\",\n\t\t\tversion:  \"1.22.0\",\n\t\t\texpected: \"1.22\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"minor version\",\n\t\t\tversion:  \"1.22\",\n\t\t\texpected: \"1.22\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"RC version\",\n\t\t\tversion:  \"1.22rc1\",\n\t\t\texpected: \"1.22\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"alpha version\",\n\t\t\tversion:  \"1.22alpha1\",\n\t\t\texpected: \"1.22\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"beta version\",\n\t\t\tversion:  \"1.22beta1\",\n\t\t\texpected: \"1.22\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"semver RC version\",\n\t\t\tversion:  \"1.22.0-rc1\",\n\t\t\texpected: \"1.22\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tversion := TrimGoVersion(test.version)\n\t\t\tassert.Equal(t, test.expected, version)\n\t\t})\n\t}\n}\n\nfunc Test_cleanRuntimeVersion(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tversion  string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"go version\",\n\t\t\tversion:  \"go1.22.0\",\n\t\t\texpected: \"go1.22.0\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"language version\",\n\t\t\tversion:  \"go1.22\",\n\t\t\texpected: \"go1.22\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"GOEXPERIMENT\",\n\t\t\tversion:  \"go1.23.0 X:boringcrypto\",\n\t\t\texpected: \"go1.23.0\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"devel\",\n\t\t\tversion:  \"devel go1.24-e705a2d Wed Aug 7 01:16:42 2024 +0000 linux/amd64\",\n\t\t\texpected: \"go1.24-e705a2d\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tv, err := cleanRuntimeVersion(test.version)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, v)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/lint/context.go",
    "content": "package lint\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/cache\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/load\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype ContextBuilder struct {\n\tcfg *config.Config\n\n\tpkgLoader *PackageLoader\n\n\tpkgCache *cache.Cache\n\n\tloadGuard *load.Guard\n}\n\nfunc NewContextBuilder(cfg *config.Config, pkgLoader *PackageLoader,\n\tpkgCache *cache.Cache, loadGuard *load.Guard,\n) *ContextBuilder {\n\treturn &ContextBuilder{\n\t\tcfg:       cfg,\n\t\tpkgLoader: pkgLoader,\n\t\tpkgCache:  pkgCache,\n\t\tloadGuard: loadGuard,\n\t}\n}\n\nfunc (cl *ContextBuilder) Build(ctx context.Context, log logutils.Log, linters []*linter.Config) (*linter.Context, error) {\n\tpkgs, deduplicatedPkgs, err := cl.pkgLoader.Load(ctx, linters)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to load packages: %w\", err)\n\t}\n\n\tif len(deduplicatedPkgs) == 0 {\n\t\treturn nil, fmt.Errorf(\"%w: running `go mod tidy` may solve the problem\", exitcodes.ErrNoGoFiles)\n\t}\n\n\tret := &linter.Context{\n\t\tPackages: deduplicatedPkgs,\n\n\t\t// At least `unused` linters works properly only on original (not deduplicated) packages,\n\t\t// see https://github.com/golangci/golangci-lint/pull/585.\n\t\tOriginalPackages: pkgs,\n\n\t\tCfg:       cl.cfg,\n\t\tLog:       log,\n\t\tPkgCache:  cl.pkgCache,\n\t\tLoadGuard: cl.loadGuard,\n\t}\n\n\treturn ret, nil\n}\n"
  },
  {
    "path": "pkg/lint/linter/config.go",
    "content": "package linter\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"go.yaml.in/yaml/v3\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\n// LastLinter nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives.\nconst LastLinter = \"nolintlint\"\n\ntype DeprecationLevel int\n\nconst (\n\tDeprecationNone DeprecationLevel = iota\n\tDeprecationWarning\n\tDeprecationError\n)\n\ntype Deprecation struct {\n\tSince            string\n\tMessage          string\n\tReplacement      string\n\tLevel            DeprecationLevel\n\tConfigSuggestion func() (string, error)\n}\n\ntype Config struct {\n\tLinter Linter\n\tGroups map[string]struct{}\n\n\tLoadMode packages.LoadMode\n\n\tAlternativeNames []string\n\n\tOriginalURL     string // URL of original (not forked) repo, needed for autogenerated README\n\tInternal        bool   // Internal linters cannot be disabled (ex: typecheck).\n\tCanAutoFix      bool\n\tIsSlow          bool\n\tDoesChangeTypes bool\n\n\tSince       string\n\tDeprecation *Deprecation\n}\n\nfunc NewConfig(linter Linter) *Config {\n\tlc := &Config{\n\t\tLinter: linter,\n\t}\n\treturn lc.WithLoadFiles()\n}\n\nfunc (lc *Config) WithInternal() *Config {\n\tlc.Internal = true\n\treturn lc\n}\n\nfunc (lc *Config) ConsiderSlow() *Config {\n\tlc.IsSlow = true\n\treturn lc\n}\n\nfunc (lc *Config) IsSlowLinter() bool {\n\treturn lc.IsSlow\n}\n\nfunc (lc *Config) WithLoadFiles() *Config {\n\tlc.LoadMode |= packages.NeedName | packages.NeedFiles | packages.NeedCompiledGoFiles | packages.NeedModule\n\treturn lc\n}\n\nfunc (lc *Config) WithLoadForGoAnalysis() *Config {\n\tlc = lc.WithLoadFiles()\n\tlc.LoadMode |= packages.NeedImports | packages.NeedDeps | packages.NeedExportFile | packages.NeedTypesSizes\n\tlc.IsSlow = true\n\treturn lc\n}\n\nfunc (lc *Config) WithGroups(names ...string) *Config {\n\tif lc.Groups == nil {\n\t\tlc.Groups = make(map[string]struct{})\n\t}\n\n\tfor _, name := range names {\n\t\tlc.Groups[name] = struct{}{}\n\t}\n\n\treturn lc\n}\n\nfunc (lc *Config) FromGroup(name string) bool {\n\t_, ok := lc.Groups[name]\n\treturn ok\n}\n\nfunc (lc *Config) WithURL(url string) *Config {\n\tlc.OriginalURL = url\n\treturn lc\n}\n\nfunc (lc *Config) WithAlternativeNames(names ...string) *Config {\n\tlc.AlternativeNames = names\n\treturn lc\n}\n\nfunc (lc *Config) WithAutoFix() *Config {\n\tlc.CanAutoFix = true\n\treturn lc\n}\n\nfunc (lc *Config) WithChangeTypes() *Config {\n\tlc.DoesChangeTypes = true\n\treturn lc\n}\n\nfunc (lc *Config) WithSince(version string) *Config {\n\tlc.Since = version\n\treturn lc\n}\n\nfunc (lc *Config) Deprecated(message, version string, level DeprecationLevel, opts ...func(*Deprecation)) *Config {\n\tlc.Deprecation = &Deprecation{\n\t\tSince:   version,\n\t\tMessage: message,\n\t\tLevel:   level,\n\t}\n\n\tfor _, opt := range opts {\n\t\topt(lc.Deprecation)\n\t}\n\n\treturn lc\n}\n\nfunc (lc *Config) DeprecatedWarning(message, version string, opts ...func(*Deprecation)) *Config {\n\treturn lc.Deprecated(message, version, DeprecationWarning, opts...)\n}\n\nfunc (lc *Config) DeprecatedError(message, version string, opts ...func(*Deprecation)) *Config {\n\treturn lc.Deprecated(message, version, DeprecationError, opts...)\n}\n\nfunc (lc *Config) IsDeprecated() bool {\n\treturn lc.Deprecation != nil\n}\n\nfunc (lc *Config) AllNames() []string {\n\treturn append([]string{lc.Name()}, lc.AlternativeNames...)\n}\n\nfunc (lc *Config) Name() string {\n\treturn lc.Linter.Name()\n}\n\nfunc (lc *Config) WithNoopFallback(cfg *config.Config, cond func(cfg *config.Config) error) *Config {\n\tif err := cond(cfg); err != nil {\n\t\tlc.Linter = NewNoop(lc.Linter, err.Error())\n\t\tlc.LoadMode = 0\n\n\t\treturn lc.WithLoadFiles()\n\t}\n\n\treturn lc\n}\n\nfunc Replacement[T any](replacement string, mgr func(T) any, data T) func(*Deprecation) {\n\treturn func(d *Deprecation) {\n\t\tif replacement == \"\" {\n\t\t\treturn\n\t\t}\n\n\t\td.Replacement = replacement\n\n\t\tif mgr == nil {\n\t\t\treturn\n\t\t}\n\n\t\td.ConfigSuggestion = func() (string, error) {\n\t\t\tbuf := bytes.NewBuffer([]byte{})\n\n\t\t\tencoder := yaml.NewEncoder(buf)\n\t\t\tencoder.SetIndent(2)\n\n\t\t\tsuggestion := map[string]any{\n\t\t\t\t\"linters\": map[string]any{\n\t\t\t\t\t\"enable\": []string{\n\t\t\t\t\t\td.Replacement,\n\t\t\t\t\t},\n\t\t\t\t\t\"settings\": map[string]any{\n\t\t\t\t\t\td.Replacement: mgr(data),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\n\t\t\terr := encoder.Encode(suggestion)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"%s: invalid configuration: %w\", d.Replacement, err)\n\t\t\t}\n\n\t\t\treturn buf.String(), nil\n\t\t}\n\t}\n}\n\nfunc IsGoLowerThanGo122() func(cfg *config.Config) error {\n\treturn isGoLowerThanGo(\"1.22\")\n}\n\nfunc isGoLowerThanGo(v string) func(cfg *config.Config) error {\n\treturn func(cfg *config.Config) error {\n\t\tif cfg == nil || config.IsGoGreaterThanOrEqual(cfg.Run.Go, v) {\n\t\t\treturn nil\n\t\t}\n\n\t\treturn fmt.Errorf(\"this linter is disabled because the Go version (%s) of your project is lower than Go %s\", cfg.Run.Go, v)\n\t}\n}\n"
  },
  {
    "path": "pkg/lint/linter/context.go",
    "content": "package linter\n\nimport (\n\t\"go/ast\"\n\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/cache\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/load\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype Context struct {\n\t// Packages are deduplicated (test and normal packages) packages\n\tPackages []*packages.Package\n\n\t// OriginalPackages aren't deduplicated: they contain both normal and test\n\t// version for each of packages\n\tOriginalPackages []*packages.Package\n\n\tCfg *config.Config\n\tLog logutils.Log\n\n\tPkgCache  *cache.Cache\n\tLoadGuard *load.Guard\n}\n\nfunc (c *Context) Settings() *config.LintersSettings {\n\treturn &c.Cfg.Linters.Settings\n}\n\nfunc (c *Context) ClearTypesInPackages() {\n\tfor _, p := range c.Packages {\n\t\tclearTypes(p)\n\t}\n\tfor _, p := range c.OriginalPackages {\n\t\tclearTypes(p)\n\t}\n}\n\nfunc clearTypes(p *packages.Package) {\n\tp.Types = nil\n\tp.TypesInfo = nil\n\tp.Syntax = []*ast.File{}\n}\n"
  },
  {
    "path": "pkg/lint/linter/linter.go",
    "content": "package linter\n\nimport (\n\t\"context\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype Linter interface {\n\tRun(ctx context.Context, lintCtx *Context) ([]*result.Issue, error)\n\tName() string\n\tDesc() string\n}\n\ntype Noop struct {\n\tname   string\n\tdesc   string\n\treason string\n\tlevel  DeprecationLevel\n}\n\nfunc NewNoop(l Linter, reason string) Noop {\n\treturn Noop{\n\t\tname:   l.Name(),\n\t\tdesc:   l.Desc(),\n\t\treason: reason,\n\t}\n}\n\nfunc NewNoopDeprecated(name string, cfg *config.Config, level DeprecationLevel) Noop {\n\tnoop := Noop{\n\t\tname:   name,\n\t\tdesc:   \"Deprecated\",\n\t\treason: \"This linter is fully inactivated: it will not produce any reports.\",\n\t\tlevel:  level,\n\t}\n\n\tif cfg.InternalCmdTest {\n\t\tnoop.reason = \"\"\n\t}\n\n\treturn noop\n}\n\nfunc (n Noop) Run(_ context.Context, lintCtx *Context) ([]*result.Issue, error) {\n\tif n.reason == \"\" {\n\t\treturn nil, nil\n\t}\n\n\tswitch n.level {\n\tcase DeprecationError:\n\t\tlintCtx.Log.Errorf(\"%s: %s\", n.name, n.reason)\n\tdefault:\n\t\tlintCtx.Log.Warnf(\"%s: %s\", n.name, n.reason)\n\t}\n\n\treturn nil, nil\n}\n\nfunc (n Noop) Name() string {\n\treturn n.name\n}\n\nfunc (n Noop) Desc() string {\n\treturn n.desc\n}\n"
  },
  {
    "path": "pkg/lint/lintersdb/builder_linter.go",
    "content": "package lintersdb\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/arangolint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/asasalint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/asciicheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/bidichk\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/bodyclose\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/canonicalheader\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/containedctx\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/contextcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/copyloopvar\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/cyclop\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/decorder\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/depguard\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/dogsled\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/dupl\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/dupword\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/durationcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/embeddedstructfieldcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/err113\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/errcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/errchkjson\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/errname\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/errorlint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/exhaustive\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/exhaustruct\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/exptostd\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/fatcontext\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/forbidigo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/forcetypeassert\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/funcorder\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/funlen\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gci\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/ginkgolinter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gocheckcompilerdirectives\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gochecknoglobals\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gochecknoinits\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gochecksumtype\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gocognit\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/goconst\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gocritic\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gocyclo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/godoclint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/godot\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/godox\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gofmt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gofumpt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/goheader\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/goimports\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/golines\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gomoddirectives\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gomodguard\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/goprintffuncname\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gosec\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/gosmopolitan\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/govet\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/grouper\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/iface\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/importas\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/inamedparam\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/ineffassign\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/interfacebloat\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/intrange\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/iotamixing\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/ireturn\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/lll\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/loggercheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/maintidx\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/makezero\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/mirror\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/misspell\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/mnd\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/modernize\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/musttag\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nakedret\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nestif\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nilerr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nilnesserr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nilnil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nlreturn\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/noctx\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/noinlineerr\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nonamedreturns\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nosprintfhostport\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/paralleltest\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/perfsprint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/prealloc\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/predeclared\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/promlinter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/protogetter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/reassign\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/recvcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/revive\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/rowserrcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/sloglint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/spancheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/sqlclosecheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/staticcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/swaggo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/tagalign\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/tagliatelle\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/testableexamples\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/testifylint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/testpackage\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/thelper\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/tparallel\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/unconvert\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/unparam\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/unqueryvet\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/unused\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/usestdlibvars\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/usetesting\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/varnamelen\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/wastedassign\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/whitespace\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/wrapcheck\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/wsl\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/zerologlint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n)\n\n// LinterBuilder builds the \"internal\" linters based on the configuration.\ntype LinterBuilder struct{}\n\n// NewLinterBuilder creates a new LinterBuilder.\nfunc NewLinterBuilder() *LinterBuilder {\n\treturn &LinterBuilder{}\n}\n\n// Build loads all the \"internal\" linters.\n// The configuration is used for the linter settings.\nfunc (LinterBuilder) Build(cfg *config.Config) ([]*linter.Config, error) {\n\tif cfg == nil {\n\t\treturn nil, nil\n\t}\n\n\tplaceholderReplacer := config.NewPlaceholderReplacer(cfg)\n\n\t// The linters are sorted in the alphabetical order (case-insensitive).\n\t// When a new linter is added the version in `WithSince(...)` must be the next minor version of golangci-lint.\n\treturn []*linter.Config{\n\t\tlinter.NewConfig(arangolint.New()).\n\t\t\tWithSince(\"v2.2.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/Crocmagnon/arangolint\"),\n\n\t\tlinter.NewConfig(asasalint.New(&cfg.Linters.Settings.Asasalint)).\n\t\t\tWithSince(\"v1.47.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/alingse/asasalint\"),\n\n\t\tlinter.NewConfig(asciicheck.New()).\n\t\t\tWithSince(\"v1.26.0\").\n\t\t\tWithURL(\"https://github.com/golangci/asciicheck\"),\n\n\t\tlinter.NewConfig(bidichk.New(&cfg.Linters.Settings.BiDiChk)).\n\t\t\tWithSince(\"v1.43.0\").\n\t\t\tWithURL(\"https://github.com/breml/bidichk\"),\n\n\t\tlinter.NewConfig(bodyclose.New()).\n\t\t\tWithSince(\"v1.18.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/timakin/bodyclose\"),\n\n\t\tlinter.NewConfig(canonicalheader.New()).\n\t\t\tWithSince(\"v1.58.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/lasiar/canonicalheader\"),\n\n\t\tlinter.NewConfig(containedctx.New()).\n\t\t\tWithSince(\"v1.44.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/sivchari/containedctx\"),\n\n\t\tlinter.NewConfig(contextcheck.New()).\n\t\t\tWithSince(\"v1.43.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/kkHAIKE/contextcheck\"),\n\n\t\tlinter.NewConfig(copyloopvar.New(&cfg.Linters.Settings.CopyLoopVar)).\n\t\t\tWithSince(\"v1.57.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/karamaru-alpha/copyloopvar\").\n\t\t\tWithNoopFallback(cfg, linter.IsGoLowerThanGo122()),\n\n\t\tlinter.NewConfig(cyclop.New(&cfg.Linters.Settings.Cyclop)).\n\t\t\tWithSince(\"v1.37.0\").\n\t\t\tWithURL(\"https://github.com/bkielbasa/cyclop\"),\n\n\t\tlinter.NewConfig(decorder.New(&cfg.Linters.Settings.Decorder)).\n\t\t\tWithSince(\"v1.44.0\").\n\t\t\tWithURL(\"https://gitlab.com/bosi/decorder\"),\n\n\t\tlinter.NewConfig(depguard.New(&cfg.Linters.Settings.Depguard, placeholderReplacer)).\n\t\t\tWithSince(\"v1.4.0\").\n\t\t\tWithURL(\"https://github.com/OpenPeeDeeP/depguard\"),\n\n\t\tlinter.NewConfig(dogsled.New(&cfg.Linters.Settings.Dogsled)).\n\t\t\tWithSince(\"v1.19.0\").\n\t\t\tWithURL(\"https://github.com/alexkohler/dogsled\"),\n\n\t\tlinter.NewConfig(dupl.New(&cfg.Linters.Settings.Dupl)).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithURL(\"https://github.com/mibk/dupl\"),\n\n\t\tlinter.NewConfig(dupword.New(&cfg.Linters.Settings.DupWord)).\n\t\t\tWithSince(\"v1.50.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/Abirdcfly/dupword\"),\n\n\t\tlinter.NewConfig(durationcheck.New()).\n\t\t\tWithSince(\"v1.37.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/charithe/durationcheck\"),\n\n\t\tlinter.NewConfig(embeddedstructfieldcheck.New(&cfg.Linters.Settings.EmbeddedStructFieldCheck)).\n\t\t\tWithSince(\"v2.2.0\").\n\t\t\tWithURL(\"https://github.com/manuelarte/embeddedstructfieldcheck\"),\n\n\t\tlinter.NewConfig(errcheck.New(&cfg.Linters.Settings.Errcheck)).\n\t\t\tWithGroups(config.GroupStandard).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/kisielk/errcheck\"),\n\n\t\tlinter.NewConfig(errchkjson.New(&cfg.Linters.Settings.ErrChkJSON)).\n\t\t\tWithSince(\"v1.44.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/breml/errchkjson\"),\n\n\t\tlinter.NewConfig(errname.New()).\n\t\t\tWithSince(\"v1.42.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/Antonboom/errname\"),\n\n\t\tlinter.NewConfig(errorlint.New(&cfg.Linters.Settings.ErrorLint)).\n\t\t\tWithSince(\"v1.32.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://codeberg.org/polyfloyd/go-errorlint\"),\n\n\t\tlinter.NewConfig(exhaustive.New(&cfg.Linters.Settings.Exhaustive)).\n\t\t\tWithSince(\"v1.28.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/nishanths/exhaustive\"),\n\n\t\tlinter.NewConfig(exhaustruct.New(&cfg.Linters.Settings.Exhaustruct)).\n\t\t\tWithSince(\"v1.46.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/GaijinEntertainment/go-exhaustruct\"),\n\n\t\tlinter.NewConfig(exptostd.New()).\n\t\t\tWithSince(\"v1.63.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/ldez/exptostd\"),\n\n\t\tlinter.NewConfig(forbidigo.New(&cfg.Linters.Settings.Forbidigo)).\n\t\t\tWithSince(\"v1.34.0\").\n\t\t\t// Strictly speaking,\n\t\t\t// the additional information is only needed when forbidigoCfg.AnalyzeTypes is chosen by the user.\n\t\t\t// But we don't know that here in all cases (sometimes config is not loaded),\n\t\t\t// so we have to assume that it is needed to be on the safe side.\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/ashanbrown/forbidigo\"),\n\n\t\tlinter.NewConfig(forcetypeassert.New()).\n\t\t\tWithSince(\"v1.38.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/gostaticanalysis/forcetypeassert\"),\n\n\t\tlinter.NewConfig(funcorder.New(&cfg.Linters.Settings.FuncOrder)).\n\t\t\tWithSince(\"v2.1.0\").\n\t\t\tWithURL(\"https://github.com/manuelarte/funcorder\"),\n\n\t\tlinter.NewConfig(fatcontext.New(&cfg.Linters.Settings.Fatcontext)).\n\t\t\tWithSince(\"v1.58.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/Crocmagnon/fatcontext\"),\n\n\t\tlinter.NewConfig(funlen.New(&cfg.Linters.Settings.Funlen)).\n\t\t\tWithSince(\"v1.18.0\").\n\t\t\tWithURL(\"https://github.com/ultraware/funlen\"),\n\n\t\tlinter.NewConfig(gci.New(&cfg.Linters.Settings.Gci)).\n\t\t\tWithSince(\"v1.30.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/daixiang0/gci\"),\n\n\t\tlinter.NewConfig(ginkgolinter.New(&cfg.Linters.Settings.GinkgoLinter)).\n\t\t\tWithSince(\"v1.51.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/nunnatsa/ginkgolinter\"),\n\n\t\tlinter.NewConfig(gocheckcompilerdirectives.New()).\n\t\t\tWithSince(\"v1.51.0\").\n\t\t\tWithURL(\"https://github.com/leighmcculloch/gocheckcompilerdirectives\"),\n\n\t\tlinter.NewConfig(gochecknoglobals.New()).\n\t\t\tWithSince(\"v1.12.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/leighmcculloch/gochecknoglobals\"),\n\n\t\tlinter.NewConfig(gochecknoinits.New()).\n\t\t\tWithSince(\"v1.12.0\"),\n\n\t\tlinter.NewConfig(gochecksumtype.New(&cfg.Linters.Settings.GoChecksumType)).\n\t\t\tWithSince(\"v1.55.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/alecthomas/go-check-sumtype\"),\n\n\t\tlinter.NewConfig(gocognit.New(&cfg.Linters.Settings.Gocognit)).\n\t\t\tWithSince(\"v1.20.0\").\n\t\t\tWithURL(\"https://github.com/uudashr/gocognit\"),\n\n\t\tlinter.NewConfig(goconst.New(&cfg.Linters.Settings.Goconst)).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/jgautheron/goconst\"),\n\n\t\tlinter.NewConfig(gocritic.New(&cfg.Linters.Settings.Gocritic, placeholderReplacer)).\n\t\t\tWithSince(\"v1.12.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/go-critic/go-critic\"),\n\n\t\tlinter.NewConfig(gocyclo.New(&cfg.Linters.Settings.Gocyclo)).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithURL(\"https://github.com/fzipp/gocyclo\"),\n\n\t\tlinter.NewConfig(godoclint.New(&cfg.Linters.Settings.Godoclint)).\n\t\t\tWithSince(\"v2.5.0\").\n\t\t\tWithURL(\"https://github.com/godoc-lint/godoc-lint\"),\n\n\t\tlinter.NewConfig(godot.New(&cfg.Linters.Settings.Godot)).\n\t\t\tWithSince(\"v1.25.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/tetafro/godot\"),\n\n\t\tlinter.NewConfig(godox.New(&cfg.Linters.Settings.Godox)).\n\t\t\tWithSince(\"v1.19.0\").\n\t\t\tWithURL(\"https://github.com/matoous/godox\"),\n\n\t\tlinter.NewConfig(err113.New()).\n\t\t\tWithSince(\"v1.26.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/Djarvur/go-err113\"),\n\n\t\tlinter.NewConfig(gofmt.New(&cfg.Linters.Settings.GoFmt)).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://pkg.go.dev/cmd/gofmt\"),\n\n\t\tlinter.NewConfig(gofumpt.New(&cfg.Linters.Settings.GoFumpt)).\n\t\t\tWithSince(\"v1.28.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/mvdan/gofumpt\"),\n\n\t\tlinter.NewConfig(golines.New(&cfg.Linters.Settings.GoLines)).\n\t\t\tWithSince(\"v2.0.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/segmentio/golines\"),\n\n\t\tlinter.NewConfig(goheader.New(&cfg.Linters.Settings.Goheader, placeholderReplacer)).\n\t\t\tWithSince(\"v1.28.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/denis-tingaikin/go-header\"),\n\n\t\tlinter.NewConfig(goimports.New(&cfg.Linters.Settings.GoImports)).\n\t\t\tWithSince(\"v1.20.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://pkg.go.dev/golang.org/x/tools/cmd/goimports\"),\n\n\t\tlinter.NewConfig(mnd.New(&cfg.Linters.Settings.Mnd)).\n\t\t\tWithSince(\"v1.22.0\").\n\t\t\tWithURL(\"https://github.com/tommy-muehle/go-mnd\"),\n\n\t\tlinter.NewConfig(modernize.New(&cfg.Linters.Settings.Modernize)).\n\t\t\tWithSince(\"v2.6.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/modernize\"),\n\n\t\tlinter.NewConfig(gomoddirectives.New(&cfg.Linters.Settings.GoModDirectives)).\n\t\t\tWithSince(\"v1.39.0\").\n\t\t\tWithURL(\"https://github.com/ldez/gomoddirectives\"),\n\n\t\tlinter.NewConfig(gomodguard.New(&cfg.Linters.Settings.Gomodguard)).\n\t\t\tWithSince(\"v1.25.0\").\n\t\t\tWithURL(\"https://github.com/ryancurrah/gomodguard\"),\n\n\t\tlinter.NewConfig(goprintffuncname.New()).\n\t\t\tWithSince(\"v1.23.0\").\n\t\t\tWithURL(\"https://github.com/golangci/go-printf-func-name\"),\n\n\t\tlinter.NewConfig(gosec.New(&cfg.Linters.Settings.Gosec)).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/securego/gosec\"),\n\n\t\tlinter.NewConfig(gosmopolitan.New(&cfg.Linters.Settings.Gosmopolitan)).\n\t\t\tWithSince(\"v1.53.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/xen0n/gosmopolitan\"),\n\n\t\tlinter.NewConfig(govet.New(&cfg.Linters.Settings.Govet)).\n\t\t\tWithGroups(config.GroupStandard).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://pkg.go.dev/cmd/vet\"),\n\n\t\tlinter.NewConfig(grouper.New(&cfg.Linters.Settings.Grouper)).\n\t\t\tWithSince(\"v1.44.0\").\n\t\t\tWithURL(\"https://github.com/leonklingele/grouper\"),\n\n\t\tlinter.NewConfig(iface.New(&cfg.Linters.Settings.Iface)).\n\t\t\tWithSince(\"v1.62.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/uudashr/iface\"),\n\n\t\tlinter.NewConfig(importas.New(&cfg.Linters.Settings.ImportAs)).\n\t\t\tWithSince(\"v1.38.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/julz/importas\"),\n\n\t\tlinter.NewConfig(inamedparam.New(&cfg.Linters.Settings.Inamedparam)).\n\t\t\tWithSince(\"v1.55.0\").\n\t\t\tWithURL(\"https://github.com/macabu/inamedparam\"),\n\n\t\tlinter.NewConfig(ineffassign.New(&cfg.Linters.Settings.Ineffassign)).\n\t\t\tWithGroups(config.GroupStandard).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithURL(\"https://github.com/gordonklaus/ineffassign\"),\n\n\t\tlinter.NewConfig(interfacebloat.New(&cfg.Linters.Settings.InterfaceBloat)).\n\t\t\tWithSince(\"v1.49.0\").\n\t\t\tWithURL(\"https://github.com/sashamelentyev/interfacebloat\"),\n\n\t\tlinter.NewConfig(intrange.New()).\n\t\t\tWithSince(\"v1.57.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/ckaznocha/intrange\").\n\t\t\tWithNoopFallback(cfg, linter.IsGoLowerThanGo122()),\n\n\t\tlinter.NewConfig(iotamixing.New(&cfg.Linters.Settings.IotaMixing)).\n\t\t\tWithSince(\"v2.5.0\").\n\t\t\tWithURL(\"https://github.com/AdminBenni/iota-mixing\"),\n\n\t\tlinter.NewConfig(ireturn.New(&cfg.Linters.Settings.Ireturn)).\n\t\t\tWithSince(\"v1.43.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/butuzov/ireturn\"),\n\n\t\tlinter.NewConfig(lll.New(&cfg.Linters.Settings.Lll)).\n\t\t\tWithSince(\"v1.8.0\"),\n\n\t\tlinter.NewConfig(loggercheck.New(&cfg.Linters.Settings.LoggerCheck)).\n\t\t\tWithSince(\"v1.49.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/timonwong/loggercheck\"),\n\n\t\tlinter.NewConfig(maintidx.New(&cfg.Linters.Settings.MaintIdx)).\n\t\t\tWithSince(\"v1.44.0\").\n\t\t\tWithURL(\"https://github.com/yagipy/maintidx\"),\n\n\t\tlinter.NewConfig(makezero.New(&cfg.Linters.Settings.Makezero)).\n\t\t\tWithSince(\"v1.34.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/ashanbrown/makezero\"),\n\n\t\tlinter.NewConfig(mirror.New()).\n\t\t\tWithSince(\"v1.53.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/butuzov/mirror\"),\n\n\t\tlinter.NewConfig(misspell.New(&cfg.Linters.Settings.Misspell)).\n\t\t\tWithSince(\"v1.8.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/golangci/misspell\"),\n\n\t\tlinter.NewConfig(musttag.New(&cfg.Linters.Settings.MustTag)).\n\t\t\tWithSince(\"v1.51.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/go-simpler/musttag\"),\n\n\t\tlinter.NewConfig(nakedret.New(&cfg.Linters.Settings.Nakedret)).\n\t\t\tWithSince(\"v1.19.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/alexkohler/nakedret\"),\n\n\t\tlinter.NewConfig(nestif.New(&cfg.Linters.Settings.Nestif)).\n\t\t\tWithSince(\"v1.25.0\").\n\t\t\tWithURL(\"https://github.com/nakabonne/nestif\"),\n\n\t\tlinter.NewConfig(nilerr.New()).\n\t\t\tWithSince(\"v1.38.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/gostaticanalysis/nilerr\"),\n\n\t\tlinter.NewConfig(nilnesserr.New()).\n\t\t\tWithSince(\"v1.63.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/alingse/nilnesserr\"),\n\n\t\tlinter.NewConfig(nilnil.New(&cfg.Linters.Settings.NilNil)).\n\t\t\tWithSince(\"v1.43.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/Antonboom/nilnil\"),\n\n\t\tlinter.NewConfig(nlreturn.New(&cfg.Linters.Settings.Nlreturn)).\n\t\t\tWithSince(\"v1.30.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/ssgreg/nlreturn\"),\n\n\t\tlinter.NewConfig(noctx.New()).\n\t\t\tWithSince(\"v1.28.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/sonatard/noctx\"),\n\n\t\tlinter.NewConfig(noinlineerr.New()).\n\t\t\tWithSince(\"v2.2.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/AlwxSin/noinlineerr\"),\n\n\t\tlinter.NewConfig(nonamedreturns.New(&cfg.Linters.Settings.NoNamedReturns)).\n\t\t\tWithSince(\"v1.46.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/firefart/nonamedreturns\"),\n\n\t\tlinter.NewConfig(nosprintfhostport.New()).\n\t\t\tWithSince(\"v1.46.0\").\n\t\t\tWithURL(\"https://github.com/stbenjam/no-sprintf-host-port\"),\n\n\t\tlinter.NewConfig(paralleltest.New(&cfg.Linters.Settings.ParallelTest)).\n\t\t\tWithSince(\"v1.33.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/kunwardeep/paralleltest\"),\n\n\t\tlinter.NewConfig(perfsprint.New(&cfg.Linters.Settings.PerfSprint)).\n\t\t\tWithSince(\"v1.55.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/catenacyber/perfsprint\"),\n\n\t\tlinter.NewConfig(prealloc.New(&cfg.Linters.Settings.Prealloc)).\n\t\t\tWithSince(\"v1.19.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/alexkohler/prealloc\"),\n\n\t\tlinter.NewConfig(predeclared.New(&cfg.Linters.Settings.Predeclared)).\n\t\t\tWithSince(\"v1.35.0\").\n\t\t\tWithURL(\"https://github.com/nishanths/predeclared\"),\n\n\t\tlinter.NewConfig(promlinter.New(&cfg.Linters.Settings.Promlinter)).\n\t\t\tWithSince(\"v1.40.0\").\n\t\t\tWithURL(\"https://github.com/yeya24/promlinter\"),\n\n\t\tlinter.NewConfig(protogetter.New(&cfg.Linters.Settings.ProtoGetter)).\n\t\t\tWithSince(\"v1.55.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/ghostiam/protogetter\"),\n\n\t\tlinter.NewConfig(reassign.New(&cfg.Linters.Settings.Reassign)).\n\t\t\tWithSince(\"v1.49.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/curioswitch/go-reassign\"),\n\n\t\tlinter.NewConfig(recvcheck.New(&cfg.Linters.Settings.Recvcheck)).\n\t\t\tWithSince(\"v1.62.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/raeperd/recvcheck\"),\n\n\t\tlinter.NewConfig(revive.New(&cfg.Linters.Settings.Revive)).\n\t\t\tWithSince(\"v1.37.0\").\n\t\t\tConsiderSlow().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/mgechev/revive\"),\n\n\t\tlinter.NewConfig(rowserrcheck.New(&cfg.Linters.Settings.RowsErrCheck)).\n\t\t\tWithSince(\"v1.23.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/jingyugao/rowserrcheck\"),\n\n\t\tlinter.NewConfig(sloglint.New(&cfg.Linters.Settings.SlogLint)).\n\t\t\tWithSince(\"v1.55.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/go-simpler/sloglint\"),\n\n\t\tlinter.NewConfig(sqlclosecheck.New()).\n\t\t\tWithSince(\"v1.28.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/ryanrolds/sqlclosecheck\"),\n\n\t\tlinter.NewConfig(spancheck.New(&cfg.Linters.Settings.Spancheck)).\n\t\t\tWithSince(\"v1.56.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/jjti/go-spancheck\"),\n\n\t\tlinter.NewConfig(staticcheck.New(&cfg.Linters.Settings.Staticcheck)).\n\t\t\tWithGroups(config.GroupStandard).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/dominikh/go-tools\"),\n\n\t\tlinter.NewConfig(swaggo.New()).\n\t\t\tWithSince(\"v2.2.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/swaggo/swag\"),\n\n\t\tlinter.NewConfig(tagalign.New(&cfg.Linters.Settings.TagAlign)).\n\t\t\tWithSince(\"v1.53.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/4meepo/tagalign\"),\n\n\t\tlinter.NewConfig(tagliatelle.New(&cfg.Linters.Settings.Tagliatelle)).\n\t\t\tWithSince(\"v1.40.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/ldez/tagliatelle\"),\n\n\t\tlinter.NewConfig(testableexamples.New()).\n\t\t\tWithSince(\"v1.50.0\").\n\t\t\tWithURL(\"https://github.com/maratori/testableexamples\"),\n\n\t\tlinter.NewConfig(testifylint.New(&cfg.Linters.Settings.Testifylint)).\n\t\t\tWithSince(\"v1.55.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/Antonboom/testifylint\"),\n\n\t\tlinter.NewConfig(testpackage.New(&cfg.Linters.Settings.Testpackage)).\n\t\t\tWithSince(\"v1.25.0\").\n\t\t\tWithURL(\"https://github.com/maratori/testpackage\"),\n\n\t\tlinter.NewConfig(thelper.New(&cfg.Linters.Settings.Thelper)).\n\t\t\tWithSince(\"v1.34.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/kulti/thelper\"),\n\n\t\tlinter.NewConfig(tparallel.New()).\n\t\t\tWithSince(\"v1.32.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/moricho/tparallel\"),\n\n\t\tlinter.NewConfig(golinters.NewTypecheck()).\n\t\t\tWithInternal().\n\t\t\tWithSince(\"v1.3.0\"),\n\n\t\tlinter.NewConfig(unconvert.New(&cfg.Linters.Settings.Unconvert)).\n\t\t\tWithSince(\"v1.0.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/mdempsky/unconvert\"),\n\n\t\tlinter.NewConfig(unparam.New(&cfg.Linters.Settings.Unparam)).\n\t\t\tWithSince(\"v1.9.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/mvdan/unparam\"),\n\n\t\tlinter.NewConfig(unqueryvet.New(&cfg.Linters.Settings.Unqueryvet)).\n\t\t\tWithSince(\"v2.5.0\").\n\t\t\tWithURL(\"https://github.com/MirrexOne/unqueryvet\"),\n\n\t\tlinter.NewConfig(unused.New(&cfg.Linters.Settings.Unused)).\n\t\t\tWithGroups(config.GroupStandard).\n\t\t\tWithSince(\"v1.20.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tConsiderSlow().\n\t\t\tWithChangeTypes().\n\t\t\tWithURL(\"https://github.com/dominikh/go-tools/tree/HEAD/unused\"),\n\n\t\tlinter.NewConfig(usestdlibvars.New(&cfg.Linters.Settings.UseStdlibVars)).\n\t\t\tWithSince(\"v1.48.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/sashamelentyev/usestdlibvars\"),\n\n\t\tlinter.NewConfig(usetesting.New(&cfg.Linters.Settings.UseTesting)).\n\t\t\tWithSince(\"v1.63.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/ldez/usetesting\"),\n\n\t\tlinter.NewConfig(varnamelen.New(&cfg.Linters.Settings.Varnamelen)).\n\t\t\tWithSince(\"v1.43.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/blizzy78/varnamelen\"),\n\n\t\tlinter.NewConfig(wastedassign.New()).\n\t\t\tWithSince(\"v1.38.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/sanposhiho/wastedassign\"),\n\n\t\tlinter.NewConfig(whitespace.New(&cfg.Linters.Settings.Whitespace)).\n\t\t\tWithSince(\"v1.19.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/ultraware/whitespace\"),\n\n\t\tlinter.NewConfig(wrapcheck.New(&cfg.Linters.Settings.Wrapcheck)).\n\t\t\tWithSince(\"v1.32.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/tomarrell/wrapcheck\"),\n\n\t\tlinter.NewConfig(wsl.NewV4(&cfg.Linters.Settings.WSL)).\n\t\t\tDeprecatedWarning(\"new major version.\", \"v2.2.0\",\n\t\t\t\tlinter.Replacement(\"wsl_v5\", wsl.Migration, &cfg.Linters.Settings.WSL)).\n\t\t\tWithSince(\"v1.20.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/bombsimon/wsl\"),\n\n\t\tlinter.NewConfig(wsl.NewV5(&cfg.Linters.Settings.WSLv5)).\n\t\t\tWithSince(\"v2.2.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/bombsimon/wsl\"),\n\n\t\tlinter.NewConfig(zerologlint.New()).\n\t\t\tWithSince(\"v1.53.0\").\n\t\t\tWithLoadForGoAnalysis().\n\t\t\tWithURL(\"https://github.com/ykadowak/zerologlint\"),\n\n\t\t// nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives\n\t\tlinter.NewConfig(nolintlint.New(&cfg.Linters.Settings.NoLintLint)).\n\t\t\tWithSince(\"v1.26.0\").\n\t\t\tWithAutoFix().\n\t\t\tWithURL(\"https://github.com/golangci/golangci-lint/tree/HEAD/pkg/golinters/nolintlint/internal\"),\n\t}, nil\n}\n"
  },
  {
    "path": "pkg/lint/lintersdb/builder_plugin_go.go",
    "content": "package lintersdb\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"plugin\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nconst goPluginType = \"goplugin\"\n\ntype AnalyzerPlugin interface {\n\tGetAnalyzers() []*analysis.Analyzer\n}\n\n// PluginGoBuilder builds the custom linters (Go plugin) based on the configuration.\ntype PluginGoBuilder struct {\n\tlog logutils.Log\n}\n\n// NewPluginGoBuilder creates new PluginGoBuilder.\nfunc NewPluginGoBuilder(log logutils.Log) *PluginGoBuilder {\n\treturn &PluginGoBuilder{log: log}\n}\n\n// Build loads custom linters that are specified in the golangci-lint config file.\nfunc (b *PluginGoBuilder) Build(cfg *config.Config) ([]*linter.Config, error) {\n\tif cfg == nil || b.log == nil {\n\t\treturn nil, nil\n\t}\n\n\tvar linters []*linter.Config\n\n\tfor name, settings := range cfg.Linters.Settings.Custom {\n\t\tif settings.Type != goPluginType && settings.Type != \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tlc, err := b.loadConfig(cfg, name, &settings)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to load custom analyzer %q: %s, %w\", name, settings.Path, err)\n\t\t}\n\t\tlinters = append(linters, lc)\n\t}\n\n\treturn linters, nil\n}\n\n// loadConfig loads the configuration of private linters.\n// Private linters are dynamically loaded from .so plugin files.\nfunc (b *PluginGoBuilder) loadConfig(cfg *config.Config, name string, settings *config.CustomLinterSettings) (*linter.Config, error) {\n\tanalyzers, err := b.getAnalyzerPlugin(cfg, settings.Path, settings.Settings)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tb.log.Infof(\"Loaded %s: %s\", settings.Path, name)\n\n\tcustomLinter := goanalysis.NewLinter(name, settings.Description, analyzers, nil).\n\t\tWithLoadMode(goanalysis.LoadModeTypesInfo)\n\n\tlinterConfig := linter.NewConfig(customLinter).\n\t\tWithGroups(config.GroupStandard).\n\t\tWithLoadForGoAnalysis().\n\t\tWithURL(settings.OriginalURL)\n\n\treturn linterConfig, nil\n}\n\n// getAnalyzerPlugin loads a private linter as specified in the config file,\n// loads the plugin from a .so file,\n// and returns the 'AnalyzerPlugin' interface implemented by the private plugin.\n// An error is returned if the private linter cannot be loaded\n// or the linter does not implement the AnalyzerPlugin interface.\nfunc (b *PluginGoBuilder) getAnalyzerPlugin(cfg *config.Config, path string, settings any) ([]*analysis.Analyzer, error) {\n\tif !filepath.IsAbs(path) {\n\t\tbasePath, err := fsutils.GetBasePath(context.Background(), cfg.Run.RelativePathMode, cfg.GetConfigDir())\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"get base path: %w\", err)\n\t\t}\n\n\t\t// resolve non-absolute paths relative to config file's directory\n\t\tpath = filepath.Join(basePath, path)\n\t}\n\n\tplug, err := plugin.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tanalyzers, err := b.lookupPlugin(plug, settings)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"lookup plugin %s: %w\", path, err)\n\t}\n\n\treturn analyzers, nil\n}\n\nfunc (b *PluginGoBuilder) lookupPlugin(plug *plugin.Plugin, settings any) ([]*analysis.Analyzer, error) {\n\tsymbol, err := plug.Lookup(\"New\")\n\tif err != nil {\n\t\tanalyzers, errP := b.lookupAnalyzerPlugin(plug)\n\t\tif errP != nil {\n\t\t\treturn nil, errors.Join(err, errP)\n\t\t}\n\n\t\treturn analyzers, nil\n\t}\n\n\t// The type func cannot be used here, must be the explicit signature.\n\tconstructor, ok := symbol.(func(any) ([]*analysis.Analyzer, error))\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"plugin does not abide by 'New' function: %T\", symbol)\n\t}\n\n\treturn constructor(settings)\n}\n\nfunc (b *PluginGoBuilder) lookupAnalyzerPlugin(plug *plugin.Plugin) ([]*analysis.Analyzer, error) {\n\tsymbol, err := plug.Lookup(\"AnalyzerPlugin\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tb.log.Warnf(\"plugin: 'AnalyzerPlugin' plugins are deprecated, please use the new plugin signature: \" +\n\t\t\"https://golangci-lint.run/docs/plugins/go-plugins#create-a-plugin\")\n\n\tanalyzerPlugin, ok := symbol.(AnalyzerPlugin)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"plugin does not abide by 'AnalyzerPlugin' interface: %T\", symbol)\n\t}\n\n\treturn analyzerPlugin.GetAnalyzers(), nil\n}\n"
  },
  {
    "path": "pkg/lint/lintersdb/builder_plugin_module.go",
    "content": "package lintersdb\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/golangci/plugin-module-register/register\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nconst modulePluginType = \"module\"\n\n// PluginModuleBuilder builds the custom linters (module plugin) based on the configuration.\ntype PluginModuleBuilder struct {\n\tlog logutils.Log\n}\n\n// NewPluginModuleBuilder creates new PluginModuleBuilder.\nfunc NewPluginModuleBuilder(log logutils.Log) *PluginModuleBuilder {\n\treturn &PluginModuleBuilder{log: log}\n}\n\n// Build loads custom linters that are specified in the golangci-lint config file.\nfunc (b *PluginModuleBuilder) Build(cfg *config.Config) ([]*linter.Config, error) {\n\tif cfg == nil || b.log == nil {\n\t\treturn nil, nil\n\t}\n\n\tvar linters []*linter.Config\n\n\tfor name, settings := range cfg.Linters.Settings.Custom {\n\t\tif settings.Type != modulePluginType {\n\t\t\tcontinue\n\t\t}\n\n\t\tb.log.Infof(\"Loaded %s: %s\", settings.Path, name)\n\n\t\tnewPlugin, err := register.GetPlugin(name)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"plugin(%s): %w\", name, err)\n\t\t}\n\n\t\tp, err := newPlugin(settings.Settings)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"plugin(%s): newPlugin %w\", name, err)\n\t\t}\n\n\t\tanalyzers, err := p.BuildAnalyzers()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"plugin(%s): BuildAnalyzers %w\", name, err)\n\t\t}\n\n\t\tcustomLinter := goanalysis.NewLinter(name, settings.Description, analyzers, nil)\n\n\t\tswitch strings.ToLower(p.GetLoadMode()) {\n\t\tcase register.LoadModeSyntax:\n\t\t\tcustomLinter = customLinter.WithLoadMode(goanalysis.LoadModeSyntax)\n\t\tcase register.LoadModeTypesInfo:\n\t\t\tcustomLinter = customLinter.WithLoadMode(goanalysis.LoadModeTypesInfo)\n\t\tdefault:\n\t\t\tcustomLinter = customLinter.WithLoadMode(goanalysis.LoadModeTypesInfo)\n\t\t}\n\n\t\tlc := linter.NewConfig(customLinter).\n\t\t\tWithGroups(config.GroupStandard).\n\t\t\tWithURL(settings.OriginalURL)\n\n\t\tswitch strings.ToLower(p.GetLoadMode()) {\n\t\tcase register.LoadModeSyntax:\n\t\t\t// noop\n\t\tcase register.LoadModeTypesInfo:\n\t\t\tlc = lc.WithLoadForGoAnalysis()\n\t\tdefault:\n\t\t\tlc = lc.WithLoadForGoAnalysis()\n\t\t}\n\n\t\tlinters = append(linters, lc)\n\t}\n\n\treturn linters, nil\n}\n"
  },
  {
    "path": "pkg/lint/lintersdb/manager.go",
    "content": "package lintersdb\n\nimport (\n\t\"cmp\"\n\t\"fmt\"\n\t\"maps\"\n\t\"os\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype Builder interface {\n\tBuild(cfg *config.Config) ([]*linter.Config, error)\n}\n\n// Manager is a type of database for all linters (internals or plugins).\n// It provides methods to access to the linter sets.\ntype Manager struct {\n\tlog    logutils.Log\n\tdebugf logutils.DebugFunc\n\n\tcfg *config.Config\n\n\tlinters []*linter.Config\n\n\tnameToLCs map[string][]*linter.Config\n}\n\n// NewManager creates a new Manager.\n// This constructor will call the builders to build and store the linters.\nfunc NewManager(log logutils.Log, cfg *config.Config, builders ...Builder) (*Manager, error) {\n\tm := &Manager{\n\t\tlog:       log,\n\t\tdebugf:    logutils.Debug(logutils.DebugKeyEnabledLinters),\n\t\tnameToLCs: make(map[string][]*linter.Config),\n\t}\n\n\tm.cfg = cfg\n\tif cfg == nil {\n\t\tm.cfg = config.NewDefault()\n\t}\n\n\tfor _, builder := range builders {\n\t\tlinters, err := builder.Build(m.cfg)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"build linters: %w\", err)\n\t\t}\n\n\t\tm.linters = append(m.linters, linters...)\n\t}\n\n\tfor _, lc := range m.linters {\n\t\tfor _, name := range lc.AllNames() {\n\t\t\tm.nameToLCs[name] = append(m.nameToLCs[name], lc)\n\t\t}\n\t}\n\n\terr := NewValidator(m).Validate(m.cfg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn m, nil\n}\n\nfunc (m *Manager) GetLinterConfigs(name string) []*linter.Config {\n\treturn m.nameToLCs[name]\n}\n\nfunc (m *Manager) GetAllSupportedLinterConfigs() []*linter.Config {\n\treturn m.linters\n}\n\nfunc (m *Manager) GetEnabledLintersMap() (map[string]*linter.Config, error) {\n\tenabledLinters, err := m.build()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif os.Getenv(logutils.EnvTestRun) == \"1\" {\n\t\tm.verbosePrintLintersStatus(enabledLinters)\n\t}\n\n\treturn enabledLinters, nil\n}\n\n// GetOptimizedLinters returns enabled linters after optimization (merging) of multiple linters into a fewer number of linters.\n// E.g. some go/analysis linters can be optimized into one metalinter for data reuse and speed up.\nfunc (m *Manager) GetOptimizedLinters() ([]*linter.Config, error) {\n\tresultLintersSet, err := m.build()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tm.verbosePrintLintersStatus(resultLintersSet)\n\n\tm.combineGoAnalysisLinters(resultLintersSet)\n\n\t// Make order of execution of linters (go/analysis metalinter and unused) stable.\n\tresultLinters := slices.SortedFunc(maps.Values(resultLintersSet), func(a *linter.Config, b *linter.Config) int {\n\t\tif b.Name() == linter.LastLinter {\n\t\t\treturn -1\n\t\t}\n\n\t\tif a.Name() == linter.LastLinter {\n\t\t\treturn 1\n\t\t}\n\n\t\tif a.DoesChangeTypes != b.DoesChangeTypes {\n\t\t\t// move type-changing linters to the end to optimize speed\n\t\t\tif b.DoesChangeTypes {\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\treturn 1\n\t\t}\n\n\t\treturn strings.Compare(a.Name(), b.Name())\n\t})\n\n\treturn resultLinters, nil\n}\n\n//nolint:gocyclo // the complexity cannot be reduced.\nfunc (m *Manager) build() (map[string]*linter.Config, error) {\n\tm.debugf(\"Linters config: %#v\", m.cfg.Linters)\n\n\tresultLintersSet := map[string]*linter.Config{}\n\n\tgroupName := cmp.Or(m.cfg.Linters.Default, config.GroupStandard)\n\n\tswitch groupName {\n\tcase config.GroupNone:\n\t\t// no default linters\n\n\tcase config.GroupAll:\n\t\tresultLintersSet = linterConfigsToMap(m.linters)\n\n\tcase config.GroupFast:\n\t\tvar selected []*linter.Config\n\t\tfor _, lc := range m.linters {\n\t\t\tif lc.IsSlowLinter() {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tselected = append(selected, lc)\n\t\t}\n\n\t\tresultLintersSet = linterConfigsToMap(selected)\n\n\tcase config.GroupStandard:\n\t\tvar selected []*linter.Config\n\t\tfor _, lc := range m.linters {\n\t\t\tif !lc.FromGroup(config.GroupStandard) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tselected = append(selected, lc)\n\t\t}\n\n\t\tresultLintersSet = linterConfigsToMap(selected)\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown group: %s\", groupName)\n\t}\n\n\tfor _, name := range slices.Concat(m.cfg.Linters.Enable, m.cfg.Formatters.Enable) {\n\t\tfor _, lc := range m.GetLinterConfigs(name) {\n\t\t\t// it's important to use lc.Name() nor name because name can be alias\n\t\t\tresultLintersSet[lc.Name()] = lc\n\t\t}\n\t}\n\n\tfor _, name := range m.cfg.Linters.Disable {\n\t\tfor _, lc := range m.GetLinterConfigs(name) {\n\t\t\t// it's important to use lc.Name() nor name because name can be alias\n\t\t\tdelete(resultLintersSet, lc.Name())\n\t\t}\n\t}\n\n\tif m.cfg.Linters.FastOnly {\n\t\tfor lc := range maps.Values(resultLintersSet) {\n\t\t\tif lc.IsSlowLinter() {\n\t\t\t\t// it's important to use lc.Name() nor name because name can be alias\n\t\t\t\tdelete(resultLintersSet, lc.Name())\n\t\t\t}\n\t\t}\n\t}\n\n\t// typecheck is not a real linter and cannot be disabled.\n\tif _, ok := resultLintersSet[\"typecheck\"]; !ok && (m.cfg == nil || !m.cfg.InternalCmdTest) {\n\t\tfor _, lc := range m.GetLinterConfigs(\"typecheck\") {\n\t\t\t// it's important to use lc.Name() nor name because name can be alias\n\t\t\tresultLintersSet[lc.Name()] = lc\n\t\t}\n\t}\n\n\treturn resultLintersSet, nil\n}\n\nfunc (m *Manager) combineGoAnalysisLinters(linters map[string]*linter.Config) {\n\tmlConfig := &linter.Config{}\n\n\tvar goanalysisLinters []*goanalysis.Linter\n\n\tfor _, lc := range linters {\n\t\tlnt, ok := lc.Linter.(*goanalysis.Linter)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tif lnt.LoadMode() == goanalysis.LoadModeWholeProgram {\n\t\t\t// It's ineffective by CPU and memory to run whole-program and incremental analyzers at once.\n\t\t\tcontinue\n\t\t}\n\n\t\tmlConfig.LoadMode |= lc.LoadMode\n\n\t\tif lc.IsSlowLinter() {\n\t\t\tmlConfig.ConsiderSlow()\n\t\t}\n\n\t\tgoanalysisLinters = append(goanalysisLinters, lnt)\n\t}\n\n\tif len(goanalysisLinters) <= 1 {\n\t\tm.debugf(\"Didn't combine go/analysis linters: got only %d linters\", len(goanalysisLinters))\n\t\treturn\n\t}\n\n\tfor _, lnt := range goanalysisLinters {\n\t\tdelete(linters, lnt.Name())\n\t}\n\n\t// Make order of execution of go/analysis analyzers stable.\n\tsort.Slice(goanalysisLinters, func(i, j int) bool {\n\t\ta, b := goanalysisLinters[i], goanalysisLinters[j]\n\n\t\tif b.Name() == linter.LastLinter {\n\t\t\treturn true\n\t\t}\n\n\t\tif a.Name() == linter.LastLinter {\n\t\t\treturn false\n\t\t}\n\n\t\treturn a.Name() <= b.Name()\n\t})\n\n\tmlConfig.Linter = goanalysis.NewMetaLinter(goanalysisLinters)\n\n\tlinters[mlConfig.Linter.Name()] = mlConfig\n\n\tm.debugf(\"Combined %d go/analysis linters into one metalinter\", len(goanalysisLinters))\n}\n\nfunc (m *Manager) verbosePrintLintersStatus(lcs map[string]*linter.Config) {\n\tvar linterNames []string\n\tfor _, lc := range lcs {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tlinterNames = append(linterNames, lc.Name())\n\t}\n\tsort.Strings(linterNames)\n\tm.log.Infof(\"Active %d linters: %s\", len(linterNames), linterNames)\n}\n\nfunc linterConfigsToMap(lcs []*linter.Config) map[string]*linter.Config {\n\tret := map[string]*linter.Config{}\n\tfor _, lc := range lcs {\n\t\tif lc.IsDeprecated() && lc.Deprecation.Level > linter.DeprecationWarning {\n\t\t\tcontinue\n\t\t}\n\n\t\tif goformatters.IsFormatter(lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tret[lc.Name()] = lc\n\t}\n\n\treturn ret\n}\n"
  },
  {
    "path": "pkg/lint/lintersdb/manager_test.go",
    "content": "package lintersdb\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nfunc TestManager_GetEnabledLintersMap(t *testing.T) {\n\tcfg := config.NewDefault()\n\tcfg.Linters.Default = config.GroupNone\n\tcfg.Linters.Enable = []string{\"gofmt\"}\n\n\tm, err := NewManager(logutils.NewStderrLog(\"skip\"), cfg, NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\tlintersMap, err := m.GetEnabledLintersMap()\n\trequire.NoError(t, err)\n\n\tgofmtConfigs := m.GetLinterConfigs(\"gofmt\")\n\ttypecheckConfigs := m.GetLinterConfigs(\"typecheck\")\n\n\texpected := map[string]*linter.Config{\n\t\t\"gofmt\":     gofmtConfigs[0],\n\t\t\"typecheck\": typecheckConfigs[0],\n\t}\n\n\tassert.Equal(t, expected, lintersMap)\n}\n\nfunc TestManager_GetOptimizedLinters(t *testing.T) {\n\tcfg := config.NewDefault()\n\tcfg.Linters.Default = config.GroupNone\n\tcfg.Linters.Enable = []string{\"gofmt\"}\n\n\tm, err := NewManager(logutils.NewStderrLog(\"skip\"), cfg, NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\toptimizedLinters, err := m.GetOptimizedLinters()\n\trequire.NoError(t, err)\n\n\tvar gaLinters []*goanalysis.Linter\n\tfor _, l := range m.GetLinterConfigs(\"gofmt\") {\n\t\tgaLinters = append(gaLinters, l.Linter.(*goanalysis.Linter))\n\t}\n\tfor _, l := range m.GetLinterConfigs(\"typecheck\") {\n\t\tgaLinters = append(gaLinters, l.Linter.(*goanalysis.Linter))\n\t}\n\n\tmlConfig := &linter.Config{\n\t\tLinter: goanalysis.NewMetaLinter(gaLinters),\n\t}\n\n\texpected := []*linter.Config{mlConfig.WithLoadFiles()}\n\n\tassert.Equal(t, expected, optimizedLinters)\n}\n\nfunc TestManager_build(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tcfg      *config.Config\n\t\texpected []string // alphabetically ordered enabled linter names\n\t}{\n\t\t{\n\t\t\tdesc: \"enable gosec by primary name\",\n\t\t\tcfg: &config.Config{\n\t\t\t\tLinters: config.Linters{\n\t\t\t\t\tDefault: config.GroupNone,\n\t\t\t\t\tEnable:  []string{\"gosec\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"gosec\", \"typecheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"disable gosec by primary name\",\n\t\t\tcfg: &config.Config{\n\t\t\t\tLinters: config.Linters{\n\t\t\t\t\tDefault: config.GroupNone,\n\t\t\t\t\tDisable: []string{\"gosec\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"typecheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"linters and formatters\",\n\t\t\tcfg: &config.Config{\n\t\t\t\tLinters: config.Linters{\n\t\t\t\t\tDefault: config.GroupNone,\n\t\t\t\t\tEnable:  []string{\"gosec\"},\n\t\t\t\t},\n\t\t\t\tFormatters: config.Formatters{\n\t\t\t\t\tEnable: []string{\"gofmt\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"gosec\", \"gofmt\", \"typecheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"linters and formatters but linters configuration disables the formatter\",\n\t\t\tcfg: &config.Config{\n\t\t\t\tLinters: config.Linters{\n\t\t\t\t\tDefault: config.GroupNone,\n\t\t\t\t\tEnable:  []string{\"gosec\"},\n\t\t\t\t\tDisable: []string{\"gofmt\"},\n\t\t\t\t},\n\t\t\t\tFormatters: config.Formatters{\n\t\t\t\t\tEnable: []string{\"gofmt\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"gosec\", \"typecheck\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"only formatters\",\n\t\t\tcfg: &config.Config{\n\t\t\t\tLinters: config.Linters{\n\t\t\t\t\tDefault: config.GroupNone,\n\t\t\t\t},\n\t\t\t\tFormatters: config.Formatters{\n\t\t\t\t\tEnable: []string{\"gofmt\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"gofmt\", \"typecheck\"},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tm, err := NewManager(logutils.NewStderrLog(\"skip\"), test.cfg, NewLinterBuilder())\n\t\t\trequire.NoError(t, err)\n\n\t\t\tels, err := m.build()\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar enabledLinters []string\n\t\t\tfor ln, lc := range els {\n\t\t\t\tassert.Equal(t, ln, lc.Name())\n\t\t\t\tenabledLinters = append(enabledLinters, ln)\n\t\t\t}\n\n\t\t\tassert.ElementsMatch(t, test.expected, enabledLinters)\n\t\t})\n\t}\n}\n\nfunc TestManager_combineGoAnalysisLinters(t *testing.T) {\n\tm, err := NewManager(nil, nil)\n\trequire.NoError(t, err)\n\n\tfooTyped := goanalysis.NewLinter(\"foo\", \"example foo\", nil, nil).WithLoadMode(goanalysis.LoadModeTypesInfo)\n\tbarTyped := goanalysis.NewLinter(\"bar\", \"example bar\", nil, nil).WithLoadMode(goanalysis.LoadModeTypesInfo)\n\n\tfooSyntax := goanalysis.NewLinter(\"foo\", \"example foo\", nil, nil).WithLoadMode(goanalysis.LoadModeSyntax)\n\tbarSyntax := goanalysis.NewLinter(\"bar\", \"example bar\", nil, nil).WithLoadMode(goanalysis.LoadModeSyntax)\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tlinters  map[string]*linter.Config\n\t\texpected map[string]*linter.Config\n\t}{\n\t\t{\n\t\t\tdesc: \"no combined, one linter\",\n\t\t\tlinters: map[string]*linter.Config{\n\t\t\t\t\"foo\": {\n\t\t\t\t\tLinter: fooTyped,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: map[string]*linter.Config{\n\t\t\t\t\"foo\": {\n\t\t\t\t\tLinter: fooTyped,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"combined, several linters (typed)\",\n\t\t\tlinters: map[string]*linter.Config{\n\t\t\t\t\"foo\": {\n\t\t\t\t\tLinter: fooTyped,\n\t\t\t\t},\n\t\t\t\t\"bar\": {\n\t\t\t\t\tLinter: barTyped,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: func() map[string]*linter.Config {\n\t\t\t\tmlConfig := &linter.Config{\n\t\t\t\t\tLinter: goanalysis.NewMetaLinter([]*goanalysis.Linter{barTyped, fooTyped}),\n\t\t\t\t}\n\n\t\t\t\treturn map[string]*linter.Config{\n\t\t\t\t\t\"goanalysis_metalinter\": mlConfig,\n\t\t\t\t}\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tdesc: \"combined, several linters (different LoadMode)\",\n\t\t\tlinters: map[string]*linter.Config{\n\t\t\t\t\"foo\": {\n\t\t\t\t\tLinter:   fooTyped,\n\t\t\t\t\tLoadMode: packages.NeedName,\n\t\t\t\t},\n\t\t\t\t\"bar\": {\n\t\t\t\t\tLinter:   barTyped,\n\t\t\t\t\tLoadMode: packages.NeedTypesSizes,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: func() map[string]*linter.Config {\n\t\t\t\tmlConfig := &linter.Config{\n\t\t\t\t\tLinter:   goanalysis.NewMetaLinter([]*goanalysis.Linter{barTyped, fooTyped}),\n\t\t\t\t\tLoadMode: packages.NeedName | packages.NeedTypesSizes,\n\t\t\t\t}\n\n\t\t\t\treturn map[string]*linter.Config{\n\t\t\t\t\t\"goanalysis_metalinter\": mlConfig,\n\t\t\t\t}\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tdesc: \"combined, several linters (same LoadMode)\",\n\t\t\tlinters: map[string]*linter.Config{\n\t\t\t\t\"foo\": {\n\t\t\t\t\tLinter:   fooTyped,\n\t\t\t\t\tLoadMode: packages.NeedName,\n\t\t\t\t},\n\t\t\t\t\"bar\": {\n\t\t\t\t\tLinter:   barTyped,\n\t\t\t\t\tLoadMode: packages.NeedName,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: func() map[string]*linter.Config {\n\t\t\t\tmlConfig := &linter.Config{\n\t\t\t\t\tLinter:   goanalysis.NewMetaLinter([]*goanalysis.Linter{barTyped, fooTyped}),\n\t\t\t\t\tLoadMode: packages.NeedName,\n\t\t\t\t}\n\n\t\t\t\treturn map[string]*linter.Config{\n\t\t\t\t\t\"goanalysis_metalinter\": mlConfig,\n\t\t\t\t}\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tdesc: \"combined, several linters (syntax)\",\n\t\t\tlinters: map[string]*linter.Config{\n\t\t\t\t\"foo\": {\n\t\t\t\t\tLinter: fooSyntax,\n\t\t\t\t},\n\t\t\t\t\"bar\": {\n\t\t\t\t\tLinter: barSyntax,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: func() map[string]*linter.Config {\n\t\t\t\tmlConfig := &linter.Config{\n\t\t\t\t\tLinter: goanalysis.NewMetaLinter([]*goanalysis.Linter{barSyntax, fooSyntax}),\n\t\t\t\t}\n\n\t\t\t\treturn map[string]*linter.Config{\n\t\t\t\t\t\"goanalysis_metalinter\": mlConfig,\n\t\t\t\t}\n\t\t\t}(),\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tm.combineGoAnalysisLinters(test.linters)\n\n\t\t\tassert.Equal(t, test.expected, test.linters)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/lint/lintersdb/validator.go",
    "content": "package lintersdb\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype Validator struct {\n\tm *Manager\n}\n\nfunc NewValidator(m *Manager) *Validator {\n\treturn &Validator{m: m}\n}\n\n// Validate validates the configuration by calling all other validators for different\n// sections in the configuration and then some additional linter validation functions.\nfunc (v Validator) Validate(cfg *config.Config) error {\n\tvalidators := []func(cfg *config.Linters) error{\n\t\tv.validateLintersNames,\n\t\tv.alternativeNamesDeprecation,\n\t}\n\n\tfor _, v := range validators {\n\t\tif err := v(&cfg.Linters); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (v Validator) validateLintersNames(cfg *config.Linters) error {\n\tvar unknownNames []string\n\n\tfor _, name := range cfg.Enable {\n\t\tif v.m.GetLinterConfigs(name) == nil {\n\t\t\tunknownNames = append(unknownNames, name)\n\t\t}\n\t}\n\n\tfor _, name := range cfg.Disable {\n\t\tlcs := v.m.GetLinterConfigs(name)\n\t\tif len(lcs) == 0 {\n\t\t\tunknownNames = append(unknownNames, name)\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, lc := range lcs {\n\t\t\tif lc.IsDeprecated() && lc.Deprecation.Level > linter.DeprecationWarning {\n\t\t\t\tv.m.log.Warnf(\"The linter %q is deprecated (step 2) and deactivated. \"+\n\t\t\t\t\t\"It should be removed from the list of disabled linters. \"+\n\t\t\t\t\t\"https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle\", lc.Name())\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(unknownNames) > 0 {\n\t\treturn fmt.Errorf(\"unknown linters: '%v', run 'golangci-lint help linters' to see the list of supported linters\",\n\t\t\tstrings.Join(unknownNames, \",\"))\n\t}\n\n\treturn nil\n}\n\nfunc (v Validator) alternativeNamesDeprecation(cfg *config.Linters) error {\n\tif v.m.cfg.InternalTest || v.m.cfg.InternalCmdTest || os.Getenv(logutils.EnvTestRun) == \"1\" {\n\t\treturn nil\n\t}\n\n\taltNames := map[string][]string{}\n\tfor _, lc := range v.m.GetAllSupportedLinterConfigs() {\n\t\tfor _, alt := range lc.AlternativeNames {\n\t\t\taltNames[alt] = append(altNames[alt], lc.Name())\n\t\t}\n\t}\n\n\tnames := cfg.Enable\n\tnames = append(names, cfg.Disable...)\n\n\tfor _, name := range names {\n\t\tlc, ok := altNames[name]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(lc) > 1 {\n\t\t\tv.m.log.Warnf(\"The linter named %q is deprecated. It has been split into: %s.\", name, strings.Join(lc, \", \"))\n\t\t} else {\n\t\t\tv.m.log.Warnf(\"The name %q is deprecated. The linter has been renamed to: %s.\", name, lc[0])\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/lint/lintersdb/validator_test.go",
    "content": "package lintersdb\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\ntype validateErrorTestCase struct {\n\tdesc     string\n\tcfg      *config.Linters\n\texpected string\n}\n\nvar validateLintersNamesErrorTestCases = []validateErrorTestCase{\n\t{\n\t\tdesc: \"unknown enabled linter\",\n\t\tcfg: &config.Linters{\n\t\t\tEnable:  []string{\"golangci\"},\n\t\t\tDisable: nil,\n\t\t},\n\t\texpected: `unknown linters: 'golangci', run 'golangci-lint help linters' to see the list of supported linters`,\n\t},\n\t{\n\t\tdesc: \"unknown disabled linter\",\n\t\tcfg: &config.Linters{\n\t\t\tEnable:  nil,\n\t\t\tDisable: []string{\"golangci\"},\n\t\t},\n\t\texpected: `unknown linters: 'golangci', run 'golangci-lint help linters' to see the list of supported linters`,\n\t},\n}\n\ntype validatorTestCase struct {\n\tdesc string\n\tcfg  *config.Linters\n}\n\nvar validateLintersNamesTestCases = []validatorTestCase{\n\t{\n\t\tdesc: \"no enable no disable\",\n\t\tcfg: &config.Linters{\n\t\t\tEnable:  nil,\n\t\t\tDisable: nil,\n\t\t},\n\t},\n\t{\n\t\tdesc: \"existing enabled linter\",\n\t\tcfg: &config.Linters{\n\t\t\tEnable:  []string{\"gofmt\"},\n\t\t\tDisable: nil,\n\t\t},\n\t},\n\t{\n\t\tdesc: \"existing disabled linter\",\n\t\tcfg: &config.Linters{\n\t\t\tEnable:  nil,\n\t\t\tDisable: []string{\"gofmt\"},\n\t\t},\n\t},\n}\n\nfunc TestValidator_Validate(t *testing.T) {\n\tm, err := NewManager(nil, nil, NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\tv := NewValidator(m)\n\n\tvar testCases []validatorTestCase\n\ttestCases = append(testCases, validateLintersNamesTestCases...)\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := v.Validate(&config.Config{Linters: *test.cfg})\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestValidator_Validate_error(t *testing.T) {\n\tm, err := NewManager(nil, nil, NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\tv := NewValidator(m)\n\n\tvar testCases []validateErrorTestCase\n\ttestCases = append(testCases, validateLintersNamesErrorTestCases...)\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := v.Validate(&config.Config{Linters: *test.cfg})\n\t\t\trequire.Error(t, err)\n\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n\nfunc TestValidator_validateLintersNames(t *testing.T) {\n\tm, err := NewManager(nil, nil, NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\tv := NewValidator(m)\n\n\tfor _, test := range validateLintersNamesTestCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := v.validateLintersNames(test.cfg)\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestValidator_validateLintersNames_error(t *testing.T) {\n\tm, err := NewManager(nil, nil, NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\tv := NewValidator(m)\n\n\tfor _, test := range validateLintersNamesErrorTestCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terr := v.validateLintersNames(test.cfg)\n\t\t\trequire.Error(t, err)\n\n\t\t\trequire.EqualError(t, err, test.expected)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/lint/package.go",
    "content": "package lint\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"go/build\"\n\t\"go/token\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/ldez/grignotin/goenv\"\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goanalysis/load\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\n// PackageLoader loads packages based on [golang.org/x/tools/go/packages.Load].\ntype PackageLoader struct {\n\tlog    logutils.Log\n\tdebugf logutils.DebugFunc\n\n\tcfg *config.Config\n\n\targs []string\n\n\tpkgTestIDRe *regexp.Regexp\n\n\tgoenv *goutil.Env\n\n\tloadGuard *load.Guard\n}\n\n// NewPackageLoader creates a new PackageLoader.\nfunc NewPackageLoader(log logutils.Log, cfg *config.Config, args []string, env *goutil.Env, loadGuard *load.Guard) *PackageLoader {\n\treturn &PackageLoader{\n\t\tcfg:         cfg,\n\t\targs:        args,\n\t\tlog:         log,\n\t\tdebugf:      logutils.Debug(logutils.DebugKeyLoader),\n\t\tgoenv:       env,\n\t\tpkgTestIDRe: regexp.MustCompile(`^(.*) \\[(.*)\\.test\\]`),\n\t\tloadGuard:   loadGuard,\n\t}\n}\n\n// Load loads packages.\nfunc (l *PackageLoader) Load(ctx context.Context, linters []*linter.Config) (pkgs, deduplicatedPkgs []*packages.Package, err error) {\n\tloadMode := findLoadMode(linters)\n\n\tpkgs, err = l.loadPackages(ctx, loadMode)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to load packages: %w\", err)\n\t}\n\n\treturn pkgs, l.filterDuplicatePackages(pkgs), nil\n}\n\nfunc (l *PackageLoader) loadPackages(ctx context.Context, loadMode packages.LoadMode) ([]*packages.Package, error) {\n\tdefer func(startedAt time.Time) {\n\t\tl.log.Infof(\"Go packages loading at mode %s took %s\", stringifyLoadMode(loadMode), time.Since(startedAt))\n\t}(time.Now())\n\n\tl.prepareBuildContext()\n\n\tconf := &packages.Config{\n\t\tMode:       loadMode,\n\t\tTests:      l.cfg.Run.AnalyzeTests,\n\t\tContext:    ctx,\n\t\tBuildFlags: l.makeBuildFlags(),\n\t\tLogf:       l.debugf,\n\t\t// TODO: use fset, parsefile, overlay\n\t}\n\n\targs := buildArgs(l.args)\n\n\tl.debugf(\"Built loader args are %s\", args)\n\n\tpkgs, err := packages.Load(conf, args...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to load with go/packages: %w\", err)\n\t}\n\n\tif loadMode&packages.NeedSyntax == 0 {\n\t\t// Needed e.g. for go/analysis loading.\n\t\tfset := token.NewFileSet()\n\t\tpackages.Visit(pkgs, nil, func(pkg *packages.Package) {\n\t\t\tpkg.Fset = fset\n\t\t\tl.loadGuard.AddMutexForPkg(pkg)\n\t\t})\n\t}\n\n\tl.debugPrintLoadedPackages(pkgs)\n\n\tif err := l.parseLoadedPackagesErrors(pkgs); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn l.filterTestMainPackages(pkgs), nil\n}\n\nfunc (*PackageLoader) parseLoadedPackagesErrors(pkgs []*packages.Package) error {\n\tfor _, pkg := range pkgs {\n\t\tvar errs []packages.Error\n\t\tfor _, err := range pkg.Errors {\n\t\t\t// quick fix: skip error related to `go list` invocation by packages.Load()\n\t\t\t// The behavior has been changed between go1.19 and go1.20, the error is now inside the JSON content.\n\t\t\t// https://github.com/golangci/golangci-lint/pull/3414#issuecomment-1364756303\n\t\t\tif strings.Contains(err.Msg, \"# command-line-arguments\") {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\terrs = append(errs, err)\n\n\t\t\tif strings.Contains(err.Msg, \"no Go files\") {\n\t\t\t\treturn fmt.Errorf(\"package %s: %w\", pkg.PkgPath, exitcodes.ErrNoGoFiles)\n\t\t\t}\n\t\t\tif strings.Contains(err.Msg, \"cannot find package\") {\n\t\t\t\t// when analyzing not existing directory\n\t\t\t\treturn fmt.Errorf(\"%v: %w\", err.Msg, exitcodes.ErrFailure)\n\t\t\t}\n\t\t}\n\n\t\tpkg.Errors = errs\n\t}\n\n\treturn nil\n}\n\nfunc (l *PackageLoader) tryParseTestPackage(pkg *packages.Package) (name string, isTest bool) {\n\tmatches := l.pkgTestIDRe.FindStringSubmatch(pkg.ID)\n\tif matches == nil {\n\t\treturn \"\", false\n\t}\n\n\treturn matches[1], true\n}\n\nfunc (l *PackageLoader) filterDuplicatePackages(pkgs []*packages.Package) []*packages.Package {\n\tpackagesWithTests := map[string]bool{}\n\tfor _, pkg := range pkgs {\n\t\tname, isTest := l.tryParseTestPackage(pkg)\n\t\tif !isTest {\n\t\t\tcontinue\n\t\t}\n\t\tpackagesWithTests[name] = true\n\t}\n\n\tl.debugf(\"package with tests: %#v\", packagesWithTests)\n\n\tvar retPkgs []*packages.Package\n\tfor _, pkg := range pkgs {\n\t\t_, isTest := l.tryParseTestPackage(pkg)\n\t\tif !isTest && packagesWithTests[pkg.PkgPath] {\n\t\t\t// If tests loading is enabled,\n\t\t\t// for package with files a.go and a_test.go go/packages loads two packages:\n\t\t\t// 1. ID=\".../a\" GoFiles=[a.go]\n\t\t\t// 2. ID=\".../a [.../a.test]\" GoFiles=[a.go a_test.go]\n\t\t\t// We need only the second package, otherwise we can get warnings about unused variables/fields/functions\n\t\t\t// in a.go if they are used only in a_test.go.\n\t\t\tl.debugf(\"skip pkg ID=%s because we load it with test package\", pkg.ID)\n\t\t\tcontinue\n\t\t}\n\n\t\tretPkgs = append(retPkgs, pkg)\n\t}\n\n\treturn retPkgs\n}\n\nfunc (l *PackageLoader) filterTestMainPackages(pkgs []*packages.Package) []*packages.Package {\n\tvar retPkgs []*packages.Package\n\tfor _, pkg := range pkgs {\n\t\tif pkg.Name == \"main\" && strings.HasSuffix(pkg.PkgPath, \".test\") {\n\t\t\t// it's an implicit testmain package\n\t\t\tl.debugf(\"skip pkg ID=%s\", pkg.ID)\n\t\t\tcontinue\n\t\t}\n\n\t\tretPkgs = append(retPkgs, pkg)\n\t}\n\n\treturn retPkgs\n}\n\nfunc (l *PackageLoader) debugPrintLoadedPackages(pkgs []*packages.Package) {\n\tl.debugf(\"loaded %d pkgs\", len(pkgs))\n\tfor i, pkg := range pkgs {\n\t\tvar syntaxFiles []string\n\t\tfor _, sf := range pkg.Syntax {\n\t\t\tsyntaxFiles = append(syntaxFiles, pkg.Fset.Position(sf.Pos()).Filename)\n\t\t}\n\t\tl.debugf(\"Loaded pkg #%d: ID=%s GoFiles=%s CompiledGoFiles=%s Syntax=%s\",\n\t\t\ti, pkg.ID, pkg.GoFiles, pkg.CompiledGoFiles, syntaxFiles)\n\t}\n}\n\nfunc (l *PackageLoader) prepareBuildContext() {\n\t// Set GOROOT to have working cross-compilation: cross-compiled binaries\n\t// have invalid GOROOT. XXX: can't use runtime.GOROOT().\n\tgoroot := l.goenv.Get(goenv.GOROOT)\n\tif goroot == \"\" {\n\t\treturn\n\t}\n\n\t_ = os.Setenv(goenv.GOROOT, goroot)\n\n\tbuild.Default.GOROOT = goroot\n\tbuild.Default.BuildTags = l.cfg.Run.BuildTags\n}\n\nfunc (l *PackageLoader) makeBuildFlags() []string {\n\tvar buildFlags []string\n\n\tif len(l.cfg.Run.BuildTags) != 0 {\n\t\t// go help build\n\t\tbuildFlags = append(buildFlags, \"-tags\", strings.Join(l.cfg.Run.BuildTags, \" \"))\n\t\tl.log.Infof(\"Using build tags: %v\", l.cfg.Run.BuildTags)\n\t}\n\n\tif l.cfg.Run.ModulesDownloadMode != \"\" {\n\t\t// go help modules\n\t\tbuildFlags = append(buildFlags, fmt.Sprintf(\"-mod=%s\", l.cfg.Run.ModulesDownloadMode))\n\t}\n\n\tif !l.cfg.Run.EnableBuildVCS {\n\t\t// disable collecting VCS information\n\t\tbuildFlags = append(buildFlags, \"-buildvcs=false\")\n\t}\n\n\treturn buildFlags\n}\n\nfunc buildArgs(args []string) []string {\n\tif len(args) == 0 {\n\t\treturn []string{\"./...\"}\n\t}\n\n\tvar retArgs []string\n\tfor _, arg := range args {\n\t\tif strings.HasPrefix(arg, \".\") || filepath.IsAbs(arg) {\n\t\t\tretArgs = append(retArgs, arg)\n\t\t} else {\n\t\t\t// go/packages doesn't work well if we don't have the prefix ./ for local packages\n\t\t\tretArgs = append(retArgs, fmt.Sprintf(\".%c%s\", filepath.Separator, arg))\n\t\t}\n\t}\n\n\treturn retArgs\n}\n\nfunc findLoadMode(linters []*linter.Config) packages.LoadMode {\n\tloadMode := packages.LoadMode(0)\n\tfor _, lc := range linters {\n\t\tloadMode |= lc.LoadMode\n\t}\n\n\treturn loadMode\n}\n\nfunc stringifyLoadMode(mode packages.LoadMode) string {\n\tm := map[packages.LoadMode]string{\n\t\tpackages.NeedCompiledGoFiles: \"compiled_files\",\n\t\tpackages.NeedDeps:            \"deps\",\n\t\tpackages.NeedExportFile:      \"exports_file\",\n\t\tpackages.NeedFiles:           \"files\",\n\t\tpackages.NeedImports:         \"imports\",\n\t\tpackages.NeedName:            \"name\",\n\t\tpackages.NeedSyntax:          \"syntax\",\n\t\tpackages.NeedTypes:           \"types\",\n\t\tpackages.NeedTypesInfo:       \"types_info\",\n\t\tpackages.NeedTypesSizes:      \"types_sizes\",\n\t}\n\n\tvar flags []string\n\tfor flag, flagStr := range m {\n\t\tif mode&flag != 0 {\n\t\t\tflags = append(flags, flagStr)\n\t\t}\n\t}\n\n\treturn fmt.Sprintf(\"%d (%s)\", mode, strings.Join(flags, \"|\"))\n}\n"
  },
  {
    "path": "pkg/lint/package_test.go",
    "content": "package lint\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_buildArgs(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\targs     []string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc:     \"empty\",\n\t\t\targs:     nil,\n\t\t\texpected: []string{\"./...\"},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"start with a dot\",\n\t\t\targs:     []string{filepath.FromSlash(\"./foo\")},\n\t\t\texpected: []string{filepath.FromSlash(\"./foo\")},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"start without a dot\",\n\t\t\targs:     []string{\"foo\"},\n\t\t\texpected: []string{filepath.FromSlash(\"./foo\")},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"absolute path\",\n\t\t\targs:     []string{mustAbs(t, \"/tmp/foo\")},\n\t\t\texpected: []string{mustAbs(t, \"/tmp/foo\")},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tresults := buildArgs(test.args)\n\n\t\t\tassert.Equal(t, test.expected, results)\n\t\t})\n\t}\n}\n\nfunc mustAbs(t *testing.T, p string) string {\n\tt.Helper()\n\n\tabs, err := filepath.Abs(filepath.FromSlash(p))\n\trequire.NoError(t, err)\n\n\treturn abs\n}\n"
  },
  {
    "path": "pkg/lint/runner.go",
    "content": "package lint\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"maps\"\n\t\"runtime/debug\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/errorutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result/processors\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/timeutils\"\n)\n\ntype processorStat struct {\n\tinCount  int\n\toutCount int\n}\n\ntype Runner struct {\n\tLog logutils.Log\n\n\tlintCtx    *linter.Context\n\tProcessors []processors.Processor\n}\n\nfunc NewRunner(log logutils.Log, cfg *config.Config, goenv *goutil.Env,\n\tlineCache *fsutils.LineCache, fileCache *fsutils.FileCache,\n\tdbManager *lintersdb.Manager, lintCtx *linter.Context,\n) (*Runner, error) {\n\tpathRelativity, err := processors.NewPathRelativity(log, cfg.GetBasePath())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating path relativity processor: %w\", err)\n\t}\n\n\texclusionPaths, err := processors.NewExclusionPaths(log, &cfg.Linters.Exclusions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tenabledLinters, err := dbManager.GetEnabledLintersMap()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get enabled linters: %w\", err)\n\t}\n\n\tvar enabledFormatters []string\n\tfor name := range maps.Keys(enabledLinters) {\n\t\tif goformatters.IsFormatter(name) {\n\t\t\tenabledFormatters = append(enabledFormatters, name)\n\t\t}\n\t}\n\n\tswitch len(enabledLinters) {\n\tcase 0:\n\t\treturn nil, errors.New(\"no linters enabled\")\n\tcase 1:\n\t\tif _, ok := enabledLinters[\"typecheck\"]; ok {\n\t\t\treturn nil, errors.New(\"no linters enabled\")\n\t\t}\n\t}\n\n\tformattersCfg := &config.Formatters{\n\t\tEnable:   enabledFormatters,\n\t\tSettings: cfg.Linters.Settings.FormatterSettings,\n\t}\n\n\tmetaFormatter, err := goformatters.NewMetaFormatter(log, formattersCfg, &cfg.Run)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create meta-formatter: %w\", err)\n\t}\n\n\treturn &Runner{\n\t\tProcessors: []processors.Processor{\n\t\t\t// Must be the first processor.\n\t\t\tprocessors.NewPathAbsoluter(log),\n\n\t\t\tprocessors.NewCgo(goenv),\n\n\t\t\t// Must be after Cgo.\n\t\t\tprocessors.NewFilenameUnadjuster(lintCtx.Packages, log.Child(logutils.DebugKeyFilenameUnadjuster)),\n\n\t\t\t// Must be after FilenameUnadjuster.\n\t\t\tprocessors.NewInvalidIssue(log.Child(logutils.DebugKeyInvalidIssue)),\n\n\t\t\t// Must be after PathAbsoluter, Cgo, FilenameUnadjuster InvalidIssue.\n\t\t\tpathRelativity,\n\n\t\t\t// Must be after PathRelativity.\n\t\t\texclusionPaths,\n\n\t\t\tprocessors.NewGeneratedFileFilter(cfg.Linters.Exclusions.Generated),\n\n\t\t\tprocessors.NewExclusionRules(log.Child(logutils.DebugKeyExclusionRules), lineCache,\n\t\t\t\t&cfg.Linters.Exclusions),\n\n\t\t\tprocessors.NewNolintFilter(log.Child(logutils.DebugKeyNolintFilter), dbManager, enabledLinters),\n\n\t\t\tprocessors.NewDiff(&cfg.Issues),\n\n\t\t\t// The fixer still needs to see paths for the issues that are relative to the current directory.\n\t\t\tprocessors.NewFixer(cfg, log, fileCache, metaFormatter),\n\n\t\t\t// Must be after the Fixer.\n\t\t\tprocessors.NewUniqByLine(cfg.Issues.UniqByLine),\n\t\t\tprocessors.NewMaxPerFileFromLinter(cfg),\n\t\t\tprocessors.NewMaxSameIssues(cfg.Issues.MaxSameIssues, log.Child(logutils.DebugKeyMaxSameIssues), cfg),\n\t\t\tprocessors.NewMaxFromLinter(cfg.Issues.MaxIssuesPerLinter, log.Child(logutils.DebugKeyMaxFromLinter), cfg),\n\n\t\t\t// Now we can modify the issues for output.\n\t\t\tprocessors.NewSourceCode(lineCache, log.Child(logutils.DebugKeySourceCode)),\n\t\t\tprocessors.NewPathShortener(),\n\t\t\tprocessors.NewSeverity(log.Child(logutils.DebugKeySeverityRules), lineCache, &cfg.Severity),\n\t\t\tprocessors.NewPathPrettifier(log, &cfg.Output),\n\t\t\tprocessors.NewSortResults(&cfg.Output),\n\t\t},\n\t\tlintCtx: lintCtx,\n\t\tLog:     log,\n\t}, nil\n}\n\nfunc (r *Runner) Run(ctx context.Context, linters []*linter.Config) ([]*result.Issue, error) {\n\tsw := timeutils.NewStopwatch(\"linters\", r.Log)\n\tdefer sw.Print()\n\n\tvar (\n\t\tlintErrors error\n\t\tissues     []*result.Issue\n\t)\n\n\tfor _, lc := range linters {\n\t\tlinterIssues, err := timeutils.TrackStage(sw, lc.Name(), func() ([]*result.Issue, error) {\n\t\t\treturn r.runLinterSafe(ctx, r.lintCtx, lc)\n\t\t})\n\t\tif err != nil {\n\t\t\tlintErrors = errors.Join(lintErrors, fmt.Errorf(\"can't run linter %s\", lc.Linter.Name()), err)\n\t\t\tr.Log.Warnf(\"Can't run linter %s: %v\", lc.Linter.Name(), err)\n\n\t\t\tcontinue\n\t\t}\n\n\t\tissues = append(issues, linterIssues...)\n\t}\n\n\treturn r.processLintResults(issues), lintErrors\n}\n\nfunc (r *Runner) runLinterSafe(ctx context.Context, lintCtx *linter.Context,\n\tlc *linter.Config,\n) (ret []*result.Issue, err error) {\n\tdefer func() {\n\t\tif panicData := recover(); panicData != nil {\n\t\t\tif pe, ok := panicData.(*errorutil.PanicError); ok {\n\t\t\t\terr = fmt.Errorf(\"%s: %w\", lc.Name(), pe)\n\n\t\t\t\t// Don't print stacktrace from goroutines twice\n\t\t\t\tr.Log.Errorf(\"Panic: %s: %s\", pe, pe.Stack())\n\t\t\t} else {\n\t\t\t\terr = fmt.Errorf(\"panic occurred: %s\", panicData)\n\t\t\t\tr.Log.Errorf(\"Panic stack trace: %s\", debug.Stack())\n\t\t\t}\n\t\t}\n\t}()\n\n\tissues, err := lc.Linter.Run(ctx, lintCtx)\n\n\tif lc.DoesChangeTypes {\n\t\t// Packages in lintCtx might be dirty due to the last analysis,\n\t\t// which affects to the next analysis.\n\t\t// To avoid this issue, we clear type information from the packages.\n\t\t// See https://github.com/golangci/golangci-lint/pull/944.\n\t\t// Currently, DoesChangeTypes is true only for `unused`.\n\t\tlintCtx.ClearTypesInPackages()\n\t}\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor i := range issues {\n\t\tif issues[i].FromLinter == \"\" {\n\t\t\tissues[i].FromLinter = lc.Name()\n\t\t}\n\t}\n\n\treturn issues, nil\n}\n\nfunc (r *Runner) processLintResults(inIssues []*result.Issue) []*result.Issue {\n\tsw := timeutils.NewStopwatch(\"processing\", r.Log)\n\n\tvar issuesBefore, issuesAfter int\n\tstatPerProcessor := map[string]processorStat{}\n\n\tvar outIssues []*result.Issue\n\tif len(inIssues) != 0 {\n\t\tissuesBefore += len(inIssues)\n\t\toutIssues = r.processIssues(inIssues, sw, statPerProcessor)\n\t\tissuesAfter += len(outIssues)\n\t}\n\n\t// finalize processors: logging, clearing, no heavy work here\n\n\tfor _, p := range r.Processors {\n\t\tsw.TrackStage(p.Name(), p.Finish)\n\t}\n\n\tif issuesBefore != issuesAfter {\n\t\tr.Log.Infof(\"Issues before processing: %d, after processing: %d\", issuesBefore, issuesAfter)\n\t}\n\tr.printPerProcessorStat(statPerProcessor)\n\tsw.PrintStages()\n\n\treturn outIssues\n}\n\nfunc (r *Runner) printPerProcessorStat(stat map[string]processorStat) {\n\tparts := make([]string, 0, len(stat))\n\tfor name, ps := range stat {\n\t\tif ps.inCount != 0 {\n\t\t\tparts = append(parts, fmt.Sprintf(\"%s: %d/%d\", name, ps.inCount, ps.outCount))\n\t\t}\n\t}\n\tif len(parts) != 0 {\n\t\tr.Log.Infof(\"Processors filtering stat (in/out): %s\", strings.Join(parts, \", \"))\n\t}\n}\n\nfunc (r *Runner) processIssues(issues []*result.Issue, sw *timeutils.Stopwatch, statPerProcessor map[string]processorStat) []*result.Issue {\n\tfor _, p := range r.Processors {\n\t\tnewIssues, err := timeutils.TrackStage(sw, p.Name(), func() ([]*result.Issue, error) {\n\t\t\treturn p.Process(issues)\n\t\t})\n\n\t\tif err != nil {\n\t\t\tr.Log.Warnf(\"Can't process results by %s processor: %s\", p.Name(), err)\n\t\t} else {\n\t\t\tstat := statPerProcessor[p.Name()]\n\t\t\tstat.inCount += len(issues)\n\t\t\tstat.outCount += len(newIssues)\n\t\t\tstatPerProcessor[p.Name()] = stat\n\t\t\tissues = newIssues\n\t\t}\n\n\t\t// This is required by JSON serialization\n\t\tif issues == nil {\n\t\t\tissues = []*result.Issue{}\n\t\t}\n\t}\n\n\treturn issues\n}\n"
  },
  {
    "path": "pkg/logutils/log.go",
    "content": "package logutils\n\ntype Log interface {\n\tFatalf(format string, args ...any)\n\tPanicf(format string, args ...any)\n\tErrorf(format string, args ...any)\n\tWarnf(format string, args ...any)\n\tInfof(format string, args ...any)\n\n\tChild(name string) Log\n\tSetLevel(level LogLevel)\n}\n\ntype LogLevel int\n\nconst (\n\t// LogLevelDebug Debug messages, write to debug logs only by logutils.Debug.\n\tLogLevelDebug LogLevel = 0\n\n\t// LogLevelInfo Information messages, don't write too many messages,\n\t// only useful ones: they are shown when running with -v.\n\tLogLevelInfo LogLevel = 1\n\n\t// LogLevelWarn Hidden errors: non-critical errors: work can be continued, no need to fail whole program;\n\t// tests will crash if any warning occurred.\n\tLogLevelWarn LogLevel = 2\n\n\t// LogLevelError Only not hidden from user errors: whole program failing, usually\n\t// error logging happens in 1-2 places: in the \"main\" function.\n\tLogLevelError LogLevel = 3\n)\n"
  },
  {
    "path": "pkg/logutils/logutils.go",
    "content": "package logutils\n\nimport (\n\t\"os\"\n\t\"strings\"\n)\n\n// EnvTestRun value: \"1\"\nconst EnvTestRun = \"GL_TEST_RUN\"\n\n// envDebug value: one or several debug keys.\n// examples:\n// - Remove output to `/dev/null`: `GL_DEBUG=linters_output ./golangci-lint run`\n// - Show linters configuration: `GL_DEBUG=enabled_linters golangci-lint run`\n// - Some analysis details: `GL_DEBUG=goanalysis/analyze,goanalysis/facts golangci-lint run`\nconst envDebug = \"GL_DEBUG\"\n\nconst (\n\tDebugKeyBinSalt        = \"bin_salt\"      // Forces the usage of constant as salt (only for maintainers).\n\tDebugKeyGoModSalt      = \"gomod_salt\"    // Display logs related to the salt computation from the go.mod file.\n\tDebugKeyConfigReader   = \"config_reader\" // Display logs related to configuration loading.\n\tDebugKeyEmpty          = \"\"\n\tDebugKeyEnabledLinters = \"enabled_linters\" // Display logs related to the enabled linters inside the [lintersdb.Manager].\n\tDebugKeyExec           = \"exec\"            // Display logs related to the lock file.\n\tDebugKeyGoEnv          = \"goenv\"           // Display logs related to [goenv.Env].\n\tDebugKeyLintersContext = \"linters_context\" // Display logs related to the package analysis context (not related to [context.Context]).\n\tDebugKeyLintersDB      = \"lintersdb\"       // Display logs related to the linters/formatters loading.\n\tDebugKeyLoader         = \"loader\"          // Display logs related to package loading (including `go/packages` internal debugging).\n\tDebugKeyPkgCache       = \"pkgcache\"        // Display logs related to cache.\n\tDebugKeyRunner         = \"runner\"          // Display logs related to the linter runner.\n\tDebugKeyStopwatch      = \"stopwatch\"       // Display logs related to the stopwatch of the cache.\n\tDebugKeyTest           = \"test\"            // Display debug logs during integration tests.\n)\n\n// Printers.\nconst (\n\tDebugKeyCheckstylePrinter  = \"checkstyle_printer\"\n\tDebugKeyCodeClimatePrinter = \"codeclimate_printer\"\n\tDebugKeySarifPrinter       = \"sarif_printer\"\n\tDebugKeyTabPrinter         = \"tab_printer\"\n\tDebugKeyTeamCityPrinter    = \"teamcity_printer\"\n\tDebugKeyTextPrinter        = \"text_printer\"\n)\n\n// Processors.\nconst (\n\tDebugKeyExclusionPaths      = \"exclusion_paths\"\n\tDebugKeyExclusionRules      = \"exclusion_rules\"\n\tDebugKeyFilenameUnadjuster  = \"filename_unadjuster\"\n\tDebugKeyGeneratedFileFilter = \"generated_file_filter\" // Debugs a filter excluding autogenerated source code.\n\tDebugKeyInvalidIssue        = \"invalid_issue\"\n\tDebugKeyMaxFromLinter       = \"max_from_linter\"\n\tDebugKeyMaxSameIssues       = \"max_same_issues\"\n\tDebugKeyNolintFilter        = \"nolint_filter\" // Debugs a filter excluding issues by `//nolint` comments.\n\tDebugKeyPathAbsoluter       = \"path_absoluter\"\n\tDebugKeyPathPrettifier      = \"path_prettifier\"\n\tDebugKeyPathRelativity      = \"path_relativity\"\n\tDebugKeySeverityRules       = \"severity_rules\"\n\tDebugKeySourceCode          = \"source_code\"\n)\n\n// Analysis.\nconst (\n\tDebugKeyGoAnalysis = \"goanalysis\"\n\n\tDebugKeyGoAnalysisAnalyze     = DebugKeyGoAnalysis + \"/analyze\"\n\tDebugKeyGoAnalysisIssuesCache = DebugKeyGoAnalysis + \"/issues/cache\"\n\tDebugKeyGoAnalysisMemory      = DebugKeyGoAnalysis + \"/memory\"\n\n\tDebugKeyGoAnalysisFacts        = DebugKeyGoAnalysis + \"/facts\"\n\tDebugKeyGoAnalysisFactsCache   = DebugKeyGoAnalysisFacts + \"/cache\"\n\tDebugKeyGoAnalysisFactsExport  = DebugKeyGoAnalysisFacts + \"/export\"\n\tDebugKeyGoAnalysisFactsInherit = DebugKeyGoAnalysisFacts + \"/inherit\"\n)\n\n// Linters and Formatters.\nconst (\n\tDebugKeyFormatter        = \"formatter\"         // Display logs from the shared logger for formatters.\n\tDebugKeyFormattersOutput = \"formatters_output\" // Display logs from formatters themselves.\n\tDebugKeyLinter           = \"linter\"            // Display logs from the shared logger for linters.\n\tDebugKeyLintersOutput    = \"linters_output\"    // Display logs from linters themselves.\n\n\tDebugKeyForbidigo   = \"forbidigo\"   // Debugs `forbidigo` linter.\n\tDebugKeyGoCritic    = \"gocritic\"    // Debugs `gocritic` linter.\n\tDebugKeyGovet       = \"govet\"       // Debugs `govet` linter.\n\tDebugKeyRevive      = \"revive\"      // Debugs `revive` linter.\n\tDebugKeyStaticcheck = \"staticcheck\" // Debugs `staticcheck` linter.\n)\n\nfunc getEnabledDebugs() map[string]bool {\n\tret := map[string]bool{}\n\tdebugVar := os.Getenv(envDebug)\n\tif debugVar == \"\" {\n\t\treturn ret\n\t}\n\n\tfor tag := range strings.SplitSeq(debugVar, \",\") {\n\t\tret[tag] = true\n\t}\n\n\treturn ret\n}\n\nvar enabledDebugs = getEnabledDebugs()\n\ntype DebugFunc func(format string, args ...any)\n\nfunc nopDebugf(_ string, _ ...any) {}\n\nfunc Debug(tag string) DebugFunc {\n\tif !enabledDebugs[tag] {\n\t\treturn nopDebugf\n\t}\n\n\tlogger := NewStderrLog(tag)\n\tlogger.SetLevel(LogLevelDebug)\n\n\treturn func(format string, args ...any) {\n\t\tlogger.Debugf(format, args...)\n\t}\n}\n\nfunc HaveDebugTag(tag string) bool {\n\treturn enabledDebugs[tag]\n}\n\nvar verbose bool\n\nfunc SetupVerboseLog(log Log, isVerbose bool) {\n\tif isVerbose {\n\t\tverbose = isVerbose\n\t\tlog.SetLevel(LogLevelInfo)\n\t}\n}\n\nfunc IsVerbose() bool {\n\treturn verbose\n}\n"
  },
  {
    "path": "pkg/logutils/mock.go",
    "content": "package logutils\n\nimport (\n\t\"github.com/stretchr/testify/mock\"\n)\n\ntype MockLog struct {\n\tmock.Mock\n}\n\nfunc NewMockLog() *MockLog {\n\treturn &MockLog{}\n}\n\nfunc (m *MockLog) Fatalf(format string, args ...any) {\n\tm.Called(append([]any{format}, args...)...)\n}\n\nfunc (m *MockLog) Panicf(format string, args ...any) {\n\tm.Called(append([]any{format}, args...)...)\n}\n\nfunc (m *MockLog) Errorf(format string, args ...any) {\n\tm.Called(append([]any{format}, args...)...)\n}\n\nfunc (m *MockLog) Warnf(format string, args ...any) {\n\tm.Called(append([]any{format}, args...)...)\n}\n\nfunc (m *MockLog) Infof(format string, args ...any) {\n\tm.Called(append([]any{format}, args...)...)\n}\n\nfunc (m *MockLog) Child(name string) Log {\n\tm.Called(name)\n\treturn m\n}\n\nfunc (m *MockLog) SetLevel(level LogLevel) {\n\tm.Called(level)\n}\n\nfunc (m *MockLog) OnFatalf(format string, args ...any) *MockLog {\n\targuments := append([]any{format}, args...)\n\n\tm.On(\"Fatalf\", arguments...)\n\n\treturn m\n}\n\nfunc (m *MockLog) OnPanicf(format string, args ...any) *MockLog {\n\targuments := append([]any{format}, args...)\n\n\tm.On(\"Panicf\", arguments...)\n\n\treturn m\n}\n\nfunc (m *MockLog) OnErrorf(format string, args ...any) *MockLog {\n\targuments := append([]any{format}, args...)\n\n\tm.On(\"Errorf\", arguments...)\n\n\treturn m\n}\n\nfunc (m *MockLog) OnWarnf(format string, args ...any) *MockLog {\n\targuments := append([]any{format}, args...)\n\n\tm.On(\"Warnf\", arguments...)\n\n\treturn m\n}\n\nfunc (m *MockLog) OnInfof(format string, args ...any) *MockLog {\n\targuments := append([]any{format}, args...)\n\n\tm.On(\"Infof\", arguments...)\n\n\treturn m\n}\n"
  },
  {
    "path": "pkg/logutils/out.go",
    "content": "package logutils\n\nimport (\n\t\"github.com/fatih/color\"\n\tcolorable \"github.com/mattn/go-colorable\"\n)\n\nvar (\n\tStdOut = color.Output // https://github.com/golangci/golangci-lint/issues/14\n\tStdErr = colorable.NewColorableStderr()\n)\n"
  },
  {
    "path": "pkg/logutils/stderr_log.go",
    "content": "package logutils\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/sirupsen/logrus\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n)\n\nconst (\n\t// envLogLevel values: \"error\", \"err\", \"warning\", \"warn\",\"info\"\n\tenvLogLevel = \"LOG_LEVEL\"\n\t// envLogTimestamp value: \"1\"\n\tenvLogTimestamp = \"LOG_TIMESTAMP\"\n)\n\nvar _ Log = NewStderrLog(DebugKeyEmpty)\n\ntype StderrLog struct {\n\tname   string\n\tlogger *logrus.Logger\n\tlevel  LogLevel\n}\n\nfunc NewStderrLog(name string) *StderrLog {\n\tsl := &StderrLog{\n\t\tname:   name,\n\t\tlogger: logrus.New(),\n\t\tlevel:  LogLevelWarn,\n\t}\n\n\tswitch os.Getenv(envLogLevel) {\n\tcase \"error\", \"err\":\n\t\tsl.logger.SetLevel(logrus.ErrorLevel)\n\tcase \"warning\", \"warn\":\n\t\tsl.logger.SetLevel(logrus.WarnLevel)\n\tcase \"info\":\n\t\tsl.logger.SetLevel(logrus.InfoLevel)\n\tdefault:\n\t\tsl.logger.SetLevel(logrus.DebugLevel)\n\t}\n\n\tsl.logger.Out = StdErr\n\tsl.logger.Formatter = logFormatter\n\n\treturn sl\n}\n\nfunc (sl StderrLog) prefix() string {\n\tprefix := \"\"\n\tif sl.name != \"\" {\n\t\tprefix = fmt.Sprintf(\"[%s] \", sl.name)\n\t}\n\n\treturn prefix\n}\n\nfunc (sl StderrLog) Fatalf(format string, args ...any) {\n\tsl.logger.Errorf(\"%s%s\", sl.prefix(), fmt.Sprintf(format, args...))\n\tos.Exit(exitcodes.Failure)\n}\n\nfunc (sl StderrLog) Panicf(format string, args ...any) {\n\tv := fmt.Sprintf(\"%s%s\", sl.prefix(), fmt.Sprintf(format, args...))\n\tpanic(v)\n}\n\nfunc (sl StderrLog) Errorf(format string, args ...any) {\n\tif sl.level > LogLevelError {\n\t\treturn\n\t}\n\n\tsl.logger.Errorf(\"%s%s\", sl.prefix(), fmt.Sprintf(format, args...))\n\t// don't call exitIfTest() because the idea is to\n\t// crash on hidden errors (warnings); but Errorf MUST NOT be\n\t// called on hidden errors, see log levels comments.\n}\n\nfunc (sl StderrLog) Warnf(format string, args ...any) {\n\tif sl.level > LogLevelWarn {\n\t\treturn\n\t}\n\n\tsl.logger.Warnf(\"%s%s\", sl.prefix(), fmt.Sprintf(format, args...))\n}\n\nfunc (sl StderrLog) Infof(format string, args ...any) {\n\tif sl.level > LogLevelInfo {\n\t\treturn\n\t}\n\n\tsl.logger.Infof(\"%s%s\", sl.prefix(), fmt.Sprintf(format, args...))\n}\n\nfunc (sl StderrLog) Debugf(format string, args ...any) {\n\tif sl.level > LogLevelDebug {\n\t\treturn\n\t}\n\n\tsl.logger.Debugf(\"%s%s\", sl.prefix(), fmt.Sprintf(format, args...))\n}\n\nfunc (sl StderrLog) Child(name string) Log {\n\tprefix := \"\"\n\tif sl.name != \"\" {\n\t\tprefix = sl.name + \"/\"\n\t}\n\n\tchild := sl\n\tchild.name = prefix + name\n\n\treturn &child\n}\n\nfunc (sl *StderrLog) SetLevel(level LogLevel) {\n\tsl.level = level\n}\n\nvar logFormatter = newLogFormatter()\n\nfunc DisableColors(disable bool) {\n\tlogFormatter.DisableColors = disable\n}\n\nfunc newLogFormatter() *logrus.TextFormatter {\n\tformatter := &logrus.TextFormatter{\n\t\tDisableTimestamp:          true, // `INFO[0007] msg` -> `INFO msg`\n\t\tEnvironmentOverrideColors: true,\n\t}\n\n\tif os.Getenv(envLogTimestamp) == \"1\" {\n\t\tformatter.DisableTimestamp = false\n\t\tformatter.FullTimestamp = true\n\t\tformatter.TimestampFormat = time.StampMilli\n\t}\n\n\treturn formatter\n}\n"
  },
  {
    "path": "pkg/printers/checkstyle.go",
    "content": "package printers\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"maps\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/go-xmlfmt/xmlfmt\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst defaultCheckstyleSeverity = \"error\"\n\n// Checkstyle prints issues in the Checkstyle format.\n// https://checkstyle.org/config.html\ntype Checkstyle struct {\n\tlog       logutils.Log\n\tw         io.Writer\n\tsanitizer severitySanitizer\n}\n\nfunc NewCheckstyle(log logutils.Log, w io.Writer) *Checkstyle {\n\treturn &Checkstyle{\n\t\tlog: log.Child(logutils.DebugKeyCheckstylePrinter),\n\t\tw:   w,\n\t\tsanitizer: severitySanitizer{\n\t\t\t// https://checkstyle.org/config.html#Severity\n\t\t\t// https://checkstyle.org/property_types.html#SeverityLevel\n\t\t\tallowedSeverities: []string{\"ignore\", \"info\", \"warning\", defaultCheckstyleSeverity},\n\t\t\tdefaultSeverity:   defaultCheckstyleSeverity,\n\t\t},\n\t}\n}\n\nfunc (p *Checkstyle) Print(issues []*result.Issue) error {\n\tout := checkstyleOutput{\n\t\tVersion: \"5.0\",\n\t}\n\n\tfiles := map[string]*checkstyleFile{}\n\n\tfor _, issue := range issues {\n\t\tfile, ok := files[issue.FilePath()]\n\t\tif !ok {\n\t\t\tfile = &checkstyleFile{\n\t\t\t\tName: issue.FilePath(),\n\t\t\t}\n\n\t\t\tfiles[issue.FilePath()] = file\n\t\t}\n\n\t\tnewError := &checkstyleError{\n\t\t\tColumn:   issue.Column(),\n\t\t\tLine:     issue.Line(),\n\t\t\tMessage:  issue.Text,\n\t\t\tSource:   issue.FromLinter,\n\t\t\tSeverity: p.sanitizer.Sanitize(issue.Severity),\n\t\t}\n\n\t\tfile.Errors = append(file.Errors, newError)\n\t}\n\n\terr := p.sanitizer.Err()\n\tif err != nil {\n\t\tp.log.Infof(\"%v\", err)\n\t}\n\n\tout.Files = slices.SortedFunc(maps.Values(files), func(a *checkstyleFile, b *checkstyleFile) int {\n\t\treturn strings.Compare(a.Name, b.Name)\n\t})\n\n\tdata, err := xml.Marshal(&out)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = fmt.Fprintf(p.w, \"%s%s\\n\", xml.Header, xmlfmt.FormatXML(string(data), \"\", \"  \"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype checkstyleOutput struct {\n\tXMLName xml.Name          `xml:\"checkstyle\"`\n\tVersion string            `xml:\"version,attr\"`\n\tFiles   []*checkstyleFile `xml:\"file\"`\n}\n\ntype checkstyleFile struct {\n\tName   string             `xml:\"name,attr\"`\n\tErrors []*checkstyleError `xml:\"error\"`\n}\n\ntype checkstyleError struct {\n\tColumn   int    `xml:\"column,attr\"`\n\tLine     int    `xml:\"line,attr\"`\n\tMessage  string `xml:\"message,attr\"`\n\tSeverity string `xml:\"severity,attr\"`\n\tSource   string `xml:\"source,attr\"`\n}\n"
  },
  {
    "path": "pkg/printers/checkstyle_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestCheckstyle_Print(t *testing.T) {\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"warning\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-c\",\n\t\t\tSeverity:   \"\",\n\t\t\tText:       \"without severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filec.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   10,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-d\",\n\t\t\tSeverity:   \"foo\",\n\t\t\tText:       \"unknown severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filed.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   11,\n\t\t\t},\n\t\t},\n\t}\n\n\tbuf := new(bytes.Buffer)\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\tlog.SetLevel(logutils.LogLevelDebug)\n\n\tprinter := NewCheckstyle(log, buf)\n\n\terr := printer.Print(issues)\n\trequire.NoError(t, err)\n\n\texpected := `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<checkstyle version=\"5.0\">\n  <file name=\"path/to/filea.go\">\n    <error column=\"4\" line=\"10\" message=\"some issue\" severity=\"warning\" source=\"linter-a\"></error>\n  </file>\n  <file name=\"path/to/fileb.go\">\n    <error column=\"9\" line=\"300\" message=\"another issue\" severity=\"error\" source=\"linter-b\"></error>\n  </file>\n  <file name=\"path/to/filec.go\">\n    <error column=\"10\" line=\"300\" message=\"without severity\" severity=\"error\" source=\"linter-c\"></error>\n  </file>\n  <file name=\"path/to/filed.go\">\n    <error column=\"11\" line=\"300\" message=\"unknown severity\" severity=\"error\" source=\"linter-d\"></error>\n  </file>\n</checkstyle>\n`\n\n\tassert.Equal(t, expected, strings.ReplaceAll(buf.String(), \"\\r\", \"\"))\n}\n"
  },
  {
    "path": "pkg/printers/codeclimate.go",
    "content": "package printers\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst defaultCodeClimateSeverity = \"critical\"\n\n// CodeClimate prints issues in the Code Climate format.\n// https://github.com/codeclimate/platform/blob/HEAD/spec/analyzers/SPEC.md\ntype CodeClimate struct {\n\tlog       logutils.Log\n\tw         io.Writer\n\tsanitizer severitySanitizer\n}\n\nfunc NewCodeClimate(log logutils.Log, w io.Writer) *CodeClimate {\n\treturn &CodeClimate{\n\t\tlog: log.Child(logutils.DebugKeyCodeClimatePrinter),\n\t\tw:   w,\n\t\tsanitizer: severitySanitizer{\n\t\t\t// https://github.com/codeclimate/platform/blob/HEAD/spec/analyzers/SPEC.md#data-types\n\t\t\tallowedSeverities: []string{\"info\", \"minor\", \"major\", defaultCodeClimateSeverity, \"blocker\"},\n\t\t\tdefaultSeverity:   defaultCodeClimateSeverity,\n\t\t},\n\t}\n}\n\nfunc (p *CodeClimate) Print(issues []*result.Issue) error {\n\tccIssues := make([]codeClimateIssue, 0, len(issues))\n\n\tfor _, issue := range issues {\n\t\tccIssue := codeClimateIssue{\n\t\t\tDescription: issue.Description(),\n\t\t\tCheckName:   issue.FromLinter,\n\t\t\tSeverity:    p.sanitizer.Sanitize(issue.Severity),\n\t\t\tFingerprint: issue.Fingerprint(),\n\t\t}\n\n\t\tccIssue.Location.Path = issue.Pos.Filename\n\t\tccIssue.Location.Lines.Begin = issue.Pos.Line\n\n\t\tccIssues = append(ccIssues, ccIssue)\n\t}\n\n\terr := p.sanitizer.Err()\n\tif err != nil {\n\t\tp.log.Infof(\"%v\", err)\n\t}\n\n\treturn json.NewEncoder(p.w).Encode(ccIssues)\n}\n\n// codeClimateIssue is a subset of the Code Climate spec.\n// https://github.com/codeclimate/platform/blob/HEAD/spec/analyzers/SPEC.md#data-types\n// It is just enough to support GitLab CI Code Quality.\n// https://docs.gitlab.com/ee/ci/testing/code_quality.html#code-quality-report-format\ntype codeClimateIssue struct {\n\tDescription string `json:\"description\"`\n\tCheckName   string `json:\"check_name\"`\n\tSeverity    string `json:\"severity,omitempty\"`\n\tFingerprint string `json:\"fingerprint\"`\n\tLocation    struct {\n\t\tPath  string `json:\"path\"`\n\t\tLines struct {\n\t\t\tBegin int `json:\"begin\"`\n\t\t} `json:\"lines\"`\n\t} `json:\"location\"`\n}\n"
  },
  {
    "path": "pkg/printers/codeclimate_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestCodeClimate_Print(t *testing.T) {\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"minor\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"major\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-c\",\n\t\t\tSeverity:   \"\",\n\t\t\tText:       \"without severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filec.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   10,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-d\",\n\t\t\tSeverity:   \"foo\",\n\t\t\tText:       \"unknown severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filed.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   11,\n\t\t\t},\n\t\t},\n\t}\n\n\tbuf := new(bytes.Buffer)\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\tlog.SetLevel(logutils.LogLevelDebug)\n\n\tprinter := NewCodeClimate(log, buf)\n\n\terr := printer.Print(issues)\n\trequire.NoError(t, err)\n\n\texpected := `[{\"description\":\"linter-a: some issue\",\"check_name\":\"linter-a\",\"severity\":\"minor\",\"fingerprint\":\"BA73C5DF4A6FD8462FFF1D3140235777\",\"location\":{\"path\":\"path/to/filea.go\",\"lines\":{\"begin\":10}}},{\"description\":\"linter-b: another issue\",\"check_name\":\"linter-b\",\"severity\":\"major\",\"fingerprint\":\"0777B4FE60242BD8B2E9B7E92C4B9521\",\"location\":{\"path\":\"path/to/fileb.go\",\"lines\":{\"begin\":300}}},{\"description\":\"linter-c: without severity\",\"check_name\":\"linter-c\",\"severity\":\"critical\",\"fingerprint\":\"84F89700554F16CCEB6C0BB481B44AD2\",\"location\":{\"path\":\"path/to/filec.go\",\"lines\":{\"begin\":300}}},{\"description\":\"linter-d: unknown severity\",\"check_name\":\"linter-d\",\"severity\":\"critical\",\"fingerprint\":\"340BB02E7B583B9727D73765CB64F56F\",\"location\":{\"path\":\"path/to/filed.go\",\"lines\":{\"begin\":300}}}]\n`\n\n\tassert.Equal(t, expected, buf.String())\n}\n"
  },
  {
    "path": "pkg/printers/html.go",
    "content": "package printers\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst templateContent = `<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>golangci-lint</title>\n    <link rel=\"shortcut icon\" type=\"image/png\" href=\"https://golangci-lint.run/favicon-32x32.png\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.2/css/bulma.min.css\"\n          integrity=\"sha512-byErQdWdTqREz6DLAA9pCnLbdoGGhXfU6gm1c8bkf7F51JVmUBlayGe2A31VpXWQP+eiJ3ilTAZHCR3vmMyybA==\"\n          crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/styles/default.min.css\"\n          integrity=\"sha512-kZqGbhf9JTB4bVJ0G8HCkqmaPcRgo88F0dneK30yku5Y/dep7CZfCnNml2Je/sY4lBoqoksXz4PtVXS4GHSUzQ==\"\n          crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/highlight.min.js\"\n            integrity=\"sha512-s+tOYYcC3Jybgr9mVsdAxsRYlGNq4mlAurOrfNuGMQ/SCofNPu92tjE7YRZCsdEtWL1yGkqk15fU/ark206YTg==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/languages/go.min.js\"\n            integrity=\"sha512-+UYV2NyyynWEQcZ4sMTKmeppyV331gqvMOGZ61/dqc89Tn1H40lF05ACd03RSD9EWwGutNwKj256mIR8waEJBQ==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js\"\n            integrity=\"sha512-qlzIeUtTg7eBpmEaS12NZgxz52YYZVF5myj89mjJEesBd/oE9UPsYOX2QAXzvOAZYEvQohKdcY8zKE02ifXDmA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\"\n            src=\"https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js\"\n            integrity=\"sha512-9jGNr5Piwe8nzLLYTk8QrEMPfjGU0px80GYzKZUxi7lmCfrBjtyCc1V5kkS5vxVwwIB7Qpzc7UxLiQxfAN30dw==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js\"\n            integrity=\"sha512-kp7YHLxuJDJcOzStgd6vtpxr4ZU9kjn77e6dBsivSz+pUuAuMlE2UTdKB7jjsWT84qbS8kdCWHPETnP/ctrFsA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n</head>\n<body>\n<section class=\"section\">\n    <div class=\"container\">\n        <div id=\"content\"></div>\n    </div>\n</section>\n<script>\n    const data = {{ . }};\n</script>\n<script type=\"text/babel\">\n  class Highlight extends React.Component {\n    componentDidMount() {\n      hljs.highlightElement(ReactDOM.findDOMNode(this));\n    }\n\n    render() {\n      return <pre className=\"go\"><code>{this.props.code}</code></pre>;\n    }\n  }\n\n  class Issue extends React.Component {\n    render() {\n      return (\n        <div className=\"issue box\">\n          <div>\n            <div className=\"columns\">\n              <div className=\"column is-four-fifths\">\n                <h5 className=\"title is-5 has-text-danger-dark\">{this.props.data.Title}</h5>\n              </div>\n              <div className=\"column is-one-fifth\">\n                <h6 className=\"title is-6\">{this.props.data.Linter}</h6>\n              </div>\n            </div>\n            <strong>{this.props.data.Pos}</strong>\n          </div>\n          <div className=\"highlight\">\n            <Highlight code={this.props.data.Code}/>\n          </div>\n        </div>\n      );\n    }\n  }\n\n  class Issues extends React.Component {\n    render() {\n      if (!this.props.data.Issues || this.props.data.Issues.length === 0) {\n        return (\n          <div>\n            <div className=\"notification\">\n              No issues found!\n            </div>\n          </div>\n        );\n      }\n\n      return (\n        <div className=\"issues\">\n          {this.props.data.Issues.map(issue => (<Issue data={issue}/>))}\n        </div>\n      );\n    }\n  }\n\n  ReactDOM.render(\n    <div className=\"content\">\n      <div className=\"columns is-centered\">\n        <div className=\"column is-three-quarters\">\n          <Issues data={data}/>\n        </div>\n      </div>\n    </div>,\n    document.getElementById(\"content\")\n  );\n</script>\n</body>\n</html>`\n\ntype htmlIssue struct {\n\tTitle  string\n\tPos    string\n\tLinter string\n\tCode   string\n}\n\n// HTML prints issues in an HTML page.\n// It uses the Cloudflare CDN (cdnjs) and React.\ntype HTML struct {\n\tw io.Writer\n}\n\nfunc NewHTML(w io.Writer) *HTML {\n\treturn &HTML{w: w}\n}\n\nfunc (p HTML) Print(issues []*result.Issue) error {\n\tvar htmlIssues []htmlIssue\n\n\tfor _, issue := range issues {\n\t\tpos := fmt.Sprintf(\"%s:%d\", issue.FilePath(), issue.Line())\n\t\tif issue.Pos.Column != 0 {\n\t\t\tpos += fmt.Sprintf(\":%d\", issue.Pos.Column)\n\t\t}\n\n\t\thtmlIssues = append(htmlIssues, htmlIssue{\n\t\t\tTitle:  strings.TrimSpace(issue.Text),\n\t\t\tPos:    pos,\n\t\t\tLinter: issue.FromLinter,\n\t\t\tCode:   strings.Join(issue.SourceLines, \"\\n\"),\n\t\t})\n\t}\n\n\tt, err := template.New(\"golangci-lint\").Parse(templateContent)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn t.Execute(p.w, struct{ Issues []htmlIssue }{Issues: htmlIssues})\n}\n"
  },
  {
    "path": "pkg/printers/html_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst expectedHTML = `<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>golangci-lint</title>\n    <link rel=\"shortcut icon\" type=\"image/png\" href=\"https://golangci-lint.run/favicon-32x32.png\">\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.2/css/bulma.min.css\"\n          integrity=\"sha512-byErQdWdTqREz6DLAA9pCnLbdoGGhXfU6gm1c8bkf7F51JVmUBlayGe2A31VpXWQP+eiJ3ilTAZHCR3vmMyybA==\"\n          crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/styles/default.min.css\"\n          integrity=\"sha512-kZqGbhf9JTB4bVJ0G8HCkqmaPcRgo88F0dneK30yku5Y/dep7CZfCnNml2Je/sY4lBoqoksXz4PtVXS4GHSUzQ==\"\n          crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"/>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/highlight.min.js\"\n            integrity=\"sha512-s+tOYYcC3Jybgr9mVsdAxsRYlGNq4mlAurOrfNuGMQ/SCofNPu92tjE7YRZCsdEtWL1yGkqk15fU/ark206YTg==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/languages/go.min.js\"\n            integrity=\"sha512-+UYV2NyyynWEQcZ4sMTKmeppyV331gqvMOGZ61/dqc89Tn1H40lF05ACd03RSD9EWwGutNwKj256mIR8waEJBQ==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js\"\n            integrity=\"sha512-qlzIeUtTg7eBpmEaS12NZgxz52YYZVF5myj89mjJEesBd/oE9UPsYOX2QAXzvOAZYEvQohKdcY8zKE02ifXDmA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\"\n            src=\"https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js\"\n            integrity=\"sha512-9jGNr5Piwe8nzLLYTk8QrEMPfjGU0px80GYzKZUxi7lmCfrBjtyCc1V5kkS5vxVwwIB7Qpzc7UxLiQxfAN30dw==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n    <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js\"\n            integrity=\"sha512-kp7YHLxuJDJcOzStgd6vtpxr4ZU9kjn77e6dBsivSz+pUuAuMlE2UTdKB7jjsWT84qbS8kdCWHPETnP/ctrFsA==\"\n            crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n</head>\n<body>\n<section class=\"section\">\n    <div class=\"container\">\n        <div id=\"content\"></div>\n    </div>\n</section>\n<script>\n    const data = {\"Issues\":[{\"Title\":\"some issue\",\"Pos\":\"path/to/filea.go:10:4\",\"Linter\":\"linter-a\",\"Code\":\"\"},{\"Title\":\"another issue\",\"Pos\":\"path/to/fileb.go:300:9\",\"Linter\":\"linter-b\",\"Code\":\"func foo() {\\n\\tfmt.Println(\\\"bar\\\")\\n}\"}]};\n</script>\n<script type=\"text/babel\">\n  class Highlight extends React.Component {\n    componentDidMount() {\n      hljs.highlightElement(ReactDOM.findDOMNode(this));\n    }\n\n    render() {\n      return <pre className=\"go\"><code>{this.props.code}</code></pre>;\n    }\n  }\n\n  class Issue extends React.Component {\n    render() {\n      return (\n        <div className=\"issue box\">\n          <div>\n            <div className=\"columns\">\n              <div className=\"column is-four-fifths\">\n                <h5 className=\"title is-5 has-text-danger-dark\">{this.props.data.Title}</h5>\n              </div>\n              <div className=\"column is-one-fifth\">\n                <h6 className=\"title is-6\">{this.props.data.Linter}</h6>\n              </div>\n            </div>\n            <strong>{this.props.data.Pos}</strong>\n          </div>\n          <div className=\"highlight\">\n            <Highlight code={this.props.data.Code}/>\n          </div>\n        </div>\n      );\n    }\n  }\n\n  class Issues extends React.Component {\n    render() {\n      if (!this.props.data.Issues || this.props.data.Issues.length === 0) {\n        return (\n          <div>\n            <div className=\"notification\">\n              No issues found!\n            </div>\n          </div>\n        );\n      }\n\n      return (\n        <div className=\"issues\">\n          {this.props.data.Issues.map(issue => (<Issue data={issue}/>))}\n        </div>\n      );\n    }\n  }\n\n  ReactDOM.render(\n    <div className=\"content\">\n      <div className=\"columns is-centered\">\n        <div className=\"column is-three-quarters\">\n          <Issues data={data}/>\n        </div>\n      </div>\n    </div>,\n    document.getElementById(\"content\")\n  );\n</script>\n</body>\n</html>`\n\nfunc TestHTML_Print(t *testing.T) {\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"warning\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t}\n\n\tbuf := new(bytes.Buffer)\n\tprinter := NewHTML(buf)\n\n\terr := printer.Print(issues)\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, expectedHTML, buf.String())\n}\n"
  },
  {
    "path": "pkg/printers/json.go",
    "content": "package printers\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/report\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\n// JSON prints issues in a JSON representation.\ntype JSON struct {\n\trd *report.Data\n\tw  io.Writer\n}\n\nfunc NewJSON(w io.Writer, rd *report.Data) *JSON {\n\treturn &JSON{\n\t\trd: rd,\n\t\tw:  w,\n\t}\n}\n\ntype JSONResult struct {\n\tIssues []*result.Issue\n\tReport *report.Data\n}\n\nfunc (p JSON) Print(issues []*result.Issue) error {\n\tres := JSONResult{\n\t\tIssues: issues,\n\t\tReport: p.rd,\n\t}\n\tif res.Issues == nil {\n\t\tres.Issues = []*result.Issue{}\n\t}\n\n\treturn json.NewEncoder(p.w).Encode(res)\n}\n"
  },
  {
    "path": "pkg/printers/json_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestJSON_Print(t *testing.T) {\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"warning\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t}\n\n\tbuf := new(bytes.Buffer)\n\n\tprinter := NewJSON(buf, nil)\n\n\terr := printer.Print(issues)\n\trequire.NoError(t, err)\n\n\texpected := `{\"Issues\":[{\"FromLinter\":\"linter-a\",\"Text\":\"some issue\",\"Severity\":\"warning\",\"SourceLines\":null,\"Pos\":{\"Filename\":\"path/to/filea.go\",\"Offset\":2,\"Line\":10,\"Column\":4},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"linter-b\",\"Text\":\"another issue\",\"Severity\":\"error\",\"SourceLines\":[\"func foo() {\",\"\\tfmt.Println(\\\"bar\\\")\",\"}\"],\"Pos\":{\"Filename\":\"path/to/fileb.go\",\"Offset\":5,\"Line\":300,\"Column\":9},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"}],\"Report\":null}\n`\n\n\tassert.Equal(t, expected, buf.String())\n}\n"
  },
  {
    "path": "pkg/printers/junitxml.go",
    "content": "package printers\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"maps\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\n// JUnitXML prints issues in the JUnit XML format.\n// There is no official specification for the JUnit XML file format,\n// and various tools generate and support different flavors of this format.\n// https://github.com/testmoapp/junitxml\ntype JUnitXML struct {\n\textended bool\n\tw        io.Writer\n}\n\nfunc NewJUnitXML(w io.Writer, extended bool) *JUnitXML {\n\treturn &JUnitXML{\n\t\textended: extended,\n\t\tw:        w,\n\t}\n}\n\nfunc (p JUnitXML) Print(issues []*result.Issue) error {\n\tsuites := make(map[string]testSuiteXML) // use a map to group by file\n\n\tfor _, issue := range issues {\n\t\tsuiteName := issue.FilePath()\n\t\ttestSuite := suites[suiteName]\n\t\ttestSuite.Suite = issue.FilePath()\n\t\ttestSuite.Tests++\n\t\ttestSuite.Failures++\n\n\t\ttc := testCaseXML{\n\t\t\tName:      issue.FromLinter,\n\t\t\tClassName: issue.Pos.String(),\n\t\t\tFailure: failureXML{\n\t\t\t\tType:    issue.Severity,\n\t\t\t\tMessage: issue.Pos.String() + \": \" + issue.Text,\n\t\t\t\tContent: fmt.Sprintf(\"%s: %s\\nCategory: %s\\nFile: %s\\nLine: %d\\nDetails: %s\",\n\t\t\t\t\tissue.Severity, issue.Text, issue.FromLinter, issue.Pos.Filename, issue.Pos.Line, strings.Join(issue.SourceLines, \"\\n\")),\n\t\t\t},\n\t\t}\n\n\t\tif p.extended {\n\t\t\ttc.File = issue.Pos.Filename\n\t\t\ttc.Line = issue.Pos.Line\n\t\t}\n\n\t\ttestSuite.TestCases = append(testSuite.TestCases, tc)\n\t\tsuites[suiteName] = testSuite\n\t}\n\n\tvar res testSuitesXML\n\n\tres.TestSuites = slices.SortedFunc(maps.Values(suites), func(a testSuiteXML, b testSuiteXML) int {\n\t\treturn strings.Compare(a.Suite, b.Suite)\n\t})\n\n\tenc := xml.NewEncoder(p.w)\n\tenc.Indent(\"\", \"  \")\n\tif err := enc.Encode(res); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\ntype testSuitesXML struct {\n\tXMLName    xml.Name `xml:\"testsuites\"`\n\tTestSuites []testSuiteXML\n}\n\ntype testSuiteXML struct {\n\tXMLName   xml.Name      `xml:\"testsuite\"`\n\tSuite     string        `xml:\"name,attr\"`\n\tTests     int           `xml:\"tests,attr\"`\n\tErrors    int           `xml:\"errors,attr\"`\n\tFailures  int           `xml:\"failures,attr\"`\n\tTestCases []testCaseXML `xml:\"testcase\"`\n}\n\ntype testCaseXML struct {\n\tName      string     `xml:\"name,attr\"`\n\tClassName string     `xml:\"classname,attr\"`\n\tFailure   failureXML `xml:\"failure\"`\n\tFile      string     `xml:\"file,attr,omitempty\"`\n\tLine      int        `xml:\"line,attr,omitempty\"`\n}\n\ntype failureXML struct {\n\tMessage string `xml:\"message,attr\"`\n\tType    string `xml:\"type,attr\"`\n\tContent string `xml:\",cdata\"`\n}\n"
  },
  {
    "path": "pkg/printers/junitxml_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestJUnitXML_Print(t *testing.T) {\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"warning\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t}\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\textended bool\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"basic\",\n\t\t\texpected: `<testsuites>\n  <testsuite name=\"path/to/filea.go\" tests=\"1\" errors=\"0\" failures=\"1\">\n    <testcase name=\"linter-a\" classname=\"path/to/filea.go:10:4\">\n      <failure message=\"path/to/filea.go:10:4: some issue\" type=\"warning\"><![CDATA[warning: some issue\nCategory: linter-a\nFile: path/to/filea.go\nLine: 10\nDetails: ]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"path/to/fileb.go\" tests=\"1\" errors=\"0\" failures=\"1\">\n    <testcase name=\"linter-b\" classname=\"path/to/fileb.go:300:9\">\n      <failure message=\"path/to/fileb.go:300:9: another issue\" type=\"error\"><![CDATA[error: another issue\nCategory: linter-b\nFile: path/to/fileb.go\nLine: 300\nDetails: func foo() {\n\tfmt.Println(\"bar\")\n}]]></failure>\n    </testcase>\n  </testsuite>\n</testsuites>`,\n\t\t},\n\t\t{\n\t\t\tdesc:     \"extended/complete\",\n\t\t\textended: true,\n\t\t\texpected: `<testsuites>\n  <testsuite name=\"path/to/filea.go\" tests=\"1\" errors=\"0\" failures=\"1\">\n    <testcase name=\"linter-a\" classname=\"path/to/filea.go:10:4\" file=\"path/to/filea.go\" line=\"10\">\n      <failure message=\"path/to/filea.go:10:4: some issue\" type=\"warning\"><![CDATA[warning: some issue\nCategory: linter-a\nFile: path/to/filea.go\nLine: 10\nDetails: ]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"path/to/fileb.go\" tests=\"1\" errors=\"0\" failures=\"1\">\n    <testcase name=\"linter-b\" classname=\"path/to/fileb.go:300:9\" file=\"path/to/fileb.go\" line=\"300\">\n      <failure message=\"path/to/fileb.go:300:9: another issue\" type=\"error\"><![CDATA[error: another issue\nCategory: linter-b\nFile: path/to/fileb.go\nLine: 300\nDetails: func foo() {\n\tfmt.Println(\"bar\")\n}]]></failure>\n    </testcase>\n  </testsuite>\n</testsuites>`,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\tprinter := NewJUnitXML(buf, test.extended)\n\n\t\t\terr := printer.Print(issues)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, buf.String())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/printers/printer.go",
    "content": "package printers\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/report\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst (\n\toutputStdOut = \"stdout\"\n\toutputStdErr = \"stderr\"\n)\n\nconst defaultFileMode = 0o644\n\ntype issuePrinter interface {\n\tPrint(issues []*result.Issue) error\n}\n\n// Printer prints issues.\ntype Printer struct {\n\tcfg        *config.Formats\n\treportData *report.Data\n\tbasePath   string\n\n\tlog logutils.Log\n\n\tstdOut io.Writer\n\tstdErr io.Writer\n}\n\n// NewPrinter creates a new Printer.\nfunc NewPrinter(log logutils.Log, cfg *config.Formats, reportData *report.Data, basePath string) (*Printer, error) {\n\tif log == nil {\n\t\treturn nil, errors.New(\"missing log argument in constructor\")\n\t}\n\tif cfg == nil {\n\t\treturn nil, errors.New(\"missing config argument in constructor\")\n\t}\n\tif reportData == nil {\n\t\treturn nil, errors.New(\"missing reportData argument in constructor\")\n\t}\n\n\treturn &Printer{\n\t\tcfg:        cfg,\n\t\treportData: reportData,\n\t\tbasePath:   basePath,\n\t\tlog:        log,\n\t\tstdOut:     logutils.StdOut,\n\t\tstdErr:     logutils.StdErr,\n\t}, nil\n}\n\n// Print prints issues based on the formats defined.\n//\n//nolint:gocyclo,funlen // the complexity is related to the number of formats.\nfunc (c *Printer) Print(issues []*result.Issue) error {\n\tif c.cfg.IsEmpty() {\n\t\tc.cfg.Text.Path = outputStdOut\n\t}\n\n\tvar printers []issuePrinter\n\n\tif c.cfg.Text.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.Text.SimpleFormat)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.Text.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewText(c.log, w, &c.cfg.Text))\n\t}\n\n\tif c.cfg.JSON.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.JSON)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.JSON.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewJSON(w, c.reportData))\n\t}\n\n\tif c.cfg.Tab.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.Tab.SimpleFormat)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.Tab.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewTab(c.log, w, &c.cfg.Tab))\n\t}\n\n\tif c.cfg.HTML.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.HTML)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.HTML.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewHTML(w))\n\t}\n\n\tif c.cfg.Checkstyle.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.Checkstyle)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.Checkstyle.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewCheckstyle(c.log, w))\n\t}\n\n\tif c.cfg.CodeClimate.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.CodeClimate)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.CodeClimate.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewCodeClimate(c.log, w))\n\t}\n\n\tif c.cfg.JUnitXML.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.JUnitXML.SimpleFormat)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.JUnitXML.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewJUnitXML(w, c.cfg.JUnitXML.Extended))\n\t}\n\n\tif c.cfg.TeamCity.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.TeamCity)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.TeamCity.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewTeamCity(c.log, w))\n\t}\n\n\tif c.cfg.Sarif.Path != \"\" {\n\t\tw, closer, err := c.createWriter(&c.cfg.Sarif)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't create output for %s: %w\", c.cfg.Sarif.Path, err)\n\t\t}\n\n\t\tdefer closer()\n\n\t\tprinters = append(printers, NewSarif(c.log, w))\n\t}\n\n\tfor _, printer := range printers {\n\t\terr := printer.Print(issues)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *Printer) createWriter(cfg *config.SimpleFormat) (io.Writer, func(), error) {\n\tif cfg.Path == \"\" || cfg.Path == outputStdOut {\n\t\treturn c.stdOut, func() {}, nil\n\t}\n\n\tif cfg.Path == outputStdErr {\n\t\treturn c.stdErr, func() {}, nil\n\t}\n\n\tif !filepath.IsAbs(cfg.Path) {\n\t\tcfg.Path = filepath.Join(c.basePath, cfg.Path)\n\t}\n\n\terr := os.MkdirAll(filepath.Dir(cfg.Path), os.ModePerm)\n\tif err != nil {\n\t\treturn nil, func() {}, err\n\t}\n\n\tf, err := os.OpenFile(cfg.Path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, defaultFileMode)\n\tif err != nil {\n\t\treturn nil, func() {}, err\n\t}\n\n\treturn f, func() { _ = f.Close() }, nil\n}\n\ntype severitySanitizer struct {\n\tallowedSeverities []string\n\tdefaultSeverity   string\n\n\tunsupportedSeverities map[string]struct{}\n}\n\nfunc (s *severitySanitizer) Sanitize(severity string) string {\n\tif slices.Contains(s.allowedSeverities, severity) {\n\t\treturn severity\n\t}\n\n\tif s.unsupportedSeverities == nil {\n\t\ts.unsupportedSeverities = make(map[string]struct{})\n\t}\n\n\ts.unsupportedSeverities[severity] = struct{}{}\n\n\treturn s.defaultSeverity\n}\n\nfunc (s *severitySanitizer) Err() error {\n\tif len(s.unsupportedSeverities) == 0 {\n\t\treturn nil\n\t}\n\n\tvar names []string\n\tfor k := range s.unsupportedSeverities {\n\t\tnames = append(names, \"'\"+k+\"'\")\n\t}\n\n\treturn fmt.Errorf(\"severities (%v) are not inside supported values (%v), fallback to '%s'\",\n\t\tstrings.Join(names, \", \"), strings.Join(s.allowedSeverities, \", \"), s.defaultSeverity)\n}\n"
  },
  {
    "path": "pkg/printers/printer_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/report\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc unmarshalFile(t *testing.T, filename string, v any) {\n\tt.Helper()\n\n\tfile, err := os.ReadFile(filepath.Join(\"testdata\", filename))\n\trequire.NoError(t, err)\n\n\terr = json.Unmarshal(file, v)\n\trequire.NoError(t, err)\n}\n\nfunc TestPrinter_Print_stdout(t *testing.T) {\n\tlogger := logutils.NewStderrLog(\"skip\")\n\n\tvar issues []*result.Issue\n\tunmarshalFile(t, \"in-issues.json\", &issues)\n\n\tdata := &report.Data{}\n\tunmarshalFile(t, \"in-report-data.json\", data)\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tcfg      *config.Formats\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"stdout (implicit)\",\n\t\t\tcfg:      &config.Formats{},\n\t\t\texpected: \"golden-line-number.txt\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"stdout (explicit)\",\n\t\t\tcfg: &config.Formats{\n\t\t\t\tText: config.Text{\n\t\t\t\t\tSimpleFormat: config.SimpleFormat{\n\t\t\t\t\t\tPath: \"stdout\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"golden-line-number.txt\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tp, err := NewPrinter(logger, test.cfg, data, \"\")\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar stdOutBuffer bytes.Buffer\n\t\t\tp.stdOut = &stdOutBuffer\n\n\t\t\tvar stdErrBuffer bytes.Buffer\n\t\t\tp.stdErr = &stdErrBuffer\n\n\t\t\terr = p.Print(issues)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tgolden, err := os.ReadFile(filepath.Join(\"testdata\", test.expected))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, 0, stdErrBuffer.Len())\n\t\t\tassert.Equal(t, string(golden), stdOutBuffer.String())\n\t\t})\n\t}\n}\n\nfunc TestPrinter_Print_stderr(t *testing.T) {\n\tlogger := logutils.NewStderrLog(\"skip\")\n\n\tvar issues []*result.Issue\n\tunmarshalFile(t, \"in-issues.json\", &issues)\n\n\tdata := &report.Data{}\n\tunmarshalFile(t, \"in-report-data.json\", data)\n\n\tcfg := &config.Formats{\n\t\tText: config.Text{\n\t\t\tSimpleFormat: config.SimpleFormat{\n\t\t\t\tPath: \"stderr\",\n\t\t\t},\n\t\t},\n\t}\n\n\tp, err := NewPrinter(logger, cfg, data, \"\")\n\trequire.NoError(t, err)\n\n\tvar stdOutBuffer bytes.Buffer\n\tp.stdOut = &stdOutBuffer\n\n\tvar stdErrBuffer bytes.Buffer\n\tp.stdErr = &stdErrBuffer\n\n\terr = p.Print(issues)\n\trequire.NoError(t, err)\n\n\tgolden, err := os.ReadFile(filepath.Join(\"testdata\", \"golden-line-number.txt\"))\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, 0, stdOutBuffer.Len())\n\tassert.Equal(t, string(golden), stdErrBuffer.String())\n}\n\nfunc TestPrinter_Print_file(t *testing.T) {\n\tlogger := logutils.NewStderrLog(\"skip\")\n\n\tvar issues []*result.Issue\n\tunmarshalFile(t, \"in-issues.json\", &issues)\n\n\tdata := &report.Data{}\n\tunmarshalFile(t, \"in-report-data.json\", data)\n\n\toutputPath := filepath.Join(t.TempDir(), \"report.txt\")\n\n\tcfg := &config.Formats{\n\t\tText: config.Text{\n\t\t\tSimpleFormat: config.SimpleFormat{\n\t\t\t\tPath: outputPath,\n\t\t\t},\n\t\t},\n\t}\n\n\tp, err := NewPrinter(logger, cfg, data, \"\")\n\trequire.NoError(t, err)\n\n\tvar stdOutBuffer bytes.Buffer\n\tp.stdOut = &stdOutBuffer\n\n\tvar stdErrBuffer bytes.Buffer\n\tp.stdErr = &stdErrBuffer\n\n\terr = p.Print(issues)\n\trequire.NoError(t, err)\n\n\tgolden, err := os.ReadFile(filepath.Join(\"testdata\", \"golden-line-number.txt\"))\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, 0, stdOutBuffer.Len())\n\tassert.Equal(t, 0, stdErrBuffer.Len())\n\n\tactual, err := os.ReadFile(outputPath)\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, string(golden), string(actual))\n}\n\nfunc TestPrinter_Print_multiple(t *testing.T) {\n\tlogger := logutils.NewStderrLog(\"skip\")\n\n\tvar issues []*result.Issue\n\tunmarshalFile(t, \"in-issues.json\", &issues)\n\n\tdata := &report.Data{}\n\tunmarshalFile(t, \"in-report-data.json\", data)\n\n\toutputPath := filepath.Join(t.TempDir(), \"teamcity.txt\")\n\n\tcfg := &config.Formats{\n\t\tTeamCity: config.SimpleFormat{\n\t\t\tPath: outputPath,\n\t\t},\n\t\tJSON: config.SimpleFormat{\n\t\t\tPath: \"stdout\",\n\t\t},\n\t\tText: config.Text{\n\t\t\tSimpleFormat: config.SimpleFormat{\n\t\t\t\tPath: \"stderr\",\n\t\t\t},\n\t\t},\n\t}\n\n\tp, err := NewPrinter(logger, cfg, data, \"\")\n\trequire.NoError(t, err)\n\n\tvar stdOutBuffer bytes.Buffer\n\tp.stdOut = &stdOutBuffer\n\n\tvar stdErrBuffer bytes.Buffer\n\tp.stdErr = &stdErrBuffer\n\n\terr = p.Print(issues)\n\trequire.NoError(t, err)\n\n\tgoldenGitHub, err := os.ReadFile(filepath.Join(\"testdata\", \"golden-teamcity.txt\"))\n\trequire.NoError(t, err)\n\n\tactual, err := os.ReadFile(outputPath)\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, string(goldenGitHub), string(actual))\n\n\tgoldenLineNumber, err := os.ReadFile(filepath.Join(\"testdata\", \"golden-line-number.txt\"))\n\trequire.NoError(t, err)\n\n\tassert.Equal(t, string(goldenLineNumber), stdErrBuffer.String())\n\n\tgoldenJSON, err := os.ReadFile(filepath.Join(\"testdata\", \"golden-json.json\"))\n\trequire.NoError(t, err)\n\n\tassert.JSONEq(t, string(goldenJSON), stdOutBuffer.String())\n}\n"
  },
  {
    "path": "pkg/printers/sarif.go",
    "content": "package printers\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst (\n\tsarifVersion   = \"2.1.0\"\n\tsarifSchemaURI = \"https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.6.json\"\n)\n\nconst defaultSarifSeverity = \"error\"\n\n// Sarif prints issues in the SARIF format.\n// https://sarifweb.azurewebsites.net/\n// https://docs.oasis-open.org/sarif/sarif/v2.1.0/\ntype Sarif struct {\n\tlog       logutils.Log\n\tw         io.Writer\n\tsanitizer severitySanitizer\n}\n\nfunc NewSarif(log logutils.Log, w io.Writer) *Sarif {\n\treturn &Sarif{\n\t\tlog: log.Child(logutils.DebugKeySarifPrinter),\n\t\tw:   w,\n\t\tsanitizer: severitySanitizer{\n\t\t\t// https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html#_Toc141790898\n\t\t\tallowedSeverities: []string{\"none\", \"note\", \"warning\", defaultSarifSeverity},\n\t\t\tdefaultSeverity:   defaultSarifSeverity,\n\t\t},\n\t}\n}\n\nfunc (p *Sarif) Print(issues []*result.Issue) error {\n\trun := sarifRun{}\n\trun.Tool.Driver.Name = \"golangci-lint\"\n\trun.Results = make([]sarifResult, 0)\n\n\tfor _, issue := range issues {\n\t\tsr := sarifResult{\n\t\t\tRuleID:  issue.FromLinter,\n\t\t\tLevel:   p.sanitizer.Sanitize(issue.Severity),\n\t\t\tMessage: sarifMessage{Text: issue.Text},\n\t\t\tLocations: []sarifLocation{\n\t\t\t\t{\n\t\t\t\t\tPhysicalLocation: sarifPhysicalLocation{\n\t\t\t\t\t\tArtifactLocation: sarifArtifactLocation{URI: issue.FilePath()},\n\t\t\t\t\t\tRegion: sarifRegion{\n\t\t\t\t\t\t\tStartLine: issue.Line(),\n\t\t\t\t\t\t\t// If startColumn is absent, it SHALL default to 1.\n\t\t\t\t\t\t\t// https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html#_Toc141790941\n\t\t\t\t\t\t\tStartColumn: max(1, issue.Column()),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\trun.Results = append(run.Results, sr)\n\t}\n\n\terr := p.sanitizer.Err()\n\tif err != nil {\n\t\tp.log.Infof(\"%v\", err)\n\t}\n\n\toutput := SarifOutput{\n\t\tVersion: sarifVersion,\n\t\tSchema:  sarifSchemaURI,\n\t\tRuns:    []sarifRun{run},\n\t}\n\n\treturn json.NewEncoder(p.w).Encode(output)\n}\n\ntype SarifOutput struct {\n\tVersion string     `json:\"version\"`\n\tSchema  string     `json:\"$schema\"`\n\tRuns    []sarifRun `json:\"runs\"`\n}\n\ntype sarifRun struct {\n\tTool    sarifTool     `json:\"tool\"`\n\tResults []sarifResult `json:\"results\"`\n}\n\ntype sarifTool struct {\n\tDriver struct {\n\t\tName string `json:\"name\"`\n\t} `json:\"driver\"`\n}\n\ntype sarifResult struct {\n\tRuleID    string          `json:\"ruleId\"`\n\tLevel     string          `json:\"level\"`\n\tMessage   sarifMessage    `json:\"message\"`\n\tLocations []sarifLocation `json:\"locations\"`\n}\n\ntype sarifMessage struct {\n\tText string `json:\"text\"`\n}\n\ntype sarifLocation struct {\n\tPhysicalLocation sarifPhysicalLocation `json:\"physicalLocation\"`\n}\n\ntype sarifPhysicalLocation struct {\n\tArtifactLocation sarifArtifactLocation `json:\"artifactLocation\"`\n\tRegion           sarifRegion           `json:\"region\"`\n}\n\ntype sarifArtifactLocation struct {\n\tURI   string `json:\"uri\"`\n\tIndex int    `json:\"index\"`\n}\n\ntype sarifRegion struct {\n\tStartLine   int `json:\"startLine\"`\n\tStartColumn int `json:\"startColumn\"`\n}\n"
  },
  {
    "path": "pkg/printers/sarif_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestSarif_Print(t *testing.T) {\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"warning\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-c\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"some issue without column\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filed.go\",\n\t\t\t\tOffset:   3,\n\t\t\t\tLine:     11,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-c\",\n\t\t\tSeverity:   \"\",\n\t\t\tText:       \"without severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filec.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   10,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-d\",\n\t\t\tSeverity:   \"foo\",\n\t\t\tText:       \"unknown severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filed.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   11,\n\t\t\t},\n\t\t},\n\t}\n\n\tbuf := new(bytes.Buffer)\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\tlog.SetLevel(logutils.LogLevelDebug)\n\n\tprinter := NewSarif(log, buf)\n\n\terr := printer.Print(issues)\n\trequire.NoError(t, err)\n\n\texpected := `{\"version\":\"2.1.0\",\"$schema\":\"https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.6.json\",\"runs\":[{\"tool\":{\"driver\":{\"name\":\"golangci-lint\"}},\"results\":[{\"ruleId\":\"linter-a\",\"level\":\"warning\",\"message\":{\"text\":\"some issue\"},\"locations\":[{\"physicalLocation\":{\"artifactLocation\":{\"uri\":\"path/to/filea.go\",\"index\":0},\"region\":{\"startLine\":10,\"startColumn\":4}}}]},{\"ruleId\":\"linter-b\",\"level\":\"error\",\"message\":{\"text\":\"another issue\"},\"locations\":[{\"physicalLocation\":{\"artifactLocation\":{\"uri\":\"path/to/fileb.go\",\"index\":0},\"region\":{\"startLine\":300,\"startColumn\":9}}}]},{\"ruleId\":\"linter-c\",\"level\":\"error\",\"message\":{\"text\":\"some issue without column\"},\"locations\":[{\"physicalLocation\":{\"artifactLocation\":{\"uri\":\"path/to/filed.go\",\"index\":0},\"region\":{\"startLine\":11,\"startColumn\":1}}}]},{\"ruleId\":\"linter-c\",\"level\":\"error\",\"message\":{\"text\":\"without severity\"},\"locations\":[{\"physicalLocation\":{\"artifactLocation\":{\"uri\":\"path/to/filec.go\",\"index\":0},\"region\":{\"startLine\":300,\"startColumn\":10}}}]},{\"ruleId\":\"linter-d\",\"level\":\"error\",\"message\":{\"text\":\"unknown severity\"},\"locations\":[{\"physicalLocation\":{\"artifactLocation\":{\"uri\":\"path/to/filed.go\",\"index\":0},\"region\":{\"startLine\":300,\"startColumn\":11}}}]}]}]}\n`\n\n\tassert.Equal(t, expected, buf.String())\n}\n\nfunc TestSarif_Print_empty(t *testing.T) {\n\tbuf := new(bytes.Buffer)\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\tlog.SetLevel(logutils.LogLevelDebug)\n\n\tprinter := NewSarif(log, buf)\n\n\terr := printer.Print(nil)\n\trequire.NoError(t, err)\n\n\texpected := `{\"version\":\"2.1.0\",\"$schema\":\"https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.6.json\",\"runs\":[{\"tool\":{\"driver\":{\"name\":\"golangci-lint\"}},\"results\":[]}]}\n`\n\n\tassert.Equal(t, expected, buf.String())\n}\n"
  },
  {
    "path": "pkg/printers/tab.go",
    "content": "package printers\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"text/tabwriter\"\n\n\t\"github.com/fatih/color\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\n// Tab prints issues using tabulation as a field separator.\ntype Tab struct {\n\tprintLinterName bool\n\tcolors          bool\n\n\tlog logutils.Log\n\tw   io.Writer\n}\n\nfunc NewTab(log logutils.Log, w io.Writer, cfg *config.Tab) *Tab {\n\treturn &Tab{\n\t\tprintLinterName: cfg.PrintLinterName,\n\t\tcolors:          cfg.Colors,\n\t\tlog:             log.Child(logutils.DebugKeyTabPrinter),\n\t\tw:               w,\n\t}\n}\n\nfunc (p *Tab) SprintfColored(ca color.Attribute, format string, args ...any) string {\n\tc := color.New(ca)\n\n\tif !p.colors {\n\t\tc.DisableColor()\n\t}\n\n\treturn c.Sprintf(format, args...)\n}\n\nfunc (p *Tab) Print(issues []*result.Issue) error {\n\tw := tabwriter.NewWriter(p.w, 0, 0, 2, ' ', 0)\n\n\tfor _, issue := range issues {\n\t\tp.printIssue(issue, w)\n\t}\n\n\tif err := w.Flush(); err != nil {\n\t\tp.log.Warnf(\"Can't flush tab writer: %s\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (p *Tab) printIssue(issue *result.Issue, w io.Writer) {\n\ttext := p.SprintfColored(color.FgRed, \"%s\", issue.Text)\n\tif p.printLinterName {\n\t\ttext = fmt.Sprintf(\"%s\\t%s\", issue.FromLinter, text)\n\t}\n\n\tpos := p.SprintfColored(color.Bold, \"%s:%d\", issue.FilePath(), issue.Line())\n\tif issue.Pos.Column != 0 {\n\t\tpos += fmt.Sprintf(\":%d\", issue.Pos.Column)\n\t}\n\n\tfmt.Fprintf(w, \"%s\\t%s\\n\", pos, text)\n}\n"
  },
  {
    "path": "pkg/printers/tab_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestTab_Print(t *testing.T) {\n\t// force color globally\n\tbackup := color.NoColor\n\tt.Cleanup(func() {\n\t\tcolor.NoColor = backup\n\t})\n\tcolor.NoColor = false\n\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"warning\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t}\n\n\ttestCases := []struct {\n\t\tdesc            string\n\t\tprintLinterName bool\n\t\tuseColors       bool\n\t\texpected        string\n\t}{\n\t\t{\n\t\t\tdesc:            \"with linter name\",\n\t\t\tprintLinterName: true,\n\t\t\tuseColors:       false,\n\t\t\texpected: `path/to/filea.go:10:4   linter-a  some issue\npath/to/fileb.go:300:9  linter-b  another issue\n`,\n\t\t},\n\t\t{\n\t\t\tdesc:            \"disable all options\",\n\t\t\tprintLinterName: false,\n\t\t\tuseColors:       false,\n\t\t\texpected: `path/to/filea.go:10:4   some issue\npath/to/fileb.go:300:9  another issue\n`,\n\t\t},\n\t\t{\n\t\t\tdesc:            \"enable all options\",\n\t\t\tprintLinterName: true,\n\t\t\tuseColors:       true,\n\t\t\texpected:        \"\\x1b[1mpath/to/filea.go:10\\x1b[22m:4   linter-a  \\x1b[31msome issue\\x1b[0m\\n\\x1b[1mpath/to/fileb.go:300\\x1b[22m:9  linter-b  \\x1b[31manother issue\\x1b[0m\\n\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tbuf := new(bytes.Buffer)\n\n\t\t\tprinter := NewTab(logutils.NewStderrLog(logutils.DebugKeyEmpty), buf, &config.Tab{\n\t\t\t\tSimpleFormat:    config.SimpleFormat{},\n\t\t\t\tPrintLinterName: test.printLinterName,\n\t\t\t\tColors:          test.useColors,\n\t\t\t})\n\n\t\t\terr := printer.Print(issues)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, buf.String())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/printers/teamcity.go",
    "content": "package printers\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\n// Field limits.\nconst (\n\tsmallLimit = 255\n\tlargeLimit = 4000\n)\n\nconst defaultTeamCitySeverity = \"ERROR\"\n\n// TeamCity prints issues in the TeamCity format.\n// https://www.jetbrains.com/help/teamcity/service-messages.html\ntype TeamCity struct {\n\tlog       logutils.Log\n\tw         io.Writer\n\tescaper   *strings.Replacer\n\tsanitizer severitySanitizer\n}\n\n// NewTeamCity output format outputs issues according to TeamCity service message format.\nfunc NewTeamCity(log logutils.Log, w io.Writer) *TeamCity {\n\treturn &TeamCity{\n\t\tlog: log.Child(logutils.DebugKeyTeamCityPrinter),\n\t\tw:   w,\n\t\t// https://www.jetbrains.com/help/teamcity/service-messages.html#Escaped+Values\n\t\tescaper: strings.NewReplacer(\n\t\t\t\"'\", \"|'\",\n\t\t\t\"\\n\", \"|n\",\n\t\t\t\"\\r\", \"|r\",\n\t\t\t\"|\", \"||\",\n\t\t\t\"[\", \"|[\",\n\t\t\t\"]\", \"|]\",\n\t\t),\n\t\tsanitizer: severitySanitizer{\n\t\t\t// https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance\n\t\t\tallowedSeverities: []string{\"INFO\", defaultTeamCitySeverity, \"WARNING\", \"WEAK WARNING\"},\n\t\t\tdefaultSeverity:   defaultTeamCitySeverity,\n\t\t},\n\t}\n}\n\nfunc (p *TeamCity) Print(issues []*result.Issue) error {\n\tuniqLinters := map[string]struct{}{}\n\n\tfor _, issue := range issues {\n\t\t_, ok := uniqLinters[issue.FromLinter]\n\t\tif !ok {\n\t\t\tinspectionType := InspectionType{\n\t\t\t\tid:          issue.FromLinter,\n\t\t\t\tname:        issue.FromLinter,\n\t\t\t\tdescription: issue.FromLinter,\n\t\t\t\tcategory:    \"Golangci-lint reports\",\n\t\t\t}\n\n\t\t\t_, err := inspectionType.Print(p.w, p.escaper)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tuniqLinters[issue.FromLinter] = struct{}{}\n\t\t}\n\n\t\tinstance := InspectionInstance{\n\t\t\ttypeID:   issue.FromLinter,\n\t\t\tmessage:  issue.Text,\n\t\t\tfile:     issue.FilePath(),\n\t\t\tline:     issue.Line(),\n\t\t\tseverity: p.sanitizer.Sanitize(strings.ToUpper(issue.Severity)),\n\t\t}\n\n\t\t_, err := instance.Print(p.w, p.escaper)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\terr := p.sanitizer.Err()\n\tif err != nil {\n\t\tp.log.Infof(\"%v\", err)\n\t}\n\n\treturn nil\n}\n\n// InspectionType is the unique description of the conducted inspection. Each specific warning or\n// an error in code (inspection instance) has an inspection type.\n// https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Type\ntype InspectionType struct {\n\tid          string // (mandatory) limited by 255 characters.\n\tname        string // (mandatory) limited by 255 characters.\n\tdescription string // (mandatory) limited by 255 characters.\n\tcategory    string // (mandatory) limited by 4000 characters.\n}\n\nfunc (i InspectionType) Print(w io.Writer, escaper *strings.Replacer) (int, error) {\n\treturn fmt.Fprintf(w, \"##teamcity[inspectionType id='%s' name='%s' description='%s' category='%s']\\n\",\n\t\tcutVal(i.id, smallLimit), cutVal(i.name, smallLimit), cutVal(escaper.Replace(i.description), largeLimit), cutVal(i.category, smallLimit))\n}\n\n// InspectionInstance reports a specific defect, warning, error message.\n// Includes location, description, and various optional and custom attributes.\n// https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance\ntype InspectionInstance struct {\n\ttypeID   string // (mandatory) limited by 255 characters.\n\tmessage  string // (optional)  limited by 4000 characters.\n\tfile     string // (mandatory) file path limited by 4000 characters.\n\tline     int    // (optional)  line of the file.\n\tseverity string // (optional) any linter severity.\n}\n\nfunc (i InspectionInstance) Print(w io.Writer, replacer *strings.Replacer) (int, error) {\n\treturn fmt.Fprintf(w, \"##teamcity[inspection typeId='%s' message='%s' file='%s' line='%d' SEVERITY='%s']\\n\",\n\t\tcutVal(i.typeID, smallLimit),\n\t\tcutVal(replacer.Replace(i.message), largeLimit),\n\t\tcutVal(i.file, largeLimit),\n\t\ti.line, i.severity)\n}\n\nfunc cutVal(s string, limit int) string {\n\trunes := []rune(s)\n\tif len(runes) > limit {\n\t\treturn string(runes[:limit])\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "pkg/printers/teamcity_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestTeamCity_Print(t *testing.T) {\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"WARNING\",\n\t\t\tText:       \"warning issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"error issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-c\",\n\t\t\tSeverity:   \"\",\n\t\t\tText:       \"without severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filec.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   10,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-d\",\n\t\t\tSeverity:   \"foo\",\n\t\t\tText:       \"unknown severity\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filed.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   11,\n\t\t\t},\n\t\t},\n\t}\n\n\tbuf := new(bytes.Buffer)\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\tlog.SetLevel(logutils.LogLevelDebug)\n\n\tprinter := NewTeamCity(log, buf)\n\n\terr := printer.Print(issues)\n\trequire.NoError(t, err)\n\n\texpected := `##teamcity[inspectionType id='linter-a' name='linter-a' description='linter-a' category='Golangci-lint reports']\n##teamcity[inspection typeId='linter-a' message='warning issue' file='path/to/filea.go' line='10' SEVERITY='WARNING']\n##teamcity[inspection typeId='linter-a' message='error issue' file='path/to/filea.go' line='10' SEVERITY='ERROR']\n##teamcity[inspectionType id='linter-c' name='linter-c' description='linter-c' category='Golangci-lint reports']\n##teamcity[inspection typeId='linter-c' message='without severity' file='path/to/filec.go' line='300' SEVERITY='ERROR']\n##teamcity[inspectionType id='linter-d' name='linter-d' description='linter-d' category='Golangci-lint reports']\n##teamcity[inspection typeId='linter-d' message='unknown severity' file='path/to/filed.go' line='300' SEVERITY='ERROR']\n`\n\n\tassert.Equal(t, expected, buf.String())\n}\n\nfunc TestTeamCity_cutVal(t *testing.T) {\n\ttests := []struct {\n\t\tinput    string\n\t\tmax      int\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tinput:    \"golangci-lint\",\n\t\t\tmax:      0,\n\t\t\texpected: \"\",\n\t\t},\n\t\t{\n\t\t\tinput:    \"golangci-lint\",\n\t\t\tmax:      8,\n\t\t\texpected: \"golangci\",\n\t\t},\n\t\t{\n\t\t\tinput:    \"golangci-lint\",\n\t\t\tmax:      13,\n\t\t\texpected: \"golangci-lint\",\n\t\t},\n\t\t{\n\t\t\tinput:    \"golangci-lint\",\n\t\t\tmax:      15,\n\t\t\texpected: \"golangci-lint\",\n\t\t},\n\t\t{\n\t\t\tinput:    \"こんにちは\",\n\t\t\tmax:      3,\n\t\t\texpected: \"こんに\",\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\trequire.Equal(t, tc.expected, cutVal(tc.input, tc.max))\n\t}\n}\n"
  },
  {
    "path": "pkg/printers/testdata/golden-json.json",
    "content": "{\"Issues\":[{\"FromLinter\":\"gochecknoinits\",\"Text\":\"don't use `init` function\",\"Severity\":\"\",\"SourceLines\":[\"func init() {\"],\"Pos\":{\"Filename\":\"pkg/experimental/myplugin/myplugin.go\",\"Offset\":162,\"Line\":13,\"Column\":1},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"gocritic\",\"Text\":\"hugeParam: settings is heavy (80 bytes); consider passing it by pointer\",\"Severity\":\"\",\"SourceLines\":[\"func (b *PluginBuilder) loadConfig(cfg *config.Config, name string, settings config.CustomLinterSettings) (*linter.Config, error) {\"],\"Pos\":{\"Filename\":\"pkg/lint/lintersdb/builder_plugin.go\",\"Offset\":1480,\"Line\":59,\"Column\":69},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"goimports\",\"Text\":\"File is not `goimports`-ed with -local github.com/golangci/golangci-lint\",\"Severity\":\"\",\"SourceLines\":[\"\"],\"Pos\":{\"Filename\":\"pkg/printers/printer_test.go\",\"Offset\":0,\"Line\":6,\"Column\":0},\"SuggestedFixes\":[{\"Message\":\"\",\"TextEdits\":[{\"Pos\":13,\"End\":32,\"NewText\":null}]}],\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 144 bytes could be of size 128 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type Issues struct {\"],\"Pos\":{\"Filename\":\"pkg/config/issues.go\",\"Offset\":3338,\"Line\":107,\"Column\":13},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 3144 bytes could be of size 3096 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type LintersSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":4576,\"Line\":200,\"Column\":22},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 72 bytes could be of size 64 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type ExhaustiveSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":10829,\"Line\":383,\"Column\":25},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 72 bytes could be of size 56 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type GoConstSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":14399,\"Line\":470,\"Column\":22},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 136 bytes could be of size 128 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type GoCriticSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":14934,\"Line\":482,\"Column\":23},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 64 bytes could be of size 56 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type GosmopolitanSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":18601,\"Line\":584,\"Column\":27},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 88 bytes could be of size 80 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type GovetSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":18867,\"Line\":591,\"Column\":20},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 40 bytes could be of size 32 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type NoLintLintSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":22337,\"Line\":710,\"Column\":25},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 112 bytes could be of size 104 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type ReviveSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":24019,\"Line\":762,\"Column\":21},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 32 bytes could be of size 24 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type SlogLintSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":24648,\"Line\":787,\"Column\":23},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 40 bytes could be of size 32 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type TagAlignSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":25936,\"Line\":817,\"Column\":23},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 80 bytes could be of size 72 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type VarnamelenSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":28758,\"Line\":902,\"Column\":25},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 112 bytes could be of size 96 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type WSLSettings struct {\"],\"Pos\":{\"Filename\":\"pkg/config/linters_settings.go\",\"Offset\":29898,\"Line\":928,\"Column\":18},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 168 bytes could be of size 160 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type Run struct {\"],\"Pos\":{\"Filename\":\"pkg/config/run.go\",\"Offset\":112,\"Line\":6,\"Column\":10},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 128 bytes could be of size 120 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type Config struct {\"],\"Pos\":{\"Filename\":\"pkg/lint/linter/config.go\",\"Offset\":1329,\"Line\":36,\"Column\":13},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 96 bytes could be of size 88 bytes\",\"Severity\":\"\",\"SourceLines\":[\"\\tfor _, tc := range []struct {\"],\"Pos\":{\"Filename\":\"pkg/golinters/govet_test.go\",\"Offset\":1804,\"Line\":70,\"Column\":23},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"maligned\",\"Text\":\"struct of size 64 bytes could be of size 56 bytes\",\"Severity\":\"\",\"SourceLines\":[\"type Diff struct {\"],\"Pos\":{\"Filename\":\"pkg/result/processors/diff.go\",\"Offset\":233,\"Line\":17,\"Column\":11},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"revive\",\"Text\":\"unused-parameter: parameter 'pass' seems to be unused, consider removing or renaming it as _\",\"Severity\":\"warning\",\"SourceLines\":[\"\\t\\t\\tRun: func(pass *analysis.Pass) (any, error) {\"],\"Pos\":{\"Filename\":\"pkg/experimental/myplugin/myplugin.go\",\"Offset\":921,\"Line\":49,\"Column\":14},\"LineRange\":{\"From\":49,\"To\":49},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"},{\"FromLinter\":\"unused\",\"Text\":\"const `defaultFileMode` is unused\",\"Severity\":\"\",\"SourceLines\":[\"const defaultFileMode = 0644\"],\"Pos\":{\"Filename\":\"pkg/commands/run.go\",\"Offset\":1209,\"Line\":47,\"Column\":7},\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"}],\"Report\":{\"Warnings\":[{\"Tag\":\"runner\",\"Text\":\"The linter 'maligned' is deprecated (since v1.38.0) due to: The repository of the linter has been archived by the owner. Replaced by govet 'fieldalignment'.\"}],\"Linters\":[{\"Name\":\"asasalint\"},{\"Name\":\"asciicheck\"},{\"Name\":\"bidichk\"},{\"Name\":\"bodyclose\",\"Enabled\":true},{\"Name\":\"containedctx\"},{\"Name\":\"contextcheck\"},{\"Name\":\"cyclop\"},{\"Name\":\"decorder\"},{\"Name\":\"deadcode\"},{\"Name\":\"depguard\",\"Enabled\":true},{\"Name\":\"dogsled\",\"Enabled\":true},{\"Name\":\"dupl\",\"Enabled\":true},{\"Name\":\"dupword\"},{\"Name\":\"durationcheck\"},{\"Name\":\"errcheck\",\"Enabled\":true},{\"Name\":\"errchkjson\"},{\"Name\":\"errname\"},{\"Name\":\"errorlint\",\"Enabled\":true},{\"Name\":\"execinquery\"},{\"Name\":\"exhaustive\"},{\"Name\":\"exhaustivestruct\"},{\"Name\":\"exhaustruct\"},{\"Name\":\"exportloopref\",\"Enabled\":true},{\"Name\":\"forbidigo\"},{\"Name\":\"forcetypeassert\"},{\"Name\":\"funlen\",\"Enabled\":true},{\"Name\":\"gci\"},{\"Name\":\"ginkgolinter\"},{\"Name\":\"gocheckcompilerdirectives\",\"Enabled\":true},{\"Name\":\"gochecknoglobals\"},{\"Name\":\"gochecknoinits\",\"Enabled\":true},{\"Name\":\"gochecksumtype\"},{\"Name\":\"gocognit\"},{\"Name\":\"goconst\",\"Enabled\":true},{\"Name\":\"gocritic\",\"Enabled\":true},{\"Name\":\"gocyclo\",\"Enabled\":true},{\"Name\":\"godot\"},{\"Name\":\"godox\"},{\"Name\":\"err113\"},{\"Name\":\"gofmt\",\"Enabled\":true},{\"Name\":\"gofumpt\"},{\"Name\":\"goheader\"},{\"Name\":\"goimports\",\"Enabled\":true},{\"Name\":\"golint\"},{\"Name\":\"mnd\",\"Enabled\":true},{\"Name\":\"gomoddirectives\"},{\"Name\":\"gomodguard\"},{\"Name\":\"goprintffuncname\",\"Enabled\":true},{\"Name\":\"gosec\",\"Enabled\":true},{\"Name\":\"gosimple\",\"Enabled\":true},{\"Name\":\"gosmopolitan\"},{\"Name\":\"govet\",\"Enabled\":true},{\"Name\":\"grouper\"},{\"Name\":\"ifshort\"},{\"Name\":\"importas\"},{\"Name\":\"inamedparam\"},{\"Name\":\"ineffassign\",\"Enabled\":true},{\"Name\":\"interfacebloat\"},{\"Name\":\"interfacer\"},{\"Name\":\"ireturn\"},{\"Name\":\"lll\",\"Enabled\":true},{\"Name\":\"loggercheck\"},{\"Name\":\"maintidx\"},{\"Name\":\"makezero\"},{\"Name\":\"maligned\",\"Enabled\":true},{\"Name\":\"mirror\"},{\"Name\":\"misspell\",\"Enabled\":true},{\"Name\":\"musttag\"},{\"Name\":\"nakedret\",\"Enabled\":true},{\"Name\":\"nestif\"},{\"Name\":\"nilerr\"},{\"Name\":\"nilnil\"},{\"Name\":\"nlreturn\"},{\"Name\":\"noctx\",\"Enabled\":true},{\"Name\":\"nonamedreturns\"},{\"Name\":\"nosnakecase\"},{\"Name\":\"nosprintfhostport\"},{\"Name\":\"paralleltest\"},{\"Name\":\"perfsprint\"},{\"Name\":\"prealloc\"},{\"Name\":\"predeclared\"},{\"Name\":\"promlinter\"},{\"Name\":\"protogetter\"},{\"Name\":\"reassign\"},{\"Name\":\"revive\",\"Enabled\":true},{\"Name\":\"rowserrcheck\"},{\"Name\":\"sloglint\"},{\"Name\":\"scopelint\"},{\"Name\":\"sqlclosecheck\"},{\"Name\":\"spancheck\"},{\"Name\":\"staticcheck\",\"Enabled\":true},{\"Name\":\"structcheck\"},{\"Name\":\"stylecheck\",\"Enabled\":true},{\"Name\":\"tagalign\"},{\"Name\":\"tagliatelle\"},{\"Name\":\"tenv\"},{\"Name\":\"testableexamples\"},{\"Name\":\"testifylint\"},{\"Name\":\"testpackage\"},{\"Name\":\"thelper\"},{\"Name\":\"tparallel\"},{\"Name\":\"typecheck\",\"Enabled\":true},{\"Name\":\"unconvert\",\"Enabled\":true},{\"Name\":\"unparam\",\"Enabled\":true},{\"Name\":\"unused\",\"Enabled\":true},{\"Name\":\"usestdlibvars\"},{\"Name\":\"varcheck\"},{\"Name\":\"varnamelen\"},{\"Name\":\"wastedassign\"},{\"Name\":\"whitespace\",\"Enabled\":true},{\"Name\":\"wrapcheck\"},{\"Name\":\"wsl\"},{\"Name\":\"zerologlint\"},{\"Name\":\"nolintlint\",\"Enabled\":true}]}}\n"
  },
  {
    "path": "pkg/printers/testdata/golden-line-number.txt",
    "content": "pkg/experimental/myplugin/myplugin.go:13:1: don't use `init` function\npkg/lint/lintersdb/builder_plugin.go:59:69: hugeParam: settings is heavy (80 bytes); consider passing it by pointer\npkg/printers/printer_test.go:6: File is not `goimports`-ed with -local github.com/golangci/golangci-lint\npkg/config/issues.go:107:13: struct of size 144 bytes could be of size 128 bytes\npkg/config/linters_settings.go:200:22: struct of size 3144 bytes could be of size 3096 bytes\npkg/config/linters_settings.go:383:25: struct of size 72 bytes could be of size 64 bytes\npkg/config/linters_settings.go:470:22: struct of size 72 bytes could be of size 56 bytes\npkg/config/linters_settings.go:482:23: struct of size 136 bytes could be of size 128 bytes\npkg/config/linters_settings.go:584:27: struct of size 64 bytes could be of size 56 bytes\npkg/config/linters_settings.go:591:20: struct of size 88 bytes could be of size 80 bytes\npkg/config/linters_settings.go:710:25: struct of size 40 bytes could be of size 32 bytes\npkg/config/linters_settings.go:762:21: struct of size 112 bytes could be of size 104 bytes\npkg/config/linters_settings.go:787:23: struct of size 32 bytes could be of size 24 bytes\npkg/config/linters_settings.go:817:23: struct of size 40 bytes could be of size 32 bytes\npkg/config/linters_settings.go:902:25: struct of size 80 bytes could be of size 72 bytes\npkg/config/linters_settings.go:928:18: struct of size 112 bytes could be of size 96 bytes\npkg/config/run.go:6:10: struct of size 168 bytes could be of size 160 bytes\npkg/lint/linter/config.go:36:13: struct of size 128 bytes could be of size 120 bytes\npkg/golinters/govet_test.go:70:23: struct of size 96 bytes could be of size 88 bytes\npkg/result/processors/diff.go:17:11: struct of size 64 bytes could be of size 56 bytes\npkg/experimental/myplugin/myplugin.go:49:14: unused-parameter: parameter 'pass' seems to be unused, consider removing or renaming it as _\npkg/commands/run.go:47:7: const `defaultFileMode` is unused\n"
  },
  {
    "path": "pkg/printers/testdata/golden-teamcity.txt",
    "content": "##teamcity[inspectionType id='gochecknoinits' name='gochecknoinits' description='gochecknoinits' category='Golangci-lint reports']\n##teamcity[inspection typeId='gochecknoinits' message='don|'t use `init` function' file='pkg/experimental/myplugin/myplugin.go' line='13' SEVERITY='ERROR']\n##teamcity[inspectionType id='gocritic' name='gocritic' description='gocritic' category='Golangci-lint reports']\n##teamcity[inspection typeId='gocritic' message='hugeParam: settings is heavy (80 bytes); consider passing it by pointer' file='pkg/lint/lintersdb/builder_plugin.go' line='59' SEVERITY='ERROR']\n##teamcity[inspectionType id='goimports' name='goimports' description='goimports' category='Golangci-lint reports']\n##teamcity[inspection typeId='goimports' message='File is not `goimports`-ed with -local github.com/golangci/golangci-lint' file='pkg/printers/printer_test.go' line='6' SEVERITY='ERROR']\n##teamcity[inspectionType id='maligned' name='maligned' description='maligned' category='Golangci-lint reports']\n##teamcity[inspection typeId='maligned' message='struct of size 144 bytes could be of size 128 bytes' file='pkg/config/issues.go' line='107' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 3144 bytes could be of size 3096 bytes' file='pkg/config/linters_settings.go' line='200' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 72 bytes could be of size 64 bytes' file='pkg/config/linters_settings.go' line='383' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 72 bytes could be of size 56 bytes' file='pkg/config/linters_settings.go' line='470' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 136 bytes could be of size 128 bytes' file='pkg/config/linters_settings.go' line='482' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 64 bytes could be of size 56 bytes' file='pkg/config/linters_settings.go' line='584' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 88 bytes could be of size 80 bytes' file='pkg/config/linters_settings.go' line='591' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 40 bytes could be of size 32 bytes' file='pkg/config/linters_settings.go' line='710' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 112 bytes could be of size 104 bytes' file='pkg/config/linters_settings.go' line='762' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 32 bytes could be of size 24 bytes' file='pkg/config/linters_settings.go' line='787' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 40 bytes could be of size 32 bytes' file='pkg/config/linters_settings.go' line='817' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 80 bytes could be of size 72 bytes' file='pkg/config/linters_settings.go' line='902' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 112 bytes could be of size 96 bytes' file='pkg/config/linters_settings.go' line='928' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 168 bytes could be of size 160 bytes' file='pkg/config/run.go' line='6' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 128 bytes could be of size 120 bytes' file='pkg/lint/linter/config.go' line='36' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 96 bytes could be of size 88 bytes' file='pkg/golinters/govet_test.go' line='70' SEVERITY='ERROR']\n##teamcity[inspection typeId='maligned' message='struct of size 64 bytes could be of size 56 bytes' file='pkg/result/processors/diff.go' line='17' SEVERITY='ERROR']\n##teamcity[inspectionType id='revive' name='revive' description='revive' category='Golangci-lint reports']\n##teamcity[inspection typeId='revive' message='unused-parameter: parameter |'pass|' seems to be unused, consider removing or renaming it as _' file='pkg/experimental/myplugin/myplugin.go' line='49' SEVERITY='WARNING']\n##teamcity[inspectionType id='unused' name='unused' description='unused' category='Golangci-lint reports']\n##teamcity[inspection typeId='unused' message='const `defaultFileMode` is unused' file='pkg/commands/run.go' line='47' SEVERITY='ERROR']\n"
  },
  {
    "path": "pkg/printers/testdata/in-issues.json",
    "content": " [\n    {\n      \"FromLinter\": \"gochecknoinits\",\n      \"Text\": \"don't use `init` function\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"func init() {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/experimental/myplugin/myplugin.go\",\n        \"Offset\": 162,\n        \"Line\": 13,\n        \"Column\": 1\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"gocritic\",\n      \"Text\": \"hugeParam: settings is heavy (80 bytes); consider passing it by pointer\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"func (b *PluginBuilder) loadConfig(cfg *config.Config, name string, settings config.CustomLinterSettings) (*linter.Config, error) {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/lint/lintersdb/builder_plugin.go\",\n        \"Offset\": 1480,\n        \"Line\": 59,\n        \"Column\": 69\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"goimports\",\n      \"Text\": \"File is not `goimports`-ed with -local github.com/golangci/golangci-lint\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"\"\n      ],\n      \"SuggestedFixes\": [\n        {\n          \"Message\": \"\",\n          \"TextEdits\": [\n            {\n              \"Pos\": 13,\n              \"End\": 32,\n              \"NewText\": null\n            }\n          ]\n        }\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/printers/printer_test.go\",\n        \"Offset\": 0,\n        \"Line\": 6,\n        \"Column\": 0\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 144 bytes could be of size 128 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type Issues struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/issues.go\",\n        \"Offset\": 3338,\n        \"Line\": 107,\n        \"Column\": 13\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 3144 bytes could be of size 3096 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type LintersSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 4576,\n        \"Line\": 200,\n        \"Column\": 22\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 72 bytes could be of size 64 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type ExhaustiveSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 10829,\n        \"Line\": 383,\n        \"Column\": 25\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 72 bytes could be of size 56 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type GoConstSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 14399,\n        \"Line\": 470,\n        \"Column\": 22\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 136 bytes could be of size 128 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type GoCriticSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 14934,\n        \"Line\": 482,\n        \"Column\": 23\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 64 bytes could be of size 56 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type GosmopolitanSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 18601,\n        \"Line\": 584,\n        \"Column\": 27\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 88 bytes could be of size 80 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type GovetSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 18867,\n        \"Line\": 591,\n        \"Column\": 20\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 40 bytes could be of size 32 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type NoLintLintSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 22337,\n        \"Line\": 710,\n        \"Column\": 25\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 112 bytes could be of size 104 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type ReviveSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 24019,\n        \"Line\": 762,\n        \"Column\": 21\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 32 bytes could be of size 24 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type SlogLintSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 24648,\n        \"Line\": 787,\n        \"Column\": 23\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 40 bytes could be of size 32 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type TagAlignSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 25936,\n        \"Line\": 817,\n        \"Column\": 23\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 80 bytes could be of size 72 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type VarnamelenSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 28758,\n        \"Line\": 902,\n        \"Column\": 25\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 112 bytes could be of size 96 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type WSLSettings struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/linters_settings.go\",\n        \"Offset\": 29898,\n        \"Line\": 928,\n        \"Column\": 18\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 168 bytes could be of size 160 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type Run struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/config/run.go\",\n        \"Offset\": 112,\n        \"Line\": 6,\n        \"Column\": 10\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 128 bytes could be of size 120 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type Config struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/lint/linter/config.go\",\n        \"Offset\": 1329,\n        \"Line\": 36,\n        \"Column\": 13\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 96 bytes could be of size 88 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"\\tfor _, tc := range []struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/golinters/govet_test.go\",\n        \"Offset\": 1804,\n        \"Line\": 70,\n        \"Column\": 23\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"maligned\",\n      \"Text\": \"struct of size 64 bytes could be of size 56 bytes\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"type Diff struct {\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/result/processors/diff.go\",\n        \"Offset\": 233,\n        \"Line\": 17,\n        \"Column\": 11\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"revive\",\n      \"Text\": \"unused-parameter: parameter 'pass' seems to be unused, consider removing or renaming it as _\",\n      \"Severity\": \"warning\",\n      \"SourceLines\": [\n        \"\\t\\t\\tRun: func(pass *analysis.Pass) (any, error) {\"\n      ],\n      \"LineRange\": {\n        \"From\": 49,\n        \"To\": 49\n      },\n      \"Pos\": {\n        \"Filename\": \"pkg/experimental/myplugin/myplugin.go\",\n        \"Offset\": 921,\n        \"Line\": 49,\n        \"Column\": 14\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    },\n    {\n      \"FromLinter\": \"unused\",\n      \"Text\": \"const `defaultFileMode` is unused\",\n      \"Severity\": \"\",\n      \"SourceLines\": [\n        \"const defaultFileMode = 0644\"\n      ],\n      \"Pos\": {\n        \"Filename\": \"pkg/commands/run.go\",\n        \"Offset\": 1209,\n        \"Line\": 47,\n        \"Column\": 7\n      },\n      \"ExpectNoLint\": false,\n      \"ExpectedNoLintLinter\": \"\"\n    }\n  ]\n\n"
  },
  {
    "path": "pkg/printers/testdata/in-report-data.json",
    "content": "{\n    \"Warnings\": [\n      {\n        \"Tag\": \"runner\",\n        \"Text\": \"The linter 'maligned' is deprecated (since v1.38.0) due to: The repository of the linter has been archived by the owner. Replaced by govet 'fieldalignment'.\"\n      }\n    ],\n    \"Linters\": [\n      {\n        \"Name\": \"asasalint\"\n      },\n      {\n        \"Name\": \"asciicheck\"\n      },\n      {\n        \"Name\": \"bidichk\"\n      },\n      {\n        \"Name\": \"bodyclose\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"containedctx\"\n      },\n      {\n        \"Name\": \"contextcheck\"\n      },\n      {\n        \"Name\": \"cyclop\"\n      },\n      {\n        \"Name\": \"decorder\"\n      },\n      {\n        \"Name\": \"deadcode\"\n      },\n      {\n        \"Name\": \"depguard\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"dogsled\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"dupl\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"dupword\"\n      },\n      {\n        \"Name\": \"durationcheck\"\n      },\n      {\n        \"Name\": \"errcheck\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"errchkjson\"\n      },\n      {\n        \"Name\": \"errname\"\n      },\n      {\n        \"Name\": \"errorlint\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"execinquery\"\n      },\n      {\n        \"Name\": \"exhaustive\"\n      },\n      {\n        \"Name\": \"exhaustivestruct\"\n      },\n      {\n        \"Name\": \"exhaustruct\"\n      },\n      {\n        \"Name\": \"exportloopref\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"forbidigo\"\n      },\n      {\n        \"Name\": \"forcetypeassert\"\n      },\n      {\n        \"Name\": \"funlen\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gci\"\n      },\n      {\n        \"Name\": \"ginkgolinter\"\n      },\n      {\n        \"Name\": \"gocheckcompilerdirectives\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gochecknoglobals\"\n      },\n      {\n        \"Name\": \"gochecknoinits\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gochecksumtype\"\n      },\n      {\n        \"Name\": \"gocognit\"\n      },\n      {\n        \"Name\": \"goconst\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gocritic\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gocyclo\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"godot\"\n      },\n      {\n        \"Name\": \"godox\"\n      },\n      {\n        \"Name\": \"err113\"\n      },\n      {\n        \"Name\": \"gofmt\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gofumpt\"\n      },\n      {\n        \"Name\": \"goheader\"\n      },\n      {\n        \"Name\": \"goimports\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"golint\"\n      },\n      {\n        \"Name\": \"mnd\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gomoddirectives\"\n      },\n      {\n        \"Name\": \"gomodguard\"\n      },\n      {\n        \"Name\": \"goprintffuncname\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gosec\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gosimple\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"gosmopolitan\"\n      },\n      {\n        \"Name\": \"govet\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"grouper\"\n      },\n      {\n        \"Name\": \"ifshort\"\n      },\n      {\n        \"Name\": \"importas\"\n      },\n      {\n        \"Name\": \"inamedparam\"\n      },\n      {\n        \"Name\": \"ineffassign\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"interfacebloat\"\n      },\n      {\n        \"Name\": \"interfacer\"\n      },\n      {\n        \"Name\": \"ireturn\"\n      },\n      {\n        \"Name\": \"lll\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"loggercheck\"\n      },\n      {\n        \"Name\": \"maintidx\"\n      },\n      {\n        \"Name\": \"makezero\"\n      },\n      {\n        \"Name\": \"maligned\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"mirror\"\n      },\n      {\n        \"Name\": \"misspell\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"musttag\"\n      },\n      {\n        \"Name\": \"nakedret\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"nestif\"\n      },\n      {\n        \"Name\": \"nilerr\"\n      },\n      {\n        \"Name\": \"nilnil\"\n      },\n      {\n        \"Name\": \"nlreturn\"\n      },\n      {\n        \"Name\": \"noctx\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"nonamedreturns\"\n      },\n      {\n        \"Name\": \"nosnakecase\"\n      },\n      {\n        \"Name\": \"nosprintfhostport\"\n      },\n      {\n        \"Name\": \"paralleltest\"\n      },\n      {\n        \"Name\": \"perfsprint\"\n      },\n      {\n        \"Name\": \"prealloc\"\n      },\n      {\n        \"Name\": \"predeclared\"\n      },\n      {\n        \"Name\": \"promlinter\"\n      },\n      {\n        \"Name\": \"protogetter\"\n      },\n      {\n        \"Name\": \"reassign\"\n      },\n      {\n        \"Name\": \"revive\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"rowserrcheck\"\n      },\n      {\n        \"Name\": \"sloglint\"\n      },\n      {\n        \"Name\": \"scopelint\"\n      },\n      {\n        \"Name\": \"sqlclosecheck\"\n      },\n      {\n        \"Name\": \"spancheck\"\n      },\n      {\n        \"Name\": \"staticcheck\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"structcheck\"\n      },\n      {\n        \"Name\": \"stylecheck\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"tagalign\"\n      },\n      {\n        \"Name\": \"tagliatelle\"\n      },\n      {\n        \"Name\": \"tenv\"\n      },\n      {\n        \"Name\": \"testableexamples\"\n      },\n      {\n        \"Name\": \"testifylint\"\n      },\n      {\n        \"Name\": \"testpackage\"\n      },\n      {\n        \"Name\": \"thelper\"\n      },\n      {\n        \"Name\": \"tparallel\"\n      },\n      {\n        \"Name\": \"typecheck\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"unconvert\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"unparam\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"unused\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"usestdlibvars\"\n      },\n      {\n        \"Name\": \"varcheck\"\n      },\n      {\n        \"Name\": \"varnamelen\"\n      },\n      {\n        \"Name\": \"wastedassign\"\n      },\n      {\n        \"Name\": \"whitespace\",\n        \"Enabled\": true\n      },\n      {\n        \"Name\": \"wrapcheck\"\n      },\n      {\n        \"Name\": \"wsl\"\n      },\n      {\n        \"Name\": \"zerologlint\"\n      },\n      {\n        \"Name\": \"nolintlint\",\n        \"Enabled\": true\n      }\n    ]\n  }\n\n"
  },
  {
    "path": "pkg/printers/text.go",
    "content": "package printers\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\n// Text prints issues with a human friendly representation.\ntype Text struct {\n\tprintLinterName bool\n\tprintIssuedLine bool\n\tcolors          bool\n\n\tlog logutils.Log\n\tw   io.Writer\n}\n\nfunc NewText(log logutils.Log, w io.Writer, cfg *config.Text) *Text {\n\treturn &Text{\n\t\tprintLinterName: cfg.PrintLinterName,\n\t\tprintIssuedLine: cfg.PrintIssuedLine,\n\t\tcolors:          cfg.Colors,\n\t\tlog:             log.Child(logutils.DebugKeyTextPrinter),\n\t\tw:               w,\n\t}\n}\n\nfunc (p *Text) SprintfColored(ca color.Attribute, format string, args ...any) string {\n\tc := color.New(ca)\n\n\tif !p.colors {\n\t\tc.DisableColor()\n\t}\n\n\treturn c.Sprintf(format, args...)\n}\n\nfunc (p *Text) Print(issues []*result.Issue) error {\n\tfor _, issue := range issues {\n\t\tp.printIssue(issue)\n\n\t\tif !p.printIssuedLine {\n\t\t\tcontinue\n\t\t}\n\n\t\tp.printSourceCode(issue)\n\t\tp.printUnderLinePointer(issue)\n\t}\n\n\treturn nil\n}\n\nfunc (p *Text) printIssue(issue *result.Issue) {\n\ttext := p.SprintfColored(color.FgRed, \"%s\", strings.TrimSpace(issue.Text))\n\tif p.printLinterName {\n\t\ttext += fmt.Sprintf(\" (%s)\", issue.FromLinter)\n\t}\n\tpos := p.SprintfColored(color.Bold, \"%s:%d\", issue.FilePath(), issue.Line())\n\tif issue.Pos.Column != 0 {\n\t\tpos += fmt.Sprintf(\":%d\", issue.Pos.Column)\n\t}\n\tfmt.Fprintf(p.w, \"%s: %s\\n\", pos, text)\n}\n\nfunc (p *Text) printSourceCode(issue *result.Issue) {\n\tfor _, line := range issue.SourceLines {\n\t\tfmt.Fprintln(p.w, line)\n\t}\n}\n\nfunc (p *Text) printUnderLinePointer(issue *result.Issue) {\n\t// if column == 0 it means column is unknown (e.g. for gosec)\n\tif len(issue.SourceLines) != 1 || issue.Pos.Column == 0 {\n\t\treturn\n\t}\n\n\tcol0 := issue.Pos.Column - 1\n\tline := issue.SourceLines[0]\n\tprefixRunes := make([]rune, 0, len(line))\n\tfor j := 0; j < len(line) && j < col0; j++ {\n\t\tif line[j] == '\\t' {\n\t\t\tprefixRunes = append(prefixRunes, '\\t')\n\t\t} else {\n\t\t\tprefixRunes = append(prefixRunes, ' ')\n\t\t}\n\t}\n\n\tfmt.Fprintf(p.w, \"%s%s\\n\", string(prefixRunes), p.SprintfColored(color.FgYellow, \"^\"))\n}\n"
  },
  {
    "path": "pkg/printers/text_test.go",
    "content": "package printers\n\nimport (\n\t\"bytes\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestText_Print(t *testing.T) {\n\t// force color globally\n\tbackup := color.NoColor\n\tt.Cleanup(func() {\n\t\tcolor.NoColor = backup\n\t})\n\tcolor.NoColor = false\n\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tFromLinter: \"linter-a\",\n\t\t\tSeverity:   \"warning\",\n\t\t\tText:       \"some issue\",\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/filea.go\",\n\t\t\t\tOffset:   2,\n\t\t\t\tLine:     10,\n\t\t\t\tColumn:   4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tFromLinter: \"linter-b\",\n\t\t\tSeverity:   \"error\",\n\t\t\tText:       \"another issue\",\n\t\t\tSourceLines: []string{\n\t\t\t\t\"func foo() {\",\n\t\t\t\t\"\\tfmt.Println(\\\"bar\\\")\",\n\t\t\t\t\"}\",\n\t\t\t},\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: \"path/to/fileb.go\",\n\t\t\t\tOffset:   5,\n\t\t\t\tLine:     300,\n\t\t\t\tColumn:   9,\n\t\t\t},\n\t\t},\n\t}\n\n\ttestCases := []struct {\n\t\tdesc            string\n\t\tprintIssuedLine bool\n\t\tprintLinterName bool\n\t\tuseColors       bool\n\t\texpected        string\n\t}{\n\t\t{\n\t\t\tdesc:            \"printIssuedLine and printLinterName\",\n\t\t\tprintIssuedLine: true,\n\t\t\tprintLinterName: true,\n\t\t\tuseColors:       false,\n\t\t\texpected: `path/to/filea.go:10:4: some issue (linter-a)\npath/to/fileb.go:300:9: another issue (linter-b)\nfunc foo() {\n\tfmt.Println(\"bar\")\n}\n`,\n\t\t},\n\t\t{\n\t\t\tdesc:            \"printLinterName only\",\n\t\t\tprintIssuedLine: false,\n\t\t\tprintLinterName: true,\n\t\t\tuseColors:       false,\n\t\t\texpected: `path/to/filea.go:10:4: some issue (linter-a)\npath/to/fileb.go:300:9: another issue (linter-b)\n`,\n\t\t},\n\t\t{\n\t\t\tdesc:            \"printIssuedLine only\",\n\t\t\tprintIssuedLine: true,\n\t\t\tprintLinterName: false,\n\t\t\tuseColors:       false,\n\t\t\texpected: `path/to/filea.go:10:4: some issue\npath/to/fileb.go:300:9: another issue\nfunc foo() {\n\tfmt.Println(\"bar\")\n}\n`,\n\t\t},\n\t\t{\n\t\t\tdesc:            \"enable all options\",\n\t\t\tprintIssuedLine: true,\n\t\t\tprintLinterName: true,\n\t\t\tuseColors:       true,\n\t\t\texpected:        \"\\x1b[1mpath/to/filea.go:10\\x1b[22m:4: \\x1b[31msome issue\\x1b[0m (linter-a)\\n\\x1b[1mpath/to/fileb.go:300\\x1b[22m:9: \\x1b[31manother issue\\x1b[0m (linter-b)\\nfunc foo() {\\n\\tfmt.Println(\\\"bar\\\")\\n}\\n\",\n\t\t},\n\t\t{\n\t\t\tdesc:            \"disable all options\",\n\t\t\tprintIssuedLine: false,\n\t\t\tprintLinterName: false,\n\t\t\tuseColors:       false,\n\t\t\texpected: `path/to/filea.go:10:4: some issue\npath/to/fileb.go:300:9: another issue\n`,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tbuf := new(bytes.Buffer)\n\n\t\t\tprinter := NewText(logutils.NewStderrLog(logutils.DebugKeyEmpty), buf, &config.Text{\n\t\t\t\tSimpleFormat:    config.SimpleFormat{},\n\t\t\t\tPrintLinterName: test.printLinterName,\n\t\t\t\tPrintIssuedLine: test.printIssuedLine,\n\t\t\t\tColors:          test.useColors,\n\t\t\t})\n\n\t\t\terr := printer.Print(issues)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, buf.String())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/report/data.go",
    "content": "package report\n\ntype Warning struct {\n\tTag  string `json:\",omitempty\"`\n\tText string\n}\n\ntype LinterData struct {\n\tName    string\n\tEnabled bool `json:\",omitempty\"`\n}\n\ntype Data struct {\n\tWarnings []Warning    `json:\",omitempty\"`\n\tLinters  []LinterData `json:\",omitempty\"`\n\tError    string       `json:\",omitempty\"`\n}\n\nfunc (d *Data) AddLinter(name string, enabled bool) {\n\td.Linters = append(d.Linters, LinterData{\n\t\tName:    name,\n\t\tEnabled: enabled,\n\t})\n}\n"
  },
  {
    "path": "pkg/report/log.go",
    "content": "package report\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\ntype LogWrapper struct {\n\trd      *Data\n\ttags    []string\n\torigLog logutils.Log\n}\n\nfunc NewLogWrapper(log logutils.Log, reportData *Data) *LogWrapper {\n\treturn &LogWrapper{\n\t\trd:      reportData,\n\t\torigLog: log,\n\t}\n}\n\nfunc (lw LogWrapper) Fatalf(format string, args ...any) {\n\tlw.origLog.Fatalf(format, args...)\n}\n\nfunc (lw LogWrapper) Panicf(format string, args ...any) {\n\tlw.origLog.Panicf(format, args...)\n}\n\nfunc (lw LogWrapper) Errorf(format string, args ...any) {\n\tlw.origLog.Errorf(format, args...)\n\tlw.rd.Error = fmt.Sprintf(format, args...)\n}\n\nfunc (lw LogWrapper) Warnf(format string, args ...any) {\n\tlw.origLog.Warnf(format, args...)\n\tw := Warning{\n\t\tTag:  strings.Join(lw.tags, \"/\"),\n\t\tText: fmt.Sprintf(format, args...),\n\t}\n\n\tlw.rd.Warnings = append(lw.rd.Warnings, w)\n}\n\nfunc (lw LogWrapper) Infof(format string, args ...any) {\n\tlw.origLog.Infof(format, args...)\n}\n\nfunc (lw LogWrapper) Child(name string) logutils.Log {\n\tc := lw\n\tc.origLog = lw.origLog.Child(name)\n\tc.tags = slices.Clone(lw.tags)\n\tc.tags = append(c.tags, name)\n\treturn c\n}\n\nfunc (lw LogWrapper) SetLevel(level logutils.LogLevel) {\n\tlw.origLog.SetLevel(level)\n}\n\nfunc (lw LogWrapper) GoString() string {\n\treturn fmt.Sprintf(\"lw: %+v, orig log: %#v\", lw, lw.origLog)\n}\n"
  },
  {
    "path": "pkg/result/issue.go",
    "content": "package result\n\nimport (\n\t\"crypto/md5\" //nolint:gosec // for md5 hash\n\t\"fmt\"\n\t\"go/token\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/packages\"\n)\n\ntype Range struct {\n\tFrom, To int\n}\n\ntype Issue struct {\n\tFromLinter string\n\tText       string\n\n\tSeverity string\n\n\t// Source lines of a code with the issue to show\n\tSourceLines []string\n\n\t// Pkg is needed for proper caching of linting results\n\tPkg *packages.Package `json:\"-\"`\n\n\tPos token.Position\n\n\tLineRange *Range `json:\",omitempty\"`\n\n\t// HunkPos is used only when golangci-lint is run over a diff\n\tHunkPos int `json:\",omitempty\"`\n\n\t// If we know how to fix the issue, we can provide replacement lines\n\tSuggestedFixes []analysis.SuggestedFix `json:\",omitempty\"`\n\n\t// If we are expecting a nolint (because this is from nolintlint), record the expected linter\n\tExpectNoLint         bool\n\tExpectedNoLintLinter string\n\n\t// Only for Diff processor needs.\n\tWorkingDirectoryRelativePath string `json:\"-\"`\n\n\t// Only for processors that need relative paths evaluation.\n\tRelativePath string `json:\"-\"`\n}\n\nfunc (i *Issue) FilePath() string {\n\treturn i.Pos.Filename\n}\n\nfunc (i *Issue) Line() int {\n\treturn i.Pos.Line\n}\n\nfunc (i *Issue) Column() int {\n\treturn i.Pos.Column\n}\n\nfunc (i *Issue) GetLineRange() Range {\n\tif i.LineRange == nil {\n\t\treturn Range{\n\t\t\tFrom: i.Line(),\n\t\t\tTo:   i.Line(),\n\t\t}\n\t}\n\n\tif i.LineRange.From == 0 {\n\t\treturn Range{\n\t\t\tFrom: i.Line(),\n\t\t\tTo:   i.Line(),\n\t\t}\n\t}\n\n\treturn *i.LineRange\n}\n\nfunc (i *Issue) Description() string {\n\treturn fmt.Sprintf(\"%s: %s\", i.FromLinter, i.Text)\n}\n\nfunc (i *Issue) Fingerprint() string {\n\tfirstLine := \"\"\n\tif len(i.SourceLines) > 0 {\n\t\tfirstLine = i.SourceLines[0]\n\t}\n\n\thash := md5.New() //nolint:gosec // we don't need a strong hash here\n\t_, _ = fmt.Fprintf(hash, \"%s%s%s\", i.Pos.Filename, i.Text, firstLine)\n\n\treturn fmt.Sprintf(\"%X\", hash.Sum(nil))\n}\n"
  },
  {
    "path": "pkg/result/processors/base_rule.go",
    "content": "package processors\n\nimport (\n\t\"regexp\"\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype baseRule struct {\n\ttext       *regexp.Regexp\n\tsource     *regexp.Regexp\n\tpath       *regexp.Regexp\n\tpathExcept *regexp.Regexp\n\tlinters    []string\n}\n\n// The usage of `regexp.MustCompile()` is safe here,\n// because the regular expressions are checked before inside [config.BaseRule.Validate].\nfunc newBaseRule(rule *config.BaseRule, prefix string) baseRule {\n\tbase := baseRule{\n\t\tlinters: rule.Linters,\n\t}\n\n\tif rule.Text != \"\" {\n\t\tbase.text = regexp.MustCompile(prefix + rule.Text)\n\t}\n\n\tif rule.Source != \"\" {\n\t\tbase.source = regexp.MustCompile(prefix + rule.Source)\n\t}\n\n\tif rule.Path != \"\" {\n\t\tbase.path = regexp.MustCompile(fsutils.NormalizePathInRegex(rule.Path))\n\t}\n\n\tif rule.PathExcept != \"\" {\n\t\tbase.pathExcept = regexp.MustCompile(fsutils.NormalizePathInRegex(rule.PathExcept))\n\t}\n\n\treturn base\n}\n\nfunc (r *baseRule) isEmpty() bool {\n\treturn r.text == nil && r.source == nil && r.path == nil && r.pathExcept == nil && len(r.linters) == 0\n}\n\nfunc (r *baseRule) match(issue *result.Issue, lines *fsutils.LineCache, log logutils.Log) bool {\n\tif r.isEmpty() {\n\t\treturn false\n\t}\n\tif r.text != nil && !r.text.MatchString(issue.Text) {\n\t\treturn false\n\t}\n\tif r.path != nil && !r.path.MatchString(issue.RelativePath) {\n\t\treturn false\n\t}\n\tif r.pathExcept != nil && r.pathExcept.MatchString(issue.RelativePath) {\n\t\treturn false\n\t}\n\tif len(r.linters) != 0 && !r.matchLinter(issue) {\n\t\treturn false\n\t}\n\n\t// the most heavyweight checking last\n\tif r.source != nil && !r.matchSource(issue, lines, log) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\nfunc (r *baseRule) matchLinter(issue *result.Issue) bool {\n\treturn slices.Contains(r.linters, issue.FromLinter)\n}\n\nfunc (r *baseRule) matchSource(issue *result.Issue, lineCache *fsutils.LineCache, log logutils.Log) bool {\n\tsourceLine, errSourceLine := lineCache.GetLine(issue.FilePath(), issue.Line())\n\tif errSourceLine != nil {\n\t\tlog.Warnf(\"Failed to get line %s:%d from line cache: %s\", issue.FilePath(), issue.Line(), errSourceLine)\n\t\treturn false // can't properly match\n\t}\n\n\treturn r.source.MatchString(sourceLine)\n}\n\nfunc parseRules[T, V any](rules []T, prefix string, newFn func(*T, string) V) []V {\n\tif len(rules) == 0 {\n\t\treturn nil\n\t}\n\n\tparsedRules := make([]V, 0, len(rules))\n\n\tfor _, r := range rules {\n\t\tparsedRules = append(parsedRules, newFn(&r, prefix))\n\t}\n\n\treturn parsedRules\n}\n"
  },
  {
    "path": "pkg/result/processors/cgo.go",
    "content": "package processors\n\nimport (\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/ldez/grignotin/goenv\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/goutil\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*Cgo)(nil)\n\n// Cgo filters cgo artifacts.\n//\n// Some linters (e.g. gosec, etc.) return incorrect file paths for cgo files.\n//\n// Require absolute file path.\ntype Cgo struct {\n\tgoCacheDir string\n}\n\nfunc NewCgo(env *goutil.Env) *Cgo {\n\treturn &Cgo{\n\t\tgoCacheDir: env.Get(goenv.GOCACHE),\n\t}\n}\n\nfunc (*Cgo) Name() string {\n\treturn \"cgo\"\n}\n\nfunc (p *Cgo) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\treturn filterIssuesErr(issues, p.shouldPassIssue)\n}\n\nfunc (*Cgo) Finish() {}\n\nfunc (p *Cgo) shouldPassIssue(issue *result.Issue) (bool, error) {\n\t// [p.goCacheDir] contains all preprocessed files including cgo files.\n\tif p.goCacheDir != \"\" && strings.HasPrefix(issue.FilePath(), p.goCacheDir) {\n\t\treturn false, nil\n\t}\n\n\tif filepath.Base(issue.FilePath()) == \"_cgo_gotypes.go\" {\n\t\t// skip cgo warning for go1.10\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n"
  },
  {
    "path": "pkg/result/processors/diff.go",
    "content": "package processors\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/golangci/revgrep\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst envGolangciDiffProcessorPatch = \"GOLANGCI_DIFF_PROCESSOR_PATCH\"\n\nvar _ Processor = (*Diff)(nil)\n\n// Diff filters issues based on options `new`, `new-from-rev`, etc.\n//\n// Uses `git`.\n// The paths inside the patch are relative to the path where git is run (the same location where golangci-lint is run).\n//\n// Warning: it doesn't use `path-prefix` option.\ntype Diff struct {\n\tonlyNew       bool\n\tfromRev       string\n\tfromMergeBase string\n\tpatchFilePath string\n\twholeFiles    bool\n\tpatch         string\n}\n\nfunc NewDiff(cfg *config.Issues) *Diff {\n\treturn &Diff{\n\t\tonlyNew:       cfg.Diff,\n\t\tfromRev:       cfg.DiffFromRevision,\n\t\tfromMergeBase: cfg.DiffFromMergeBase,\n\t\tpatchFilePath: cfg.DiffPatchFilePath,\n\t\twholeFiles:    cfg.WholeFiles,\n\t\tpatch:         os.Getenv(envGolangciDiffProcessorPatch),\n\t}\n}\n\nfunc (*Diff) Name() string {\n\treturn \"diff\"\n}\n\nfunc (p *Diff) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif !p.onlyNew && p.fromRev == \"\" && p.fromMergeBase == \"\" && p.patchFilePath == \"\" && p.patch == \"\" {\n\t\treturn issues, nil\n\t}\n\n\tvar patchReader io.Reader\n\tswitch {\n\tcase p.patchFilePath != \"\":\n\t\tpatch, err := os.ReadFile(p.patchFilePath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"can't read from patch file %s: %w\", p.patchFilePath, err)\n\t\t}\n\n\t\tpatchReader = bytes.NewReader(patch)\n\n\tcase p.patch != \"\":\n\t\tpatchReader = strings.NewReader(p.patch)\n\t}\n\n\tchecker := revgrep.Checker{\n\t\tPatch:        patchReader,\n\t\tRevisionFrom: p.fromRev,\n\t\tMergeBase:    p.fromMergeBase,\n\t\tWholeFiles:   p.wholeFiles,\n\t}\n\n\terr := checker.Prepare(context.Background())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't prepare diff by revgrep: %w\", err)\n\t}\n\n\treturn transformIssues(issues, func(issue *result.Issue) *result.Issue {\n\t\tif issue.FromLinter == typeCheckName {\n\t\t\t// Never hide typechecking errors.\n\t\t\treturn issue\n\t\t}\n\n\t\thunkPos, isNew := checker.IsNew(issue.WorkingDirectoryRelativePath, issue.Line())\n\t\tif !isNew {\n\t\t\treturn nil\n\t\t}\n\n\t\tnewIssue := *issue\n\t\tnewIssue.HunkPos = hunkPos\n\n\t\treturn &newIssue\n\t}), nil\n}\n\nfunc (*Diff) Finish() {}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_generated_file_filter.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*GeneratedFileFilter)(nil)\n\ntype fileSummary struct {\n\tgenerated bool\n}\n\n// GeneratedFileFilter filters generated files.\ntype GeneratedFileFilter struct {\n\tdebugf logutils.DebugFunc\n\n\tmode    string\n\tmatcher *GeneratedFileMatcher\n\n\tfileSummaryCache map[string]*fileSummary\n}\n\nfunc NewGeneratedFileFilter(mode string) *GeneratedFileFilter {\n\treturn &GeneratedFileFilter{\n\t\tdebugf: logutils.Debug(logutils.DebugKeyGeneratedFileFilter),\n\n\t\tmode:    mode,\n\t\tmatcher: NewGeneratedFileMatcher(mode),\n\n\t\tfileSummaryCache: map[string]*fileSummary{},\n\t}\n}\n\nfunc (*GeneratedFileFilter) Name() string {\n\treturn \"generated_file_filter\"\n}\n\nfunc (p *GeneratedFileFilter) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif p.mode == config.GeneratedModeDisable {\n\t\treturn issues, nil\n\t}\n\n\treturn filterIssuesErr(issues, p.shouldPassIssue)\n}\n\nfunc (*GeneratedFileFilter) Finish() {}\n\nfunc (p *GeneratedFileFilter) shouldPassIssue(issue *result.Issue) (bool, error) {\n\tif filepath.Base(issue.FilePath()) == \"go.mod\" {\n\t\treturn true, nil\n\t}\n\n\t// The file is already known.\n\tfs := p.fileSummaryCache[issue.FilePath()]\n\tif fs != nil {\n\t\treturn !fs.generated, nil\n\t}\n\n\tfs = &fileSummary{}\n\tp.fileSummaryCache[issue.FilePath()] = fs\n\n\tvar err error\n\tfs.generated, err = p.matcher.IsGeneratedFile(issue.FilePath(), nil)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"failed to get doc (%s) of file %s: %w\", p.mode, issue.FilePath(), err)\n\t}\n\n\tp.debugf(\"file %q is generated: %t\", issue.FilePath(), fs.generated)\n\n\t// don't report issues for autogenerated files\n\treturn !fs.generated, nil\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_generated_file_filter_test.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"go/token\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestGeneratedFileFilter_shouldPassIssue(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc   string\n\t\tmode   string\n\t\tissue  *result.Issue\n\t\tassert assert.BoolAssertionFunc\n\t}{\n\t\t{\n\t\t\tdesc: \"lax \",\n\t\t\tmode: config.GeneratedModeLax,\n\t\t\tissue: &result.Issue{\n\t\t\t\tFromLinter: \"example\",\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tFilename: filepath.FromSlash(\"testdata/exclusion_generated_file_filter/go_strict_invalid.go\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tassert: assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc: \"strict \",\n\t\t\tmode: config.GeneratedModeStrict,\n\t\t\tissue: &result.Issue{\n\t\t\t\tFromLinter: \"example\",\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tFilename: filepath.FromSlash(\"testdata/exclusion_generated_file_filter/go_strict_invalid.go\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tassert: assert.True,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tp := NewGeneratedFileFilter(test.mode)\n\n\t\t\tpass, err := p.shouldPassIssue(test.issue)\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttest.assert(t, pass)\n\t\t})\n\t}\n}\n\nfunc TestGeneratedFileFilter_shouldPassIssue_error(t *testing.T) {\n\tnotFoundMsg := \"no such file or directory\"\n\tif runtime.GOOS == \"windows\" {\n\t\tnotFoundMsg = \"The system cannot find the file specified.\"\n\t}\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tmode     string\n\t\tissue    *result.Issue\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"non-existing file (lax)\",\n\t\t\tmode: config.GeneratedModeLax,\n\t\t\tissue: &result.Issue{\n\t\t\t\tFromLinter: \"example\",\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tFilename: filepath.FromSlash(\"no-existing.go\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: fmt.Sprintf(\"failed to get doc (lax) of file %[1]s: failed to parse file: open %[1]s: %[2]s\",\n\t\t\t\tfilepath.FromSlash(\"no-existing.go\"), notFoundMsg),\n\t\t},\n\t\t{\n\t\t\tdesc: \"non-existing file (strict)\",\n\t\t\tmode: config.GeneratedModeStrict,\n\t\t\tissue: &result.Issue{\n\t\t\t\tFromLinter: \"example\",\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tFilename: filepath.FromSlash(\"no-existing.go\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: fmt.Sprintf(\"failed to get doc (strict) of file %[1]s: failed to parse file: open %[1]s: %[2]s\",\n\t\t\t\tfilepath.FromSlash(\"no-existing.go\"), notFoundMsg),\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tp := NewGeneratedFileFilter(test.mode)\n\n\t\t\tpass, err := p.shouldPassIssue(test.issue)\n\n\t\t\t//nolint:testifylint // It's a loop and the main expectation is the error message.\n\t\t\tassert.EqualError(t, err, test.expected)\n\t\t\tassert.False(t, pass)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_generated_file_matcher.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\n// The values must be in lowercase.\nconst (\n\tgenCodeGenerated = \"code generated\"\n\tgenDoNotEdit     = \"do not edit\"\n\n\t// Related to easyjson.\n\tgenAutoFile = \"autogenerated file\"\n\n\t//nolint:lll // Long URL\n\t// Related to Swagger Codegen.\n\t// https://github.com/swagger-api/swagger-codegen/blob/61cfeac3b9d855b4eb8bffa0d118bece117bcb7d/modules/swagger-codegen/src/main/resources/go/partial_header.mustache#L16\n\t// https://github.com/swagger-api/swagger-codegen/issues/12358\n\tgenSwaggerCodegen = \"* generated by: swagger codegen \"\n)\n\n// GeneratedFileMatcher detects generated files.\n//   - mode \"lax\": see `isGeneratedFileLax` documentation.\n//   - mode \"strict\": see `isGeneratedFileStrict` documentation.\n//   - mode \"disable\": skips this processor.\ntype GeneratedFileMatcher struct {\n\tdebugf logutils.DebugFunc\n\n\tmode string\n}\n\nfunc NewGeneratedFileMatcher(mode string) *GeneratedFileMatcher {\n\treturn &GeneratedFileMatcher{\n\t\tdebugf: logutils.Debug(logutils.DebugKeyGeneratedFileFilter),\n\t\tmode:   mode,\n\t}\n}\n\nfunc (p *GeneratedFileMatcher) IsGeneratedFile(filepath string, src any) (bool, error) {\n\tif p.mode == config.GeneratedModeDisable {\n\t\treturn false, nil\n\t}\n\n\tfile, err := parser.ParseFile(token.NewFileSet(), filepath, src, parser.PackageClauseOnly|parser.ParseComments)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"failed to parse file: %w\", err)\n\t}\n\n\tif p.mode == config.GeneratedModeStrict {\n\t\treturn isGeneratedFileStrict(file), nil\n\t}\n\n\tdoc := getComments(file)\n\n\treturn p.isGeneratedFileLax(doc), nil\n}\n\n// isGeneratedFileLax reports whether the source file is generated code.\n// The function uses a bit laxer rules than isGeneratedFileStrict to match more generated code.\n// See https://github.com/golangci/golangci-lint/issues/48 and https://github.com/golangci/golangci-lint/issues/72.\nfunc (p *GeneratedFileMatcher) isGeneratedFileLax(doc string) bool {\n\tmarkers := []string{genCodeGenerated, genDoNotEdit, genAutoFile, genSwaggerCodegen}\n\n\tdoc = strings.ToLower(doc)\n\n\tfor _, marker := range markers {\n\t\tif strings.Contains(doc, marker) {\n\t\t\tp.debugf(\"doc contains marker %q: file is generated\", marker)\n\n\t\t\treturn true\n\t\t}\n\t}\n\n\tp.debugf(\"doc of len %d doesn't contain any of markers: %s\", len(doc), markers)\n\n\treturn false\n}\n\n// isGeneratedFileStrict returns true if the source file has a line that matches the regular expression:\n//\n//\t^// Code generated .* DO NOT EDIT\\.$\n//\n// This line must appear before the first non-comment, non-blank text in the file.\n// Based on https://go.dev/s/generatedcode.\nfunc isGeneratedFileStrict(file *ast.File) bool {\n\tif file == nil || len(file.Comments) == 0 {\n\t\treturn false\n\t}\n\n\treturn ast.IsGenerated(file)\n}\n\nfunc getComments(file *ast.File) string {\n\tvar docLines []string\n\tfor _, c := range file.Comments {\n\t\tdocLines = append(docLines, strings.TrimSpace(c.Text()))\n\t}\n\n\treturn strings.Join(docLines, \"\\n\")\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_generated_file_matcher_test.go",
    "content": "package processors\n\nimport (\n\t\"go/parser\"\n\t\"go/token\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n)\n\nfunc TestGeneratedFileMatcher_isGeneratedFileLax_generated(t *testing.T) {\n\tp := NewGeneratedFileMatcher(config.GeneratedModeLax)\n\n\tcomments := []string{\n\t\t`\t// generated by stringer -type Pill pill.go; DO NOT EDIT`,\n\t\t`// Code generated by \"stringer -type Pill pill.go\"; DO NOT EDIT`,\n\t\t`// Code generated by vfsgen; DO NOT EDIT`,\n\t\t`// Created by cgo -godefs - DO NOT EDIT`,\n\t\t`/* Created by cgo - DO NOT EDIT. */`,\n\t\t`// Generated by stringer -i a.out.go -o anames.go -p ppc64\n// Do not edit.`,\n\t\t`// DO NOT EDIT\n// generated by: x86map -fmt=decoder ../x86.csv`,\n\t\t`// DO NOT EDIT.\n// Generate with: go run gen.go -full -output md5block.go`,\n\t\t`// generated by \"go run gen.go\". DO NOT EDIT.`,\n\t\t`// DO NOT EDIT. This file is generated by mksyntaxgo from the RE2 distribution.`,\n\t\t`// GENERATED BY make_perl_groups.pl; DO NOT EDIT.`,\n\t\t`// generated by mknacl.sh - do not edit`,\n\t\t`// DO NOT EDIT ** This file was generated with the bake tool ** DO NOT EDIT //`,\n\t\t`// Generated by running\n//  maketables --tables=all --data=http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt\n// --casefolding=http://www.unicode.org/Public/8.0.0/ucd/CaseFolding.txt\n// DO NOT EDIT`,\n\t\t`/*\n* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/gogen/unmarshalmap\n* THIS FILE SHOULD NOT BE EDITED BY HAND\n  */`,\n\t\t`// AUTOGENERATED FILE: easyjson file.go`,\n\t\t` * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)`,\n\t}\n\n\tfor _, comment := range comments {\n\t\tt.Run(comment, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tgenerated := p.isGeneratedFileLax(comment)\n\t\t\tassert.True(t, generated)\n\t\t})\n\t}\n}\n\nfunc TestGeneratedFileMatcher_isGeneratedFileLax_nonGenerated(t *testing.T) {\n\tp := NewGeneratedFileMatcher(config.GeneratedModeLax)\n\n\tcomments := []string{\n\t\t\"code not generated by\",\n\t\t\"test\",\n\t}\n\n\tfor _, comment := range comments {\n\t\tt.Run(comment, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tgenerated := p.isGeneratedFileLax(comment)\n\t\t\tassert.False(t, generated)\n\t\t})\n\t}\n}\n\nfunc Test_isGeneratedFileStrict(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tfilepath string\n\t\tassert   assert.BoolAssertionFunc\n\t}{\n\t\t{\n\t\t\tdesc:     \"go strict\",\n\t\t\tfilepath: filepath.FromSlash(\"testdata/exclusion_generated_file_filter/go_strict.go\"),\n\t\t\tassert:   assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:     \"go strict invalid\",\n\t\t\tfilepath: filepath.FromSlash(\"testdata/exclusion_generated_file_filter/go_strict_invalid.go\"),\n\t\t\tassert:   assert.False,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tfile, err := parser.ParseFile(token.NewFileSet(), test.filepath, nil, parser.PackageClauseOnly|parser.ParseComments)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tgenerated := isGeneratedFileStrict(file)\n\n\t\t\ttest.assert(t, generated)\n\t\t})\n\t}\n}\n\nfunc Test_getComments(t *testing.T) {\n\ttestCases := []struct {\n\t\tfpath string\n\t\tdoc   string\n\t}{\n\t\t{\n\t\t\tfpath: filepath.FromSlash(\"testdata/exclusion_generated_file_filter/exclude.go\"),\n\t\t\tdoc: `first line\nsecond line\nthird line\nthis text also\nand this text also`,\n\t\t},\n\t\t{\n\t\t\tfpath: filepath.FromSlash(\"testdata/exclusion_generated_file_filter/exclude_doc.go\"),\n\t\t\tdoc:   `DO NOT EDIT`,\n\t\t},\n\t\t{\n\t\t\tfpath: filepath.FromSlash(\"testdata/exclusion_generated_file_filter/exclude_block_comment.go\"),\n\t\t\tdoc: `* first line\n *\n * second line\n * third line\nand this text also\nthis type of block comment also\nthis one line comment also`,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tfile, err := parser.ParseFile(token.NewFileSet(), tc.fpath, nil, parser.PackageClauseOnly|parser.ParseComments)\n\t\trequire.NoError(t, err)\n\n\t\tdoc := getComments(file)\n\t\tassert.Equal(t, tc.doc, doc)\n\t}\n}\n\n// Issue 954: Some lines can be very long, e.g. auto-generated\n// embedded resources. Reported on file of 86.2KB.\nfunc TestGeneratedFileMatcher_IsGeneratedFile_fileWithLongLine(t *testing.T) {\n\tp := NewGeneratedFileMatcher(config.GeneratedModeLax)\n\n\tfpath := filepath.FromSlash(\"testdata/exclusion_generated_file_filter/exclude_long_line.go\")\n\n\t_, err := p.IsGeneratedFile(fpath, nil)\n\tassert.NoError(t, err)\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_paths.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*ExclusionPaths)(nil)\n\ntype ExclusionPaths struct {\n\tpathPatterns       []*regexp.Regexp\n\tpathExceptPatterns []*regexp.Regexp\n\n\twarnUnused                bool\n\texcludedPathCounter       map[*regexp.Regexp]int\n\texcludedPathExceptCounter map[*regexp.Regexp]int\n\n\tlog logutils.Log\n}\n\nfunc NewExclusionPaths(log logutils.Log, cfg *config.LinterExclusions) (*ExclusionPaths, error) {\n\texcludedPathCounter := make(map[*regexp.Regexp]int)\n\n\tvar pathPatterns []*regexp.Regexp\n\tfor _, p := range cfg.Paths {\n\t\tp = fsutils.NormalizePathInRegex(p)\n\n\t\tpatternRe, err := regexp.Compile(p)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"can't compile regexp %q: %w\", p, err)\n\t\t}\n\n\t\tpathPatterns = append(pathPatterns, patternRe)\n\t\texcludedPathCounter[patternRe] = 0\n\t}\n\n\texcludedPathExceptCounter := make(map[*regexp.Regexp]int)\n\n\tvar pathExceptPatterns []*regexp.Regexp\n\tfor _, p := range cfg.PathsExcept {\n\t\tp = fsutils.NormalizePathInRegex(p)\n\n\t\tpatternRe, err := regexp.Compile(p)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"can't compile regexp %q: %w\", p, err)\n\t\t}\n\n\t\tpathExceptPatterns = append(pathExceptPatterns, patternRe)\n\t\texcludedPathExceptCounter[patternRe] = 0\n\t}\n\n\treturn &ExclusionPaths{\n\t\tpathPatterns:              pathPatterns,\n\t\tpathExceptPatterns:        pathExceptPatterns,\n\t\twarnUnused:                cfg.WarnUnused,\n\t\texcludedPathCounter:       excludedPathCounter,\n\t\texcludedPathExceptCounter: excludedPathExceptCounter,\n\t\tlog:                       log.Child(logutils.DebugKeyExclusionPaths),\n\t}, nil\n}\n\nfunc (*ExclusionPaths) Name() string {\n\treturn \"exclusion_paths\"\n}\n\nfunc (p *ExclusionPaths) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif len(p.pathPatterns) == 0 && len(p.pathExceptPatterns) == 0 {\n\t\treturn issues, nil\n\t}\n\n\treturn filterIssues(issues, p.shouldPassIssue), nil\n}\n\nfunc (p *ExclusionPaths) Finish() {\n\tfor pattern, count := range p.excludedPathCounter {\n\t\tif p.warnUnused && count == 0 {\n\t\t\tp.log.Warnf(\"The pattern %q match no issues\", pattern)\n\t\t} else {\n\t\t\tp.log.Infof(\"Skipped %d issues by pattern %q\", count, pattern)\n\t\t}\n\t}\n\n\tfor pattern, count := range p.excludedPathExceptCounter {\n\t\tif p.warnUnused && count == 0 {\n\t\t\tp.log.Warnf(\"The pattern %q match no issues\", pattern)\n\t\t}\n\t}\n}\n\nfunc (p *ExclusionPaths) shouldPassIssue(issue *result.Issue) bool {\n\tfor _, pattern := range p.pathPatterns {\n\t\tif pattern.MatchString(issue.RelativePath) {\n\t\t\tp.excludedPathCounter[pattern]++\n\t\t\treturn false\n\t\t}\n\t}\n\n\tif len(p.pathExceptPatterns) == 0 {\n\t\treturn true\n\t}\n\n\tmatched := false\n\tfor _, pattern := range p.pathExceptPatterns {\n\t\tif !pattern.MatchString(issue.RelativePath) {\n\t\t\tcontinue\n\t\t}\n\n\t\tp.excludedPathExceptCounter[pattern]++\n\t\tmatched = true\n\t}\n\n\treturn matched\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_paths_test.go",
    "content": "package processors\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestExclusionPaths_Process(t *testing.T) {\n\tlogger := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\tlogger.SetLevel(logutils.LogLevelDebug)\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tcfg      *config.LinterExclusions\n\t\tissues   []*result.Issue\n\t\texpected []*result.Issue\n\t}{\n\t\t{\n\t\t\tdesc: \"paths: word\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPaths: []string{\"foo\"},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: \"foo.go\"},\n\t\t\t\t{RelativePath: \"foo/foo.go\"},\n\t\t\t\t{RelativePath: \"foo/bar.go\"},\n\t\t\t\t{RelativePath: \"bar/foo.go\"},\n\t\t\t\t{RelativePath: \"bar/bar.go\"},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: \"bar/bar.go\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"paths: begin with word\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPaths: []string{\"^foo\"},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"foo/foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"foo/bar.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/bar.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/bar.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"paths: directory begin with word\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPaths: []string{\"^foo/\"},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"foo/foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"foo/bar.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/bar.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/foo.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"bar/bar.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"paths: same suffix with unconstrained expression\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPaths: []string{\"c/d.go\"},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"a/b/c/d.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"c/d.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{},\n\t\t},\n\t\t{\n\t\t\tdesc: \"paths: same suffix with constrained expression\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPaths: []string{\"^c/d.go\"},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"a/b/c/d.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"c/d.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"a/b/c/d.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"paths: unused\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tWarnUnused: true,\n\t\t\t\tPaths: []string{\n\t\t\t\t\t`^z/d.go`, // This pattern is unused.\n\t\t\t\t\t`^c/d.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"a/b/c/d.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"c/d.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"a/b/c/d.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"pathsExcept\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPathsExcept: []string{`^base/c/.*$`},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/d/file.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"pathsExcept: unused\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tWarnUnused: true,\n\t\t\t\tPathsExcept: []string{\n\t\t\t\t\t`^base/z/.*$`, // This pattern is unused.\n\t\t\t\t\t`^base/c/.*$`,\n\t\t\t\t},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/d/file.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"pathsExcept: multiple patterns\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPathsExcept: []string{\n\t\t\t\t\t`^base/e/.*$`,\n\t\t\t\t\t`^base/c/.*$`,\n\t\t\t\t},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/d/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/e/file.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/e/file.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"pathsExcept and paths (disjoint)\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPaths:       []string{\"^base/b/\"},\n\t\t\t\tPathsExcept: []string{`^base/c/.*$`},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/d/file.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"pathsExcept and paths (intersection)\",\n\t\t\tcfg: &config.LinterExclusions{\n\t\t\t\tPaths:       []string{\"^base/c/a/\"},\n\t\t\t\tPathsExcept: []string{`^base/c/.*$`},\n\t\t\t},\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/a/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/d/file.go\")},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/file.go\")},\n\t\t\t\t{RelativePath: filepath.FromSlash(\"base/c/b/file.go\")},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tp, err := NewExclusionPaths(logger, test.cfg)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tprocessedIssues := process(t, p, test.issues...)\n\n\t\t\tassert.Equal(t, test.expected, processedIssues)\n\n\t\t\tp.Finish()\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_presets.go",
    "content": "package processors\n\nimport \"github.com/golangci/golangci-lint/v2/pkg/config\"\n\nvar LinterExclusionPresets = map[string][]config.ExcludeRule{\n\tconfig.ExclusionPresetComments: {\n\t\t{\n\t\t\t// Annoying issue about not having a comment. The rare codebase has such comments.\n\t\t\t// CheckPackageComment, CheckExportedFunctionDocs, CheckExportedTypeDocs, CheckExportedVarDocs\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"(ST1000|ST1020|ST1021|ST1022)\",\n\t\t\t\tLinters:           []string{\"staticcheck\"},\n\t\t\t\tInternalReference: \"EXC0011\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Annoying issue about not having a comment. The rare codebase has such comments.\n\t\t\t// rule: exported\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              `exported (.+) should have comment( \\(or a comment on this block\\))? or be unexported`,\n\t\t\t\tLinters:           []string{\"revive\"},\n\t\t\t\tInternalReference: \"EXC0012\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Annoying issue about not having a comment. The rare codebase has such comments.\n\t\t\t// rule: package-comments\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              `package comment should be of the form \"(.+)...\"`,\n\t\t\t\tLinters:           []string{\"revive\"},\n\t\t\t\tInternalReference: \"EXC0013\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Annoying issue about not having a comment. The rare codebase has such comments.\n\t\t\t// rule: exported\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              `comment on exported (.+) should be of the form \"(.+)...\"`,\n\t\t\t\tLinters:           []string{\"revive\"},\n\t\t\t\tInternalReference: \"EXC0014\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Annoying issue about not having a comment. The rare codebase has such comments.\n\t\t\t// rule: package-comments\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              `should have a package comment`,\n\t\t\t\tLinters:           []string{\"revive\"},\n\t\t\t\tInternalReference: \"EXC0015\",\n\t\t\t},\n\t\t},\n\t},\n\tconfig.ExclusionPresetStdErrorHandling: {\n\t\t{\n\t\t\t// Almost all programs ignore errors on these functions and in most cases it's ok.\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText: \"(?i)Error return value of .((os\\\\.)?std(out|err)\\\\..*|.*Close\" +\n\t\t\t\t\t\"|.*Flush|os\\\\.Remove(All)?|.*print(f|ln)?|os\\\\.(Un)?Setenv). is not checked\",\n\t\t\t\tLinters:           []string{\"errcheck\"},\n\t\t\t\tInternalReference: \"EXC0001\",\n\t\t\t},\n\t\t},\n\t},\n\tconfig.ExclusionPresetCommonFalsePositives: {\n\t\t{\n\t\t\t// Too many false-positives on 'unsafe' usage.\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"G103: Use of unsafe calls should be audited\",\n\t\t\t\tLinters:           []string{\"gosec\"},\n\t\t\t\tInternalReference: \"EXC0006\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Too many false-positives for parametrized shell calls.\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"G204: Subprocess launched with variable\",\n\t\t\t\tLinters:           []string{\"gosec\"},\n\t\t\t\tInternalReference: \"EXC0007\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// False positive is triggered by 'src, err := ioutil.ReadFile(filename)'.\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"G304: Potential file inclusion via variable\",\n\t\t\t\tLinters:           []string{\"gosec\"},\n\t\t\t\tInternalReference: \"EXC0010\",\n\t\t\t},\n\t\t},\n\t},\n\tconfig.ExclusionPresetLegacy: {\n\t\t{\n\t\t\t// Common false positives.\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"(possible misuse of unsafe.Pointer|should have signature)\",\n\t\t\t\tLinters:           []string{\"govet\"},\n\t\t\t\tInternalReference: \"EXC0004\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Developers tend to write in C-style with an explicit 'break' in a 'switch', so it's ok to ignore.\n\t\t\t// CheckScopedBreak\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"SA4011\",\n\t\t\t\tLinters:           []string{\"staticcheck\"},\n\t\t\t\tInternalReference: \"EXC0005\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Duplicated errcheck checks.\n\t\t\t// Errors unhandled.\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"G104\",\n\t\t\t\tLinters:           []string{\"gosec\"},\n\t\t\t\tInternalReference: \"EXC0008\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Too many issues in popular repos.\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:              \"(G301|G302|G307): Expect (directory permissions to be 0750|file permissions to be 0600) or less\",\n\t\t\t\tLinters:           []string{\"gosec\"},\n\t\t\t\tInternalReference: \"EXC0009\",\n\t\t\t},\n\t\t},\n\t},\n}\n\nfunc getLinterExclusionPresets(names []string) []config.ExcludeRule {\n\tvar rules []config.ExcludeRule\n\n\tfor _, name := range names {\n\t\tif p, ok := LinterExclusionPresets[name]; ok {\n\t\t\trules = append(rules, p...)\n\t\t}\n\t}\n\n\treturn rules\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_rules.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*ExclusionRules)(nil)\n\ntype ExclusionRules struct {\n\tlog logutils.Log\n\n\tlines *fsutils.LineCache\n\n\twarnUnused     bool\n\tskippedCounter map[string]int\n\n\trules []excludeRule\n}\n\nfunc NewExclusionRules(log logutils.Log, lines *fsutils.LineCache, cfg *config.LinterExclusions) *ExclusionRules {\n\tp := &ExclusionRules{\n\t\tlog:            log,\n\t\tlines:          lines,\n\t\twarnUnused:     cfg.WarnUnused,\n\t\tskippedCounter: map[string]int{},\n\t}\n\n\texcludeRules := slices.Concat(cfg.Rules, getLinterExclusionPresets(cfg.Presets))\n\n\tp.rules = parseRules(excludeRules, \"\", newExcludeRule)\n\n\tfor _, rule := range p.rules {\n\t\tif rule.internalReference == \"\" {\n\t\t\tp.skippedCounter[rule.String()] = 0\n\t\t}\n\t}\n\n\treturn p\n}\n\nfunc (*ExclusionRules) Name() string {\n\treturn \"exclusion_rules\"\n}\n\nfunc (p *ExclusionRules) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif len(p.rules) == 0 {\n\t\treturn issues, nil\n\t}\n\n\treturn filterIssues(issues, func(issue *result.Issue) bool {\n\t\tfor _, rule := range p.rules {\n\t\t\tif !rule.match(issue, p.lines, p.log) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Ignore default rules.\n\t\t\tif rule.internalReference == \"\" {\n\t\t\t\tp.skippedCounter[rule.String()]++\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}), nil\n}\n\nfunc (p *ExclusionRules) Finish() {\n\tfor rule, count := range p.skippedCounter {\n\t\tif p.warnUnused && count == 0 {\n\t\t\tp.log.Warnf(\"Skipped %d issues by rules: [%s]\", count, rule)\n\t\t} else {\n\t\t\tp.log.Infof(\"Skipped %d issues by rules: [%s]\", count, rule)\n\t\t}\n\t}\n}\n\ntype excludeRule struct {\n\tbaseRule\n\n\t// For compatibility with exclude-use-default/include.\n\tinternalReference string `mapstructure:\"-\"`\n}\n\nfunc newExcludeRule(rule *config.ExcludeRule, prefix string) excludeRule {\n\treturn excludeRule{\n\t\tbaseRule:          newBaseRule(&rule.BaseRule, prefix),\n\t\tinternalReference: rule.InternalReference,\n\t}\n}\n\nfunc (e excludeRule) String() string {\n\tvar msg []string\n\n\tif e.text != nil && e.text.String() != \"\" {\n\t\tmsg = append(msg, fmt.Sprintf(\"Text: %q\", e.text))\n\t}\n\n\tif e.source != nil && e.source.String() != \"\" {\n\t\tmsg = append(msg, fmt.Sprintf(\"Source: %q\", e.source))\n\t}\n\n\tif e.path != nil && e.path.String() != \"\" {\n\t\tmsg = append(msg, fmt.Sprintf(\"Path: %q\", e.path))\n\t}\n\n\tif e.pathExcept != nil && e.pathExcept.String() != \"\" {\n\t\tmsg = append(msg, fmt.Sprintf(\"Path Except: %q\", e.pathExcept))\n\t}\n\n\tif len(e.linters) > 0 {\n\t\tmsg = append(msg, fmt.Sprintf(\"Linters: %q\", strings.Join(e.linters, \", \")))\n\t}\n\n\treturn strings.Join(msg, \", \")\n}\n"
  },
  {
    "path": "pkg/result/processors/exclusion_rules_test.go",
    "content": "package processors\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestExclusionRules_Process_multiple(t *testing.T) {\n\tlines := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\tcfg := &config.LinterExclusions{\n\t\tRules: []config.ExcludeRule{\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:    \"^exclude$\",\n\t\t\t\t\tLinters: []string{\"linter\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tLinters: []string{\"testlinter\"},\n\t\t\t\t\tPath:    `_test\\.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText: \"^testonly$\",\n\t\t\t\t\tPath: `_test\\.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:       \"^nontestonly$\",\n\t\t\t\t\tPathExcept: `_test\\.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tSource:  \"^//go:generate \",\n\t\t\t\t\tLinters: []string{\"lll\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tp := NewExclusionRules(nil, lines, cfg)\n\n\tcases := []issueTestCase{\n\t\t{Path: \"e.go\", Text: \"exclude\", Linter: \"linter\"},\n\t\t{Path: \"e.go\", Text: \"some\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"normal\", Linter: \"testlinter\"},\n\t\t{Path: \"e_Test.go\", Text: \"normal\", Linter: \"testlinter\"},\n\t\t{Path: \"e_test.go\", Text: \"another\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"testonly\", Linter: \"linter\"},\n\t\t{Path: \"e.go\", Text: \"nontestonly\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"nontestonly\", Linter: \"linter\"},\n\t\t{Path: filepath.FromSlash(\"testdata/exclusion_rules/exclusion_rules.go\"), Line: 3, Linter: \"lll\"},\n\t}\n\n\tvar issues []*result.Issue\n\tfor _, c := range cases {\n\t\tissues = append(issues, newIssueFromIssueTestCase(c))\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\n\tvar resultingCases []issueTestCase\n\tfor _, i := range processedIssues {\n\t\tresultingCases = append(resultingCases, issueTestCase{\n\t\t\tPath:   i.FilePath(),\n\t\t\tLinter: i.FromLinter,\n\t\t\tText:   i.Text,\n\t\t\tLine:   i.Line(),\n\t\t})\n\t}\n\n\texpectedCases := []issueTestCase{\n\t\t{Path: \"e.go\", Text: \"some\", Linter: \"linter\"},\n\t\t{Path: \"e_Test.go\", Text: \"normal\", Linter: \"testlinter\"},\n\t\t{Path: \"e_test.go\", Text: \"another\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"nontestonly\", Linter: \"linter\"},\n\t}\n\n\tassert.Equal(t, expectedCases, resultingCases)\n}\n\nfunc TestExclusionRules_Process_text(t *testing.T) {\n\tlines := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\tcfg := &config.LinterExclusions{\n\t\tRules: []config.ExcludeRule{{\n\t\t\tBaseRule: config.BaseRule{\n\t\t\t\tText:    \"^exclude$\",\n\t\t\t\tLinters: []string{\"linter\"},\n\t\t\t},\n\t\t}},\n\t}\n\n\tp := NewExclusionRules(nil, lines, cfg)\n\n\ttexts := []string{\"exclude\", \"1\", \"\", \"exclud\", \"notexclude\"}\n\tvar issues []*result.Issue\n\tfor _, t := range texts {\n\t\tissues = append(issues, &result.Issue{\n\t\t\tText:       t,\n\t\t\tFromLinter: \"linter\",\n\t\t})\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\tassert.Len(t, processedIssues, len(issues)-1)\n\n\tvar processedTexts []string\n\tfor _, i := range processedIssues {\n\t\tprocessedTexts = append(processedTexts, i.Text)\n\t}\n\n\tassert.Equal(t, texts[1:], processedTexts)\n}\n\nfunc TestExclusionRules_Process_empty(t *testing.T) {\n\tlines := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\tp := NewExclusionRules(nil, lines, &config.LinterExclusions{})\n\n\tprocessAssertSame(t, p, newIssueFromTextTestCase(\"test\"))\n}\n\nfunc TestExclusionRules_Process_caseSensitive_multiple(t *testing.T) {\n\tlines := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\tcfg := &config.LinterExclusions{\n\t\tRules: []config.ExcludeRule{\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:    \"^exclude$\",\n\t\t\t\t\tLinters: []string{\"linter\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tLinters: []string{\"testlinter\"},\n\t\t\t\t\tPath:    `_test\\.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText: \"^testonly$\",\n\t\t\t\t\tPath: `_test\\.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tSource:  \"^//go:generate \",\n\t\t\t\t\tLinters: []string{\"lll\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tp := NewExclusionRules(nil, lines, cfg)\n\n\tcases := []issueTestCase{\n\t\t{Path: \"e.go\", Text: \"exclude\", Linter: \"linter\"},\n\t\t{Path: \"e.go\", Text: \"excLude\", Linter: \"linter\"},\n\t\t{Path: \"e.go\", Text: \"some\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"normal\", Linter: \"testlinter\"},\n\t\t{Path: \"e_Test.go\", Text: \"normal\", Linter: \"testlinter\"},\n\t\t{Path: \"e_test.go\", Text: \"another\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"testonly\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"testOnly\", Linter: \"linter\"},\n\t\t{Path: filepath.FromSlash(\"testdata/exclusion_rules/case_sensitive.go\"), Line: 3, Linter: \"lll\"},\n\t}\n\n\tvar issues []*result.Issue\n\tfor _, c := range cases {\n\t\tissues = append(issues, newIssueFromIssueTestCase(c))\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\n\tvar resultingCases []issueTestCase\n\tfor _, i := range processedIssues {\n\t\tresultingCases = append(resultingCases, issueTestCase{\n\t\t\tPath:   i.FilePath(),\n\t\t\tLinter: i.FromLinter,\n\t\t\tText:   i.Text,\n\t\t\tLine:   i.Line(),\n\t\t})\n\t}\n\n\texpectedCases := []issueTestCase{\n\t\t{Path: \"e.go\", Text: \"excLude\", Linter: \"linter\"},\n\t\t{Path: \"e.go\", Text: \"some\", Linter: \"linter\"},\n\t\t{Path: \"e_Test.go\", Text: \"normal\", Linter: \"testlinter\"},\n\t\t{Path: \"e_test.go\", Text: \"another\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"testOnly\", Linter: \"linter\"},\n\t\t{Path: filepath.FromSlash(\"testdata/exclusion_rules/case_sensitive.go\"), Line: 3, Linter: \"lll\"},\n\t}\n\n\tassert.Equal(t, expectedCases, resultingCases)\n}\n\nfunc TestExclusionRules_Process_caseSensitive_text(t *testing.T) {\n\tlines := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\tcfg := &config.LinterExclusions{\n\t\tRules: []config.ExcludeRule{\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:    \"^exclude$\",\n\t\t\t\t\tLinters: []string{\"linter\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tp := NewExclusionRules(nil, lines, cfg)\n\n\ttexts := []string{\"exclude\", \"excLude\", \"1\", \"\", \"exclud\", \"notexclude\"}\n\n\tvar issues []*result.Issue\n\tfor _, t := range texts {\n\t\tissues = append(issues, &result.Issue{\n\t\t\tText:       t,\n\t\t\tFromLinter: \"linter\",\n\t\t})\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\tassert.Len(t, processedIssues, len(issues)-1)\n\n\tvar processedTexts []string\n\tfor _, i := range processedIssues {\n\t\tprocessedTexts = append(processedTexts, i.Text)\n\t}\n\n\tassert.Equal(t, texts[1:], processedTexts)\n}\n\nfunc TestExclusionRules_Process_caseSensitive_empty(t *testing.T) {\n\tlines := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\tp := NewExclusionRules(nil, lines, &config.LinterExclusions{})\n\n\tprocessAssertSame(t, p, newIssueFromTextTestCase(\"test\"))\n}\n"
  },
  {
    "path": "pkg/result/processors/filename_unadjuster.go",
    "content": "package processors\n\nimport (\n\t\"go/parser\"\n\t\"go/token\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"golang.org/x/tools/go/packages\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*FilenameUnadjuster)(nil)\n\ntype posMapper func(pos token.Position) token.Position\n\ntype adjustMap struct {\n\tsync.Mutex\n\tm map[string]posMapper\n}\n\n// FilenameUnadjuster fixes filename based on adjusted and unadjusted position (related to line directives and cgo).\n//\n// A lot of linters use `fset.Position(f.Pos())` to get filename,\n// and they return adjusted filename (e.g.` *.qtpl`) for an issue.\n// We need restore real `.go` filename to properly output it, parse it, etc.\n//\n// Require absolute file path.\ntype FilenameUnadjuster struct {\n\tm                   map[string]posMapper // map from adjusted filename to position mapper: adjusted -> unadjusted position\n\tlog                 logutils.Log\n\tloggedUnadjustments map[string]bool\n}\n\nfunc NewFilenameUnadjuster(pkgs []*packages.Package, log logutils.Log) *FilenameUnadjuster {\n\tm := adjustMap{m: map[string]posMapper{}}\n\n\tstartedAt := time.Now()\n\n\tvar wg sync.WaitGroup\n\n\tfor chunk := range slices.Chunk(pkgs, len(pkgs)/2000+1) {\n\t\twg.Go(func() {\n\t\t\tfor _, pkg := range chunk {\n\t\t\t\t// It's important to call func here to run GC\n\t\t\t\tprocessUnadjusterPkg(&m, pkg, log)\n\t\t\t}\n\t\t})\n\t}\n\n\twg.Wait()\n\n\tlog.Infof(\"Pre-built %d adjustments in %s\", len(m.m), time.Since(startedAt))\n\n\treturn &FilenameUnadjuster{\n\t\tm:                   m.m,\n\t\tlog:                 log,\n\t\tloggedUnadjustments: map[string]bool{},\n\t}\n}\n\nfunc (*FilenameUnadjuster) Name() string {\n\treturn \"filename_unadjuster\"\n}\n\nfunc (p *FilenameUnadjuster) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\treturn transformIssues(issues, func(issue *result.Issue) *result.Issue {\n\t\tmapper := p.m[issue.FilePath()]\n\t\tif mapper == nil {\n\t\t\treturn issue\n\t\t}\n\n\t\tnewIssue := *issue\n\t\tnewIssue.Pos = mapper(issue.Pos)\n\t\tif !p.loggedUnadjustments[issue.Pos.Filename] {\n\t\t\tp.log.Infof(\"Unadjusted from %v to %v\", issue.Pos, newIssue.Pos)\n\t\t\tp.loggedUnadjustments[issue.Pos.Filename] = true\n\t\t}\n\t\treturn &newIssue\n\t}), nil\n}\n\nfunc (*FilenameUnadjuster) Finish() {}\n\nfunc processUnadjusterPkg(m *adjustMap, pkg *packages.Package, log logutils.Log) {\n\tfset := token.NewFileSet() // it's more memory efficient to not store all in one fset\n\n\tfor _, filename := range pkg.CompiledGoFiles {\n\t\t// It's important to call func here to run GC\n\t\tprocessUnadjusterFile(filename, m, log, fset)\n\t}\n}\n\nfunc processUnadjusterFile(filename string, m *adjustMap, log logutils.Log, fset *token.FileSet) {\n\tsyntax, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)\n\tif err != nil {\n\t\t// Error will be reported by typecheck\n\t\treturn\n\t}\n\n\tadjustedFilename := fset.PositionFor(syntax.Pos(), true).Filename\n\tif adjustedFilename == \"\" {\n\t\treturn\n\t}\n\n\tunadjustedFilename := fset.PositionFor(syntax.Pos(), false).Filename\n\tif unadjustedFilename == \"\" || unadjustedFilename == adjustedFilename {\n\t\treturn\n\t}\n\n\tif !strings.HasSuffix(unadjustedFilename, \".go\") {\n\t\treturn // file.go -> /caches/cgo-xxx\n\t}\n\n\tm.Lock()\n\tdefer m.Unlock()\n\n\tm.m[adjustedFilename] = func(adjustedPos token.Position) token.Position {\n\t\ttokenFile := fset.File(syntax.Pos())\n\t\tif tokenFile == nil {\n\t\t\tlog.Warnf(\"Failed to get token file for %s\", adjustedFilename)\n\t\t\treturn adjustedPos\n\t\t}\n\n\t\treturn fset.PositionFor(tokenFile.Pos(adjustedPos.Offset), false)\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/fixer.go",
    "content": "// Copyright 2018 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n//\n// This file is inspired by go/analysis/internal/checker/checker.go\n\npackage processors\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"maps\"\n\t\"os\"\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/internal/x/tools/diff\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gci\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofmt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofumpt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/goimports\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/golines\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/swaggo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/timeutils\"\n)\n\nvar _ Processor = (*Fixer)(nil)\n\nconst filePerm = 0644\n\n// Fixer fixes reports if possible.\n// The reports that are not fixed are passed to the next processor.\ntype Fixer struct {\n\tcfg       *config.Config\n\tlog       logutils.Log\n\tfileCache *fsutils.FileCache\n\tsw        *timeutils.Stopwatch\n\tformatter *goformatters.MetaFormatter\n}\n\nfunc NewFixer(cfg *config.Config, log logutils.Log, fileCache *fsutils.FileCache, formatter *goformatters.MetaFormatter) *Fixer {\n\treturn &Fixer{\n\t\tcfg:       cfg,\n\t\tlog:       log,\n\t\tfileCache: fileCache,\n\t\tsw:        timeutils.NewStopwatch(\"fixer\", log),\n\t\tformatter: formatter,\n\t}\n}\n\nfunc (Fixer) Name() string {\n\treturn \"fixer\"\n}\n\nfunc (p Fixer) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif !p.cfg.Issues.NeedFix {\n\t\treturn issues, nil\n\t}\n\n\tp.log.Infof(\"Applying suggested fixes\")\n\n\tnotFixableIssues, err := timeutils.TrackStage(p.sw, \"all\", func() ([]*result.Issue, error) {\n\t\treturn p.process(issues)\n\t})\n\tif err != nil {\n\t\tp.log.Warnf(\"Failed to fix issues: %v\", err)\n\t}\n\n\tp.printStat()\n\n\treturn notFixableIssues, nil\n}\n\n//nolint:funlen,gocyclo // This function should not be split.\nfunc (p Fixer) process(issues []*result.Issue) ([]*result.Issue, error) {\n\t// filenames / linters / edits\n\teditsByLinter := make(map[string]map[string][]diff.Edit)\n\n\tformatters := []string{gofumpt.Name, goimports.Name, gofmt.Name, gci.Name, golines.Name, swaggo.Name}\n\n\tvar notFixableIssues []*result.Issue\n\n\ttoBeFormattedFiles := make(map[string]struct{})\n\n\tfor i := range issues {\n\t\tissue := issues[i]\n\n\t\tif slices.Contains(formatters, issue.FromLinter) {\n\t\t\ttoBeFormattedFiles[issue.FilePath()] = struct{}{}\n\t\t\tcontinue\n\t\t}\n\n\t\tif issue.SuggestedFixes == nil || skipNoTextEdit(issue) {\n\t\t\tnotFixableIssues = append(notFixableIssues, issue)\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, sf := range issue.SuggestedFixes {\n\t\t\tfor _, edit := range sf.TextEdits {\n\t\t\t\tstart, end := edit.Pos, edit.End\n\t\t\t\tif start > end {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%q suggests invalid fix: pos (%v) > end (%v)\",\n\t\t\t\t\t\tissue.FromLinter, edit.Pos, edit.End)\n\t\t\t\t}\n\n\t\t\t\tedit := diff.Edit{\n\t\t\t\t\tStart: int(start),\n\t\t\t\t\tEnd:   int(end),\n\t\t\t\t\tNew:   string(edit.NewText),\n\t\t\t\t}\n\n\t\t\t\tif _, ok := editsByLinter[issue.FilePath()]; !ok {\n\t\t\t\t\teditsByLinter[issue.FilePath()] = make(map[string][]diff.Edit)\n\t\t\t\t}\n\n\t\t\t\teditsByLinter[issue.FilePath()][issue.FromLinter] = append(editsByLinter[issue.FilePath()][issue.FromLinter], edit)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate and group the edits to each actual file.\n\teditsByPath := make(map[string][]diff.Edit)\n\tfor path, linterToEdits := range editsByLinter {\n\t\texcludedLinters := make(map[string]struct{})\n\n\t\tlinters := slices.Collect(maps.Keys(linterToEdits))\n\n\t\t// Does any linter create conflicting edits?\n\t\tfor _, linter := range linters {\n\t\t\tedits := linterToEdits[linter]\n\t\t\tif _, invalid := validateEdits(edits); invalid > 0 {\n\t\t\t\tname, x, y := linter, edits[invalid-1], edits[invalid]\n\t\t\t\texcludedLinters[name] = struct{}{}\n\n\t\t\t\terr := diff3Conflict(path, name, name, []diff.Edit{x}, []diff.Edit{y})\n\t\t\t\t// TODO(ldez) TUI?\n\t\t\t\tp.log.Warnf(\"Changes related to %q are skipped for the file %q: %v\",\n\t\t\t\t\tname, path, err)\n\t\t\t}\n\t\t}\n\n\t\t// Does any pair of different linters create edits that conflict?\n\t\tfor j := range linters {\n\t\t\tfor k := range linters[:j] {\n\t\t\t\tx, y := linters[j], linters[k]\n\t\t\t\tif x > y {\n\t\t\t\t\tx, y = y, x\n\t\t\t\t}\n\n\t\t\t\t_, foundX := excludedLinters[x]\n\t\t\t\t_, foundY := excludedLinters[y]\n\t\t\t\tif foundX || foundY {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\txedits, yedits := linterToEdits[x], linterToEdits[y]\n\n\t\t\t\tcombined := slices.Concat(xedits, yedits)\n\n\t\t\t\tif _, invalid := validateEdits(combined); invalid > 0 {\n\t\t\t\t\texcludedLinters[x] = struct{}{}\n\t\t\t\t\tp.log.Warnf(\"Changes related to %q are skipped for the file %q due to conflicts with %q.\", x, path, y)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar edits []diff.Edit\n\t\tfor linter := range linterToEdits {\n\t\t\tif _, found := excludedLinters[linter]; !found {\n\t\t\t\tedits = append(edits, linterToEdits[linter]...)\n\t\t\t}\n\t\t}\n\n\t\teditsByPath[path], _ = validateEdits(edits) // remove duplicates. already validated.\n\t}\n\n\tvar editError error\n\n\tvar formattedFiles []string\n\n\t// Now we've got a set of valid edits for each file. Apply them.\n\tfor path, edits := range editsByPath {\n\t\tcontents, err := p.fileCache.GetFileBytes(path)\n\t\tif err != nil {\n\t\t\teditError = errors.Join(editError, fmt.Errorf(\"%s: %w\", path, err))\n\t\t\tcontinue\n\t\t}\n\n\t\tout, err := diff.ApplyBytes(contents, edits)\n\t\tif err != nil {\n\t\t\teditError = errors.Join(editError, fmt.Errorf(\"%s: %w\", path, err))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Try to format the file.\n\t\tout = p.formatter.Format(path, out)\n\n\t\tif err := os.WriteFile(path, out, filePerm); err != nil {\n\t\t\teditError = errors.Join(editError, fmt.Errorf(\"%s: %w\", path, err))\n\t\t\tcontinue\n\t\t}\n\n\t\tformattedFiles = append(formattedFiles, path)\n\t}\n\n\tfor path := range toBeFormattedFiles {\n\t\t// Skips files already formatted by the previous fix step.\n\t\tif !slices.Contains(formattedFiles, path) {\n\t\t\tcontent, err := p.fileCache.GetFileBytes(path)\n\t\t\tif err != nil {\n\t\t\t\tp.log.Warnf(\"Error reading file %s: %v\", path, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout := p.formatter.Format(path, content)\n\n\t\t\tif err := os.WriteFile(path, out, filePerm); err != nil {\n\t\t\t\teditError = errors.Join(editError, fmt.Errorf(\"%s: %w\", path, err))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n\n\treturn notFixableIssues, editError\n}\n\nfunc (Fixer) Finish() {}\n\nfunc (p Fixer) printStat() {\n\tp.sw.PrintStages()\n}\n\nfunc skipNoTextEdit(issue *result.Issue) bool {\n\tvar onlyMessage int\n\tfor _, sf := range issue.SuggestedFixes {\n\t\tif len(sf.TextEdits) == 0 {\n\t\t\tonlyMessage++\n\t\t}\n\t}\n\n\treturn len(issue.SuggestedFixes) == onlyMessage\n}\n\n// validateEdits returns a list of edits that is sorted and\n// contains no duplicate edits. Returns the index of some\n// overlapping adjacent edits if there is one and <0 if the\n// edits are valid.\n//\n//nolint:gocritic // Copy of go/analysis/internal/checker/checker.go\nfunc validateEdits(edits []diff.Edit) ([]diff.Edit, int) {\n\tif len(edits) == 0 {\n\t\treturn nil, -1\n\t}\n\n\tequivalent := func(x, y diff.Edit) bool {\n\t\treturn x.Start == y.Start && x.End == y.End && x.New == y.New\n\t}\n\n\tdiff.SortEdits(edits)\n\n\tunique := []diff.Edit{edits[0]}\n\n\tinvalid := -1\n\n\tfor i := 1; i < len(edits); i++ {\n\t\tprev, cur := edits[i-1], edits[i]\n\t\t// We skip over equivalent edits without considering them\n\t\t// an error. This handles identical edits coming from the\n\t\t// multiple ways of loading a package into a\n\t\t// *go/packages.Packages for testing, e.g. packages \"p\" and \"p [p.test]\".\n\t\tif !equivalent(prev, cur) {\n\t\t\tunique = append(unique, cur)\n\t\t\tif prev.End > cur.Start {\n\t\t\t\tinvalid = i\n\t\t\t}\n\t\t}\n\t}\n\treturn unique, invalid\n}\n\n// diff3Conflict returns an error describing two conflicting sets of\n// edits on a file at path.\n// Copy of go/analysis/internal/checker/checker.go\nfunc diff3Conflict(path, xlabel, ylabel string, xedits, yedits []diff.Edit) error {\n\tcontents, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\toldlabel, old := \"base\", string(contents)\n\n\txdiff, err := diff.ToUnified(oldlabel, xlabel, old, xedits, diff.DefaultContextLines)\n\tif err != nil {\n\t\treturn err\n\t}\n\tydiff, err := diff.ToUnified(oldlabel, ylabel, old, yedits, diff.DefaultContextLines)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn fmt.Errorf(\"conflicting edits from %s and %s on %s\\nfirst edits:\\n%s\\nsecond edits:\\n%s\",\n\t\txlabel, ylabel, path, xdiff, ydiff)\n}\n"
  },
  {
    "path": "pkg/result/processors/invalid_issue.go",
    "content": "package processors\n\nimport (\n\t\"path/filepath\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*InvalidIssue)(nil)\n\n// InvalidIssue filters invalid reports.\n//   - non-go files (except `go.mod`)\n//   - reports without file path\ntype InvalidIssue struct {\n\tlog logutils.Log\n}\n\nfunc NewInvalidIssue(log logutils.Log) *InvalidIssue {\n\treturn &InvalidIssue{log: log}\n}\n\nfunc (InvalidIssue) Name() string {\n\treturn \"invalid_issue\"\n}\n\nfunc (p InvalidIssue) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\ttcIssues := filterIssuesUnsafe(issues, func(issue *result.Issue) bool {\n\t\treturn issue.FromLinter == typeCheckName\n\t})\n\n\tif len(tcIssues) > 0 {\n\t\treturn tcIssues, nil\n\t}\n\n\treturn filterIssuesErr(issues, p.shouldPassIssue)\n}\n\nfunc (InvalidIssue) Finish() {}\n\nfunc (p InvalidIssue) shouldPassIssue(issue *result.Issue) (bool, error) {\n\tif issue.FilePath() == \"\" {\n\t\tp.log.Warnf(\"no file path for the issue: probably a bug inside the linter %q: %#v\", issue.FromLinter, issue)\n\n\t\treturn false, nil\n\t}\n\n\tif filepath.Base(issue.FilePath()) == \"go.mod\" {\n\t\treturn true, nil\n\t}\n\n\tif !isGoFile(issue.FilePath()) {\n\t\tp.log.Infof(\"issue related to file %s is skipped\", issue.FilePath())\n\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n\nfunc isGoFile(name string) bool {\n\treturn filepath.Ext(name) == \".go\"\n}\n"
  },
  {
    "path": "pkg/result/processors/invalid_issue_test.go",
    "content": "package processors\n\nimport (\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestInvalidIssue_Process(t *testing.T) {\n\tlogger := logutils.NewStderrLog(logutils.DebugKeyInvalidIssue)\n\tlogger.SetLevel(logutils.LogLevelDebug)\n\n\tp := NewInvalidIssue(logger)\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tissues   []*result.Issue\n\t\texpected []*result.Issue\n\t}{\n\t\t{\n\t\t\tdesc: \"typecheck\",\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{FromLinter: \"typecheck\"},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{FromLinter: \"typecheck\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"keep only typecheck issues if any exist\",\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{FromLinter: \"typecheck\"},\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"example\",\n\t\t\t\t\tPos: token.Position{\n\t\t\t\t\t\tFilename: \"test.go\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{FromLinter: \"typecheck\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"Go file\",\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"example\",\n\t\t\t\t\tPos: token.Position{\n\t\t\t\t\t\tFilename: \"test.go\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"example\",\n\t\t\t\t\tPos: token.Position{\n\t\t\t\t\t\tFilename: \"test.go\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"go.mod\",\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"example\",\n\t\t\t\t\tPos: token.Position{\n\t\t\t\t\t\tFilename: \"go.mod\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"example\",\n\t\t\t\t\tPos: token.Position{\n\t\t\t\t\t\tFilename: \"go.mod\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"non Go file\",\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"example\",\n\t\t\t\t\tPos: token.Position{\n\t\t\t\t\t\tFilename: \"test.txt\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []*result.Issue{},\n\t\t},\n\t\t{\n\t\t\tdesc: \"no filename\",\n\t\t\tissues: []*result.Issue{\n\t\t\t\t{\n\t\t\t\t\tFromLinter: \"example\",\n\t\t\t\t\tPos: token.Position{\n\t\t\t\t\t\tFilename: \"\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []*result.Issue{},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tafter, err := p.Process(test.issues)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, after)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/issues.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc filterIssues(issues []*result.Issue, filter func(issue *result.Issue) bool) []*result.Issue {\n\tretIssues := make([]*result.Issue, 0, len(issues))\n\tfor _, issue := range issues {\n\t\tif issue.FromLinter == typeCheckName {\n\t\t\t// don't hide typechecking errors in generated files: users expect to see why the project isn't compiling\n\t\t\tretIssues = append(retIssues, issue)\n\t\t\tcontinue\n\t\t}\n\n\t\tif filter(issue) {\n\t\t\tretIssues = append(retIssues, issue)\n\t\t}\n\t}\n\n\treturn retIssues\n}\n\nfunc filterIssuesUnsafe(issues []*result.Issue, filter func(issue *result.Issue) bool) []*result.Issue {\n\tretIssues := make([]*result.Issue, 0, len(issues))\n\tfor _, issue := range issues {\n\t\tif filter(issue) {\n\t\t\tretIssues = append(retIssues, issue)\n\t\t}\n\t}\n\n\treturn retIssues\n}\n\nfunc filterIssuesErr(issues []*result.Issue, filter func(issue *result.Issue) (bool, error)) ([]*result.Issue, error) {\n\tretIssues := make([]*result.Issue, 0, len(issues))\n\tfor _, issue := range issues {\n\t\tif issue.FromLinter == typeCheckName {\n\t\t\t// don't hide typechecking errors in generated files: users expect to see why the project isn't compiling\n\t\t\tretIssues = append(retIssues, issue)\n\t\t\tcontinue\n\t\t}\n\n\t\tok, err := filter(issue)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"can't filter issue %#v: %w\", issue, err)\n\t\t}\n\n\t\tif ok {\n\t\t\tretIssues = append(retIssues, issue)\n\t\t}\n\t}\n\n\treturn retIssues, nil\n}\n\nfunc transformIssues(issues []*result.Issue, transform func(issue *result.Issue) *result.Issue) []*result.Issue {\n\tretIssues := make([]*result.Issue, 0, len(issues))\n\tfor _, issue := range issues {\n\t\tnewIssue := transform(issue)\n\t\tif newIssue != nil {\n\t\t\tretIssues = append(retIssues, newIssue)\n\t\t}\n\t}\n\n\treturn retIssues\n}\n"
  },
  {
    "path": "pkg/result/processors/max_from_linter.go",
    "content": "package processors\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*MaxFromLinter)(nil)\n\n// MaxFromLinter limits the number of reports from the same linter.\ntype MaxFromLinter struct {\n\tlinterCounter map[string]int\n\tlimit         int\n\tlog           logutils.Log\n\tcfg           *config.Config\n}\n\nfunc NewMaxFromLinter(limit int, log logutils.Log, cfg *config.Config) *MaxFromLinter {\n\treturn &MaxFromLinter{\n\t\tlinterCounter: map[string]int{},\n\t\tlimit:         limit,\n\t\tlog:           log,\n\t\tcfg:           cfg,\n\t}\n}\n\nfunc (*MaxFromLinter) Name() string {\n\treturn \"max_from_linter\"\n}\n\nfunc (p *MaxFromLinter) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif p.limit <= 0 { // no limit\n\t\treturn issues, nil\n\t}\n\n\treturn filterIssuesUnsafe(issues, func(issue *result.Issue) bool {\n\t\tp.linterCounter[issue.FromLinter]++ // always inc for stat\n\n\t\treturn p.linterCounter[issue.FromLinter] <= p.limit\n\t}), nil\n}\n\nfunc (p *MaxFromLinter) Finish() {\n\twalkStringToIntMapSortedByValue(p.linterCounter, func(linter string, count int) {\n\t\tif count > p.limit {\n\t\t\tp.log.Infof(\"%d/%d issues from linter %s were hidden, use --max-issues-per-linter\",\n\t\t\t\tcount-p.limit, count, linter)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "pkg/result/processors/max_from_linter_test.go",
    "content": "package processors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nfunc TestMaxFromLinter(t *testing.T) {\n\tp := NewMaxFromLinter(1, logutils.NewStderrLog(logutils.DebugKeyEmpty), &config.Config{})\n\tgosimple := newFromLinterIssue(\"gosimple\")\n\tgofmt := newFromLinterIssue(\"gofmt\")\n\tprocessAssertSame(t, p, gosimple)  // ok\n\tprocessAssertSame(t, p, gofmt)     // ok: another\n\tprocessAssertEmpty(t, p, gosimple) // skip\n}\n"
  },
  {
    "path": "pkg/result/processors/max_per_file_from_linter.go",
    "content": "package processors\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gci\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofmt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/gofumpt\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/goimports\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/golines\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters/swaggo\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*MaxPerFileFromLinter)(nil)\n\n// MaxPerFileFromLinter limits the number of reports by file and by linter.\ntype MaxPerFileFromLinter struct {\n\tfileLinterCounter          fileLinterCounter\n\tmaxPerFileFromLinterConfig map[string]int\n}\n\nfunc NewMaxPerFileFromLinter(cfg *config.Config) *MaxPerFileFromLinter {\n\tmaxPerFileFromLinterConfig := map[string]int{}\n\n\tif !cfg.Issues.NeedFix {\n\t\t// if we don't fix we do this limiting to not annoy user;\n\t\t// otherwise we need to fix all issues in the file at once\n\t\tfor _, f := range []string{gofmt.Name, gofumpt.Name, goimports.Name, gci.Name, golines.Name, swaggo.Name} {\n\t\t\tmaxPerFileFromLinterConfig[f] = 1\n\t\t}\n\t}\n\n\treturn &MaxPerFileFromLinter{\n\t\tfileLinterCounter:          fileLinterCounter{},\n\t\tmaxPerFileFromLinterConfig: maxPerFileFromLinterConfig,\n\t}\n}\n\nfunc (*MaxPerFileFromLinter) Name() string {\n\treturn \"max_per_file_from_linter\"\n}\n\nfunc (p *MaxPerFileFromLinter) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\treturn filterIssuesUnsafe(issues, func(issue *result.Issue) bool {\n\t\tlimit := p.maxPerFileFromLinterConfig[issue.FromLinter]\n\t\tif limit == 0 {\n\t\t\treturn true\n\t\t}\n\n\t\tif p.fileLinterCounter.GetCount(issue) >= limit {\n\t\t\treturn false\n\t\t}\n\n\t\tp.fileLinterCounter.Increment(issue)\n\n\t\treturn true\n\t}), nil\n}\n\nfunc (*MaxPerFileFromLinter) Finish() {}\n\ntype fileLinterCounter map[string]map[string]int\n\nfunc (f fileLinterCounter) GetCount(issue *result.Issue) int {\n\treturn f.getCounter(issue)[issue.FromLinter]\n}\n\nfunc (f fileLinterCounter) Increment(issue *result.Issue) {\n\tf.getCounter(issue)[issue.FromLinter]++\n}\n\nfunc (f fileLinterCounter) getCounter(issue *result.Issue) map[string]int {\n\tlc := f[issue.FilePath()]\n\n\tif lc == nil {\n\t\tlc = map[string]int{}\n\t\tf[issue.FilePath()] = lc\n\t}\n\n\treturn lc\n}\n"
  },
  {
    "path": "pkg/result/processors/max_per_file_from_linter_test.go",
    "content": "package processors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc newFromLinterIssue(linterName string) *result.Issue {\n\treturn &result.Issue{\n\t\tFromLinter: linterName,\n\t}\n}\n\nfunc TestMaxPerFileFromLinterUnlimited(t *testing.T) {\n\tp := NewMaxPerFileFromLinter(&config.Config{})\n\tgosimple := newFromLinterIssue(\"gosimple\")\n\tprocessAssertSame(t, p, gosimple) // collect stat\n\tprocessAssertSame(t, p, gosimple) // check not limits\n}\n\nfunc TestMaxPerFileFromLinter(t *testing.T) {\n\tp := NewMaxPerFileFromLinter(&config.Config{})\n\tfor _, name := range []string{\"gofmt\", \"goimports\"} {\n\t\tlimited := newFromLinterIssue(name)\n\t\tgosimple := newFromLinterIssue(\"gosimple\")\n\t\tprocessAssertSame(t, p, limited)\n\t\tprocessAssertSame(t, p, gosimple)\n\t\tprocessAssertEmpty(t, p, limited)\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/max_same_issues.go",
    "content": "package processors\n\nimport (\n\t\"sort\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*MaxSameIssues)(nil)\n\n// MaxSameIssues limits the number of reports with the same text.\ntype MaxSameIssues struct {\n\ttextCounter map[string]int\n\tlimit       int\n\tlog         logutils.Log\n\tcfg         *config.Config\n}\n\nfunc NewMaxSameIssues(limit int, log logutils.Log, cfg *config.Config) *MaxSameIssues {\n\treturn &MaxSameIssues{\n\t\ttextCounter: map[string]int{},\n\t\tlimit:       limit,\n\t\tlog:         log,\n\t\tcfg:         cfg,\n\t}\n}\n\nfunc (*MaxSameIssues) Name() string {\n\treturn \"max_same_issues\"\n}\n\nfunc (p *MaxSameIssues) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif p.limit <= 0 { // no limit\n\t\treturn issues, nil\n\t}\n\n\treturn filterIssuesUnsafe(issues, func(issue *result.Issue) bool {\n\t\tp.textCounter[issue.Text]++ // always inc for stat\n\n\t\treturn p.textCounter[issue.Text] <= p.limit\n\t}), nil\n}\n\nfunc (p *MaxSameIssues) Finish() {\n\twalkStringToIntMapSortedByValue(p.textCounter, func(text string, count int) {\n\t\tif count > p.limit {\n\t\t\tp.log.Infof(\"%d/%d issues with text %q were hidden, use --max-same-issues\",\n\t\t\t\tcount-p.limit, count, text)\n\t\t}\n\t})\n}\n\ntype kv struct {\n\tKey   string\n\tValue int\n}\n\nfunc walkStringToIntMapSortedByValue(m map[string]int, walk func(k string, v int)) {\n\tvar ss []kv\n\tfor k, v := range m {\n\t\tss = append(ss, kv{\n\t\t\tKey:   k,\n\t\t\tValue: v,\n\t\t})\n\t}\n\n\tsort.Slice(ss, func(i, j int) bool {\n\t\treturn ss[i].Value > ss[j].Value\n\t})\n\n\tfor _, kv := range ss {\n\t\twalk(kv.Key, kv.Value)\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/max_same_issues_test.go",
    "content": "package processors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestMaxSameIssues(t *testing.T) {\n\tp := NewMaxSameIssues(1, logutils.NewStderrLog(logutils.DebugKeyEmpty), &config.Config{})\n\ti1 := &result.Issue{\n\t\tText: \"1\",\n\t}\n\ti2 := &result.Issue{\n\t\tText: \"2\",\n\t}\n\n\tprocessAssertSame(t, p, i1)  // ok\n\tprocessAssertSame(t, p, i2)  // ok: another\n\tprocessAssertEmpty(t, p, i1) // skip\n}\n"
  },
  {
    "path": "pkg/result/processors/nolint_filter.go",
    "content": "package processors\n\nimport (\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"maps\"\n\t\"regexp\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*NolintFilter)(nil)\n\nvar nolintDebugf = logutils.Debug(logutils.DebugKeyNolintFilter)\n\ntype ignoredRange struct {\n\tlinters                []string\n\tmatchedIssueFromLinter map[string]bool\n\tresult.Range\n\tcol           int\n\toriginalRange *ignoredRange // pre-expanded range (used to match nolintlint issues)\n}\n\nfunc (i *ignoredRange) doesMatch(issue *result.Issue) bool {\n\tif issue.Line() < i.From || issue.Line() > i.To {\n\t\treturn false\n\t}\n\n\t// only allow selective nolinting of nolintlint\n\tnolintFoundForLinter := len(i.linters) == 0 && issue.FromLinter != nolintlint.LinterName\n\n\tif slices.Contains(i.linters, issue.FromLinter) {\n\t\tnolintFoundForLinter = true\n\t}\n\n\tif nolintFoundForLinter {\n\t\treturn true\n\t}\n\n\t// handle possible unused nolint directives\n\t// nolintlint generates potential issues for every nolint directive, and they are filtered out here\n\tif issue.FromLinter == nolintlint.LinterName && issue.ExpectNoLint {\n\t\tif issue.ExpectedNoLintLinter != \"\" {\n\t\t\treturn i.matchedIssueFromLinter[issue.ExpectedNoLintLinter]\n\t\t}\n\t\treturn len(i.matchedIssueFromLinter) > 0\n\t}\n\n\treturn false\n}\n\ntype fileData struct {\n\tignoredRanges []ignoredRange\n}\n\n// NolintFilter filters and sorts reports related to `nolint` directives.\ntype NolintFilter struct {\n\tfileCache      map[string]*fileData\n\tdbManager      *lintersdb.Manager\n\tenabledLinters map[string]*linter.Config\n\tlog            logutils.Log\n\n\tunknownLintersSet map[string]bool\n\n\tpattern *regexp.Regexp\n}\n\nfunc NewNolintFilter(log logutils.Log, dbManager *lintersdb.Manager, enabledLinters map[string]*linter.Config) *NolintFilter {\n\treturn &NolintFilter{\n\t\tfileCache:         map[string]*fileData{},\n\t\tdbManager:         dbManager,\n\t\tenabledLinters:    enabledLinters,\n\t\tlog:               log,\n\t\tunknownLintersSet: map[string]bool{},\n\t\tpattern:           regexp.MustCompile(`^nolint( |:|$)`),\n\t}\n}\n\nfunc (*NolintFilter) Name() string {\n\treturn \"nolint_filter\"\n}\n\nfunc (p *NolintFilter) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\t// put nolintlint issues last because we process other issues first to determine which nolint directives are unused\n\tsort.Stable(sortWithNolintlintLast(issues))\n\treturn filterIssuesErr(issues, p.shouldPassIssue)\n}\n\nfunc (p *NolintFilter) Finish() {\n\tif len(p.unknownLintersSet) == 0 {\n\t\treturn\n\t}\n\n\tunknownLinters := slices.Sorted(maps.Keys(p.unknownLintersSet))\n\n\tp.log.Warnf(\"Found unknown linters in //nolint directives: %s\", strings.Join(unknownLinters, \", \"))\n}\n\nfunc (p *NolintFilter) shouldPassIssue(issue *result.Issue) (bool, error) {\n\tnolintDebugf(\"got issue: %v\", *issue)\n\n\t// don't expect disabled linters to cover their nolint statements\n\tif issue.FromLinter == nolintlint.LinterName && issue.ExpectNoLint && issue.ExpectedNoLintLinter != \"\" {\n\t\tnolintDebugf(\"enabled linters: %v\", p.enabledLinters)\n\n\t\tif p.enabledLinters[issue.ExpectedNoLintLinter] == nil {\n\t\t\treturn false, nil\n\t\t}\n\n\t\tnolintDebugf(\"checking that lint issue was used for %s: %v\", issue.ExpectedNoLintLinter, issue)\n\t}\n\n\tfd := p.getOrCreateFileData(issue)\n\n\tfor _, ir := range fd.ignoredRanges {\n\t\tif !ir.doesMatch(issue) {\n\t\t\tcontinue\n\t\t}\n\n\t\tnolintDebugf(\"found ignored range for issue %v: %v\", issue, ir)\n\n\t\tir.matchedIssueFromLinter[issue.FromLinter] = true\n\n\t\tif ir.originalRange != nil {\n\t\t\tir.originalRange.matchedIssueFromLinter[issue.FromLinter] = true\n\t\t}\n\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n\nfunc (p *NolintFilter) getOrCreateFileData(issue *result.Issue) *fileData {\n\tfd := p.fileCache[issue.FilePath()]\n\tif fd != nil {\n\t\treturn fd\n\t}\n\n\tfd = &fileData{}\n\tp.fileCache[issue.FilePath()] = fd\n\n\t// TODO: migrate this parsing to go/analysis facts\n\t// or cache them somehow per file.\n\n\t// Don't use cached AST because they consume a lot of memory on large projects.\n\tfset := token.NewFileSet()\n\tf, err := parser.ParseFile(fset, issue.FilePath(), nil, parser.ParseComments)\n\tif err != nil {\n\t\t// Don't report error because it's already must be reporter by typecheck or go/analysis.\n\t\treturn fd\n\t}\n\n\tfd.ignoredRanges = p.buildIgnoredRangesForFile(f, fset, issue.FilePath())\n\n\tnolintDebugf(\"file %s: built nolint ranges are %+v\", issue.FilePath(), fd.ignoredRanges)\n\n\treturn fd\n}\n\nfunc (p *NolintFilter) buildIgnoredRangesForFile(f *ast.File, fset *token.FileSet, filePath string) []ignoredRange {\n\tinlineRanges := p.extractFileCommentsInlineRanges(fset, f.Comments...)\n\tnolintDebugf(\"file %s: inline nolint ranges are %+v\", filePath, inlineRanges)\n\n\tif len(inlineRanges) == 0 {\n\t\treturn nil\n\t}\n\n\te := rangeExpander{\n\t\tfset:         fset,\n\t\tinlineRanges: inlineRanges,\n\t}\n\n\tast.Walk(&e, f)\n\n\t// TODO: merge all ranges: there are repeated ranges\n\tallRanges := slices.Concat(inlineRanges, e.expandedRanges)\n\n\treturn allRanges\n}\n\nfunc (p *NolintFilter) extractFileCommentsInlineRanges(fset *token.FileSet, comments ...*ast.CommentGroup) []ignoredRange {\n\tvar ret []ignoredRange\n\tfor _, g := range comments {\n\t\tfor _, c := range g.List {\n\t\t\tir := p.extractInlineRangeFromComment(c.Text, g, fset)\n\t\t\tif ir != nil {\n\t\t\t\tret = append(ret, *ir)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (p *NolintFilter) extractInlineRangeFromComment(text string, g ast.Node, fset *token.FileSet) *ignoredRange {\n\ttext = strings.TrimLeft(text, \"/ \")\n\tif !p.pattern.MatchString(text) {\n\t\treturn nil\n\t}\n\n\tbuildRange := func(linters []string) *ignoredRange {\n\t\tpos := fset.Position(g.Pos())\n\t\treturn &ignoredRange{\n\t\t\tRange: result.Range{\n\t\t\t\tFrom: pos.Line,\n\t\t\t\tTo:   fset.Position(g.End()).Line,\n\t\t\t},\n\t\t\tcol:                    pos.Column,\n\t\t\tlinters:                linters,\n\t\t\tmatchedIssueFromLinter: make(map[string]bool),\n\t\t}\n\t}\n\n\tif strings.HasPrefix(text, \"nolint:all\") || !strings.HasPrefix(text, \"nolint:\") {\n\t\treturn buildRange(nil) // ignore all linters\n\t}\n\n\ttext, _, _ = strings.Cut(text, \"//\") // allow another comment after this comment\n\n\t// ignore specific linters\n\tvar linters []string\n\n\tfor item := range strings.SplitSeq(strings.TrimPrefix(text, \"nolint:\"), \",\") {\n\t\tlinterName := strings.ToLower(strings.TrimSpace(item))\n\t\tif linterName == \"all\" {\n\t\t\tp.unknownLintersSet = map[string]bool{}\n\t\t\treturn buildRange(nil)\n\t\t}\n\n\t\tlcs := p.dbManager.GetLinterConfigs(linterName)\n\t\tif lcs == nil {\n\t\t\tp.unknownLintersSet[linterName] = true\n\t\t\tlinters = append(linters, linterName)\n\t\t\tnolintDebugf(\"unknown linter %s on line %d\", linterName, fset.Position(g.Pos()).Line)\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, lc := range lcs {\n\t\t\tlinters = append(linters, lc.Name()) // normalize name to work with aliases\n\t\t}\n\t}\n\n\tnolintDebugf(\"%d: linters are %s\", fset.Position(g.Pos()).Line, linters)\n\treturn buildRange(linters)\n}\n\ntype rangeExpander struct {\n\tfset           *token.FileSet\n\tinlineRanges   []ignoredRange\n\texpandedRanges []ignoredRange\n}\n\nfunc (e *rangeExpander) Visit(node ast.Node) ast.Visitor {\n\tif node == nil {\n\t\treturn e\n\t}\n\n\tnodeStartPos := e.fset.Position(node.Pos())\n\tnodeStartLine := nodeStartPos.Line\n\tnodeEndLine := e.fset.Position(node.End()).Line\n\n\tvar foundRange *ignoredRange\n\tfor _, r := range e.inlineRanges {\n\t\tif r.To == nodeStartLine-1 && nodeStartPos.Column == r.col {\n\t\t\tr := r\n\t\t\tfoundRange = &r\n\t\t\tbreak\n\t\t}\n\t}\n\tif foundRange == nil {\n\t\treturn e\n\t}\n\n\texpandedRange := *foundRange\n\t// store the original unexpanded range for matching nolintlint issues\n\tif expandedRange.originalRange == nil {\n\t\texpandedRange.originalRange = foundRange\n\t}\n\tif expandedRange.To < nodeEndLine {\n\t\texpandedRange.To = nodeEndLine\n\t}\n\n\tnolintDebugf(\"found range is %v for node %#v [%d;%d], expanded range is %v\",\n\t\t*foundRange, node, nodeStartLine, nodeEndLine, expandedRange)\n\te.expandedRanges = append(e.expandedRanges, expandedRange)\n\n\treturn e\n}\n\n// put nolintlint last\ntype sortWithNolintlintLast []*result.Issue\n\nfunc (issues sortWithNolintlintLast) Len() int {\n\treturn len(issues)\n}\n\nfunc (issues sortWithNolintlintLast) Less(i, j int) bool {\n\treturn issues[i].FromLinter != nolintlint.LinterName && issues[j].FromLinter == nolintlint.LinterName\n}\n\nfunc (issues sortWithNolintlintLast) Swap(i, j int) {\n\tissues[j], issues[i] = issues[i], issues[j]\n}\n"
  },
  {
    "path": "pkg/result/processors/nolint_filter_test.go",
    "content": "package processors\n\nimport (\n\t\"go/token\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/mock\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc newNolintFileIssue(line int, fromLinter string) *result.Issue {\n\treturn &result.Issue{\n\t\tPos: token.Position{\n\t\t\tFilename: filepath.FromSlash(\"testdata/nolint_filter/nolint.go\"),\n\t\t\tLine:     line,\n\t\t},\n\t\tFromLinter: fromLinter,\n\t}\n}\n\nfunc newNolint2FileIssue(line int) *result.Issue {\n\ti := newNolintFileIssue(line, \"errcheck\")\n\ti.Pos.Filename = filepath.FromSlash(\"testdata/nolint_filter/nolint2.go\")\n\treturn i\n}\n\nfunc newTestNolintFilter(log logutils.Log) *NolintFilter {\n\tdbManager, _ := lintersdb.NewManager(log, config.NewDefault(), lintersdb.NewLinterBuilder())\n\n\treturn NewNolintFilter(log, dbManager, nil)\n}\n\nfunc getMockLog() *logutils.MockLog {\n\tlog := logutils.NewMockLog()\n\tlog.On(\"Infof\", mock.Anything, mock.Anything).Maybe()\n\treturn log\n}\n\nfunc TestTestNolintFilter_Process(t *testing.T) {\n\tp := newTestNolintFilter(getMockLog())\n\tdefer p.Finish()\n\n\t// test inline comments\n\tprocessAssertEmpty(t, p, newNolintFileIssue(3, \"gofmt\"))\n\tprocessAssertEmpty(t, p, newNolintFileIssue(3, \"gofmt\")) // check cached is ok\n\tprocessAssertSame(t, p, newNolintFileIssue(3, \"gofmtA\")) // check different name\n\n\tprocessAssertEmpty(t, p, newNolintFileIssue(4, \"gofmt\"))\n\tprocessAssertSame(t, p, newNolintFileIssue(4, \"gofmtA\")) // check different name\n\n\tprocessAssertEmpty(t, p, newNolintFileIssue(5, \"gofmt\"))\n\tprocessAssertEmpty(t, p, newNolintFileIssue(5, \"govet\"))\n\tprocessAssertSame(t, p, newNolintFileIssue(5, \"gofmtA\")) // check different name\n\n\tprocessAssertEmpty(t, p, newNolintFileIssue(6, \"any\"))\n\tprocessAssertEmpty(t, p, newNolintFileIssue(7, \"any\"))\n\n\tprocessAssertSame(t, p, newNolintFileIssue(1, \"wsl\")) // no directive\n\n\t// test preceding comments\n\tprocessAssertEmpty(t, p, newNolintFileIssue(10, \"any\")) // preceding comment for var\n\tprocessAssertEmpty(t, p, newNolintFileIssue(9, \"any\"))  // preceding comment for var itself\n\n\tprocessAssertSame(t, p, newNolintFileIssue(14, \"any\"))  // preceding comment with extra \\n\n\tprocessAssertEmpty(t, p, newNolintFileIssue(12, \"any\")) // preceding comment with extra \\n itself\n\n\tprocessAssertSame(t, p, newNolintFileIssue(17, \"any\"))  // preceding comment on different column\n\tprocessAssertEmpty(t, p, newNolintFileIssue(16, \"any\")) // preceding comment on different column itself\n\n\t// preceding comment for func name and comment itself\n\tfor i := 19; i <= 23; i++ {\n\t\tprocessAssertEmpty(t, p, newNolintFileIssue(i, \"any\"))\n\t}\n\n\tprocessAssertSame(t, p, newNolintFileIssue(24, \"any\")) // right after func\n\n\t// preceding multiline comment: last line\n\tfor i := 25; i <= 30; i++ {\n\t\tprocessAssertEmpty(t, p, newNolintFileIssue(i, \"any\"))\n\t}\n\n\tprocessAssertSame(t, p, newNolintFileIssue(31, \"any\")) // between funcs\n\n\t// preceding multiline comment: first line\n\tfor i := 32; i <= 37; i++ {\n\t\tprocessAssertEmpty(t, p, newNolintFileIssue(i, \"any\"))\n\t}\n\n\tprocessAssertSame(t, p, newNolintFileIssue(38, \"any\")) // between funcs\n\n\t// preceding multiline comment: medium line\n\tfor i := 39; i <= 45; i++ {\n\t\tprocessAssertEmpty(t, p, newNolintFileIssue(i, \"any\"))\n\t}\n\n\t// check bug with transitive expanding for next and next line\n\tfor i := 1; i <= 8; i++ {\n\t\tprocessAssertSame(t, p, newNolint2FileIssue(i))\n\t}\n\tfor i := 9; i <= 10; i++ {\n\t\tprocessAssertEmpty(t, p, newNolint2FileIssue(i))\n\t}\n\n\t// check inline comment for function\n\tfor i := 11; i <= 13; i++ {\n\t\tprocessAssertSame(t, p, newNolint2FileIssue(i))\n\t}\n\tprocessAssertEmpty(t, p, newNolint2FileIssue(14))\n\tfor i := 15; i <= 18; i++ {\n\t\tprocessAssertSame(t, p, newNolint2FileIssue(i))\n\t}\n\n\t// variables block exclude\n\tfor i := 55; i <= 56; i++ {\n\t\tprocessAssertSame(t, p, newNolint2FileIssue(i))\n\t}\n}\n\nfunc TestNolintFilter_Process_invalidLinterName(t *testing.T) {\n\tfileName := filepath.FromSlash(\"testdata/nolint_filter/bad_names.go\")\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: fileName,\n\t\t\t\tLine:     10,\n\t\t\t},\n\t\t\tFromLinter: \"errcheck\",\n\t\t},\n\t\t{\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: fileName,\n\t\t\t\tLine:     13,\n\t\t\t},\n\t\t\tFromLinter: \"errcheck\",\n\t\t},\n\t\t{\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: fileName,\n\t\t\t\tLine:     22,\n\t\t\t},\n\t\t\tFromLinter: \"ineffassign\",\n\t\t},\n\t}\n\n\tlog := getMockLog()\n\tlog.On(\"Warnf\", \"Found unknown linters in //nolint directives: %s\", \"bad1, bad2\")\n\n\tp := newTestNolintFilter(log)\n\tprocessAssertEmpty(t, p, issues...)\n\tp.Finish()\n}\n\nfunc TestNolintFilter_Process_invalidLinterNameWithViolationOnTheSameLine(t *testing.T) {\n\tlog := getMockLog()\n\tlog.On(\"Warnf\", \"Found unknown linters in //nolint directives: %s\", \"foobar\")\n\tissues := []*result.Issue{\n\t\t{\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: filepath.FromSlash(\"testdata/nolint_filter/apply_to_unknown.go\"),\n\t\t\t\tLine:     4,\n\t\t\t},\n\t\t\tFromLinter: \"gofmt\",\n\t\t},\n\t}\n\n\tp := newTestNolintFilter(log)\n\tprocessedIssues, err := p.Process(issues)\n\tp.Finish()\n\n\trequire.NoError(t, err)\n\tassert.Equal(t, issues, processedIssues)\n}\n\nfunc Test_ignoredRange_doesMatch(t *testing.T) {\n\ttestcases := []struct {\n\t\tdoc      string\n\t\tissue    result.Issue\n\t\tlinters  []string\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\tdoc: \"unmatched line\",\n\t\t\tissue: result.Issue{\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tLine: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdoc: \"matched line, all linters\",\n\t\t\tissue: result.Issue{\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tLine: 5,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tdoc: \"matched line, unmatched linter\",\n\t\t\tissue: result.Issue{\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tLine: 5,\n\t\t\t\t},\n\t\t\t},\n\t\t\tlinters: []string{\"vet\"},\n\t\t},\n\t\t{\n\t\t\tdoc: \"matched line and linters\",\n\t\t\tissue: result.Issue{\n\t\t\t\tPos: token.Position{\n\t\t\t\t\tLine: 20,\n\t\t\t\t},\n\t\t\t\tFromLinter: \"vet\",\n\t\t\t},\n\t\t\tlinters:  []string{\"vet\"},\n\t\t\texpected: true,\n\t\t},\n\t}\n\n\tfor _, testcase := range testcases {\n\t\tir := ignoredRange{\n\t\t\tcol: 20,\n\t\t\tRange: result.Range{\n\t\t\t\tFrom: 5,\n\t\t\t\tTo:   20,\n\t\t\t},\n\t\t\tlinters: testcase.linters,\n\t\t}\n\n\t\tl := testcase.issue\n\t\tassert.Equal(t, testcase.expected, ir.doesMatch(&l), testcase.doc)\n\t}\n}\n\nfunc TestNolintFilter_Process_wholeFile(t *testing.T) {\n\tfileName := filepath.FromSlash(\"testdata/nolint_filter/whole_file.go\")\n\n\tp := newTestNolintFilter(getMockLog())\n\tdefer p.Finish()\n\n\tprocessAssertEmpty(t, p, &result.Issue{\n\t\tPos: token.Position{\n\t\t\tFilename: fileName,\n\t\t\tLine:     9,\n\t\t},\n\t\tFromLinter: \"errcheck\",\n\t})\n\tprocessAssertSame(t, p, &result.Issue{\n\t\tPos: token.Position{\n\t\t\tFilename: fileName,\n\t\t\tLine:     14,\n\t\t},\n\t\tFromLinter: \"govet\",\n\t})\n}\n\nfunc TestNolintFilter_Process_unused(t *testing.T) {\n\tfileName := filepath.FromSlash(\"testdata/nolint_filter/unused.go\")\n\n\tlog := getMockLog()\n\tlog.On(\"Warnf\", \"Found unknown linters in //nolint directives: %s\", \"blah\")\n\n\tcreateProcessor := func(t *testing.T, log *logutils.MockLog, enabledLinters []string) *NolintFilter {\n\t\tenabledSetLog := logutils.NewMockLog()\n\t\tenabledSetLog.On(\"Infof\", \"Active %d linters: %s\", len(enabledLinters), enabledLinters)\n\n\t\tcfg := &config.Config{Linters: config.Linters{Default: config.GroupNone, Enable: enabledLinters}}\n\n\t\tdbManager, err := lintersdb.NewManager(enabledSetLog, cfg, lintersdb.NewLinterBuilder())\n\t\trequire.NoError(t, err)\n\n\t\tenabledLintersMap, err := dbManager.GetEnabledLintersMap()\n\t\trequire.NoError(t, err)\n\n\t\treturn NewNolintFilter(log, dbManager, enabledLintersMap)\n\t}\n\n\t// the issue below is the nolintlint issue that would be generated for the test file\n\tnolintlintIssueMisspell := &result.Issue{\n\t\tPos: token.Position{\n\t\t\tFilename: fileName,\n\t\t\tLine:     3,\n\t\t},\n\t\tFromLinter:           nolintlint.LinterName,\n\t\tExpectNoLint:         true,\n\t\tExpectedNoLintLinter: \"misspell\",\n\t}\n\n\t// the issue below is another nolintlint issue that would be generated for the test file\n\tnolintlintIssueMisspellUnusedOK := &result.Issue{\n\t\tPos: token.Position{\n\t\t\tFilename: fileName,\n\t\t\tLine:     5,\n\t\t},\n\t\tFromLinter:           nolintlint.LinterName,\n\t\tExpectNoLint:         true,\n\t\tExpectedNoLintLinter: \"misspell\",\n\t}\n\n\tt.Run(\"when an issue does not occur, it is not removed from the nolintlint issues\", func(t *testing.T) {\n\t\tp := createProcessor(t, log, []string{\"misspell\", \"nolintlint\"})\n\t\tdefer p.Finish()\n\n\t\tprocessAssertSame(t, p, nolintlintIssueMisspell)\n\t})\n\n\tt.Run(\"when an issue does not occur but nolintlint is nolinted, it is removed from the nolintlint issues\", func(t *testing.T) {\n\t\tp := createProcessor(t, log, []string{\"misspell\", \"nolintlint\"})\n\t\tdefer p.Finish()\n\n\t\tprocessAssertEmpty(t, p, nolintlintIssueMisspellUnusedOK)\n\t})\n\n\tt.Run(\"when an issue occurs, it is removed from the nolintlint issues\", func(t *testing.T) {\n\t\tp := createProcessor(t, log, []string{\"misspell\", \"nolintlint\"})\n\t\tdefer p.Finish()\n\n\t\tprocessAssertEmpty(t, p, []*result.Issue{{\n\t\t\tPos: token.Position{\n\t\t\t\tFilename: fileName,\n\t\t\t\tLine:     3,\n\t\t\t},\n\t\t\tFromLinter: \"misspell\",\n\t\t}, nolintlintIssueMisspell}...)\n\t})\n\n\tt.Run(\"when a linter is not enabled, it is removed from the nolintlint unused issues\", func(t *testing.T) {\n\t\tenabledSetLog := logutils.NewMockLog()\n\t\tenabledSetLog.On(\"Infof\", \"Active %d linters: %s\", 1, []string{\"nolintlint\"})\n\n\t\tcfg := &config.Config{Linters: config.Linters{Default: config.GroupNone, Enable: []string{\"nolintlint\"}}}\n\n\t\tdbManager, err := lintersdb.NewManager(enabledSetLog, cfg, lintersdb.NewLinterBuilder())\n\t\trequire.NoError(t, err)\n\n\t\tenabledLintersMap, err := dbManager.GetEnabledLintersMap()\n\t\trequire.NoError(t, err)\n\n\t\tp := NewNolintFilter(log, dbManager, enabledLintersMap)\n\t\tdefer p.Finish()\n\n\t\tprocessAssertEmpty(t, p, nolintlintIssueMisspell)\n\t})\n}\n"
  },
  {
    "path": "pkg/result/processors/path_absoluter.go",
    "content": "package processors\n\nimport (\n\t\"path/filepath\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*PathAbsoluter)(nil)\n\n// PathAbsoluter ensures that representation of path are absolute.\ntype PathAbsoluter struct {\n\tlog logutils.Log\n}\n\nfunc NewPathAbsoluter(log logutils.Log) *PathAbsoluter {\n\treturn &PathAbsoluter{log: log.Child(logutils.DebugKeyPathAbsoluter)}\n}\n\nfunc (*PathAbsoluter) Name() string {\n\treturn \"path_absoluter\"\n}\n\nfunc (p *PathAbsoluter) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\treturn transformIssues(issues, func(issue *result.Issue) *result.Issue {\n\t\tif filepath.IsAbs(issue.FilePath()) {\n\t\t\treturn issue\n\t\t}\n\n\t\tabsPath, err := filepath.Abs(issue.FilePath())\n\t\tif err != nil {\n\t\t\tp.log.Warnf(\"failed to get absolute path for %q: %v\", issue.FilePath(), err)\n\t\t\treturn nil\n\t\t}\n\n\t\tnewIssue := issue\n\t\tnewIssue.Pos.Filename = absPath\n\n\t\treturn newIssue\n\t}), nil\n}\n\nfunc (*PathAbsoluter) Finish() {}\n"
  },
  {
    "path": "pkg/result/processors/path_prettifier.go",
    "content": "package processors\n\nimport (\n\t\"path/filepath\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*PathPrettifier)(nil)\n\n// PathPrettifier modifies report file path to be relative to the base path.\n// Also handles the `output.path-prefix` option.\ntype PathPrettifier struct {\n\tcfg *config.Output\n\n\tlog logutils.Log\n}\n\nfunc NewPathPrettifier(log logutils.Log, cfg *config.Output) *PathPrettifier {\n\treturn &PathPrettifier{\n\t\tcfg: cfg,\n\t\tlog: log.Child(logutils.DebugKeyPathPrettifier),\n\t}\n}\n\nfunc (*PathPrettifier) Name() string {\n\treturn \"path_prettifier\"\n}\n\nfunc (p *PathPrettifier) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif p.cfg.PathMode == fsutils.OutputPathModeAbsolute {\n\t\treturn issues, nil\n\t}\n\n\treturn transformIssues(issues, func(issue *result.Issue) *result.Issue {\n\t\tnewIssue := issue\n\n\t\tif p.cfg.PathPrefix == \"\" {\n\t\t\tnewIssue.Pos.Filename = issue.RelativePath\n\t\t} else {\n\t\t\tnewIssue.Pos.Filename = filepath.Join(p.cfg.PathPrefix, issue.RelativePath)\n\t\t}\n\n\t\treturn newIssue\n\t}), nil\n}\n\nfunc (*PathPrettifier) Finish() {}\n"
  },
  {
    "path": "pkg/result/processors/path_prettifier_test.go",
    "content": "package processors\n\nimport (\n\t\"go/token\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc newPPIssue(fn, rp string) *result.Issue {\n\treturn &result.Issue{\n\t\tPos:          token.Position{Filename: filepath.FromSlash(fn)},\n\t\tRelativePath: filepath.FromSlash(rp),\n\t}\n}\n\nfunc TestPathPrettifier_Process(t *testing.T) {\n\tpaths := func(ps ...string) (issues []*result.Issue) {\n\t\tfor _, p := range ps {\n\t\t\tissues = append(issues, newPPIssue(\"test\", p))\n\t\t}\n\t\treturn\n\t}\n\n\tfor _, tt := range []struct {\n\t\tname, prefix string\n\t\tissues, want []*result.Issue\n\t}{\n\t\t{\n\t\t\tname:   \"empty prefix\",\n\t\t\tissues: paths(\"some/path\", \"cool\"),\n\t\t\twant: []*result.Issue{\n\t\t\t\tnewPPIssue(\"some/path\", \"some/path\"),\n\t\t\t\tnewPPIssue(\"cool\", \"cool\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"prefix\",\n\t\t\tprefix: \"ok\",\n\t\t\tissues: paths(\"some/path\", \"cool\"),\n\t\t\twant: []*result.Issue{\n\t\t\t\tnewPPIssue(\"ok/some/path\", \"some/path\"),\n\t\t\t\tnewPPIssue(\"ok/cool\", \"cool\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"prefix slashed\",\n\t\t\tprefix: \"ok/\",\n\t\t\tissues: paths(\"some/path\", \"cool\"),\n\t\t\twant: []*result.Issue{\n\t\t\t\tnewPPIssue(\"ok/some/path\", \"some/path\"),\n\t\t\t\tnewPPIssue(\"ok/cool\", \"cool\"),\n\t\t\t},\n\t\t},\n\t} {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tp := NewPathPrettifier(logutils.NewStderrLog(logutils.DebugKeyEmpty), &config.Output{PathPrefix: tt.prefix})\n\n\t\t\tgot, err := p.Process(tt.issues)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, tt.want, got)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/path_relativity.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*PathRelativity)(nil)\n\n// PathRelativity computes [result.Issue.RelativePath] and [result.Issue.WorkingDirectoryRelativePath],\n// based on the base path.\ntype PathRelativity struct {\n\tlog              logutils.Log\n\tbasePath         string\n\tworkingDirectory string\n}\n\nfunc NewPathRelativity(log logutils.Log, basePath string) (*PathRelativity, error) {\n\twd, err := fsutils.Getwd()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error getting working directory: %w\", err)\n\t}\n\n\treturn &PathRelativity{\n\t\tlog:              log.Child(logutils.DebugKeyPathRelativity),\n\t\tbasePath:         basePath,\n\t\tworkingDirectory: wd,\n\t}, nil\n}\n\nfunc (*PathRelativity) Name() string {\n\treturn \"path_relativity\"\n}\n\nfunc (p *PathRelativity) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\treturn transformIssues(issues, func(issue *result.Issue) *result.Issue {\n\t\tnewIssue := *issue\n\n\t\tvar err error\n\t\tnewIssue.RelativePath, err = filepath.Rel(p.basePath, issue.FilePath())\n\t\tif err != nil {\n\t\t\tp.log.Warnf(\"Getting relative path (basepath): %v\", err)\n\t\t\treturn nil\n\t\t}\n\n\t\tnewIssue.WorkingDirectoryRelativePath, err = filepath.Rel(p.workingDirectory, issue.FilePath())\n\t\tif err != nil {\n\t\t\tp.log.Warnf(\"Getting relative path (wd): %v\", err)\n\t\t\treturn nil\n\t\t}\n\n\t\treturn &newIssue\n\t}), nil\n}\n\nfunc (*PathRelativity) Finish() {}\n"
  },
  {
    "path": "pkg/result/processors/path_shortener.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*PathShortener)(nil)\n\n// PathShortener modifies text of the reports to reduce file path inside the text.\n// It uses the rooted path name corresponding to the current directory (`wd`).\ntype PathShortener struct {\n\twd string\n}\n\nfunc NewPathShortener() *PathShortener {\n\twd, err := fsutils.Getwd()\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"Can't get working dir: %s\", err))\n\t}\n\n\treturn &PathShortener{wd: wd}\n}\n\nfunc (PathShortener) Name() string {\n\treturn \"path_shortener\"\n}\n\nfunc (p PathShortener) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\treturn transformIssues(issues, func(issue *result.Issue) *result.Issue {\n\t\tnewIssue := issue\n\t\tnewIssue.Text = strings.ReplaceAll(newIssue.Text, p.wd+\"/\", \"\")\n\t\tnewIssue.Text = strings.ReplaceAll(newIssue.Text, p.wd, \"\")\n\t\treturn newIssue\n\t}), nil\n}\n\nfunc (PathShortener) Finish() {}\n"
  },
  {
    "path": "pkg/result/processors/processor.go",
    "content": "package processors\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst typeCheckName = \"typecheck\"\n\ntype Processor interface {\n\tProcess(issues []*result.Issue) ([]*result.Issue, error)\n\tName() string\n\tFinish()\n}\n"
  },
  {
    "path": "pkg/result/processors/processor_test.go",
    "content": "package processors\n\nimport (\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype issueTestCase struct {\n\tPath     string\n\tLine     int\n\tText     string\n\tLinter   string\n\tSeverity string\n}\n\nfunc newIssueFromIssueTestCase(c issueTestCase) *result.Issue {\n\treturn &result.Issue{\n\t\tText:       c.Text,\n\t\tFromLinter: c.Linter,\n\t\tSeverity:   c.Severity,\n\t\tPos: token.Position{\n\t\t\tFilename: c.Path,\n\t\t\tLine:     c.Line,\n\t\t},\n\t\tRelativePath: c.Path,\n\t}\n}\n\nfunc newIssueFromTextTestCase(text string) *result.Issue {\n\treturn &result.Issue{\n\t\tText: text,\n\t}\n}\n\nfunc process(t *testing.T, p Processor, issues ...*result.Issue) []*result.Issue {\n\tt.Helper()\n\n\tprocessedIssues, err := p.Process(issues)\n\trequire.NoError(t, err)\n\treturn processedIssues\n}\n\nfunc processAssertSame(t *testing.T, p Processor, issues ...*result.Issue) {\n\tt.Helper()\n\n\tprocessedIssues := process(t, p, issues...)\n\tassert.Equal(t, issues, processedIssues)\n}\n\nfunc processAssertEmpty(t *testing.T, p Processor, issues ...*result.Issue) {\n\tt.Helper()\n\n\tprocessedIssues := process(t, p, issues...)\n\tassert.Empty(t, processedIssues)\n}\n"
  },
  {
    "path": "pkg/result/processors/severity.go",
    "content": "package processors\n\nimport (\n\t\"cmp\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst severityFromLinter = \"@linter\"\n\nvar _ Processor = (*Severity)(nil)\n\n// Severity modifies report severity.\n// It uses the same `baseRule` structure as [ExcludeRules] processor.\n//\n// Warning: it doesn't use `path-prefix` option.\ntype Severity struct {\n\tname string\n\n\tlog logutils.Log\n\n\tlines *fsutils.LineCache\n\n\tdefaultSeverity string\n\trules           []severityRule\n}\n\nfunc NewSeverity(log logutils.Log, lines *fsutils.LineCache, cfg *config.Severity) *Severity {\n\tp := &Severity{\n\t\tname:            \"severity-rules\",\n\t\tlines:           lines,\n\t\tlog:             log,\n\t\tdefaultSeverity: cfg.Default,\n\t}\n\n\tp.rules = parseRules(cfg.Rules, \"\", newSeverityRule)\n\n\treturn p\n}\n\nfunc (p *Severity) Name() string { return p.name }\n\nfunc (p *Severity) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif len(p.rules) == 0 && p.defaultSeverity == \"\" {\n\t\treturn issues, nil\n\t}\n\n\treturn transformIssues(issues, p.transform), nil\n}\n\nfunc (*Severity) Finish() {}\n\nfunc (p *Severity) transform(issue *result.Issue) *result.Issue {\n\tfor _, rule := range p.rules {\n\t\tif rule.match(issue, p.lines, p.log) {\n\t\t\tif rule.severity == severityFromLinter || (rule.severity == \"\" && p.defaultSeverity == severityFromLinter) {\n\t\t\t\treturn issue\n\t\t\t}\n\n\t\t\tissue.Severity = cmp.Or(rule.severity, p.defaultSeverity)\n\n\t\t\treturn issue\n\t\t}\n\t}\n\n\tif p.defaultSeverity != severityFromLinter {\n\t\tissue.Severity = p.defaultSeverity\n\t}\n\n\treturn issue\n}\n\ntype severityRule struct {\n\tbaseRule\n\tseverity string\n}\n\nfunc newSeverityRule(rule *config.SeverityRule, prefix string) severityRule {\n\treturn severityRule{\n\t\tbaseRule: newBaseRule(&rule.BaseRule, prefix),\n\t\tseverity: rule.Severity,\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/severity_test.go",
    "content": "package processors\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc TestSeverity_multiple(t *testing.T) {\n\tlineCache := fsutils.NewLineCache(fsutils.NewFileCache())\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\n\topts := &config.Severity{\n\t\tDefault: \"error\",\n\t\tRules: []config.SeverityRule{\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:    \"^ssl$\",\n\t\t\t\t\tLinters: []string{\"gosec\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tLinters: []string{\"linter\"},\n\t\t\t\t\tPath:    \"e.go\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText: \"^testonly$\",\n\t\t\t\t\tPath: `_test\\.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:       \"^nontestonly$\",\n\t\t\t\t\tPathExcept: `_test\\.go`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tSource:  \"^//go:generate \",\n\t\t\t\t\tLinters: []string{\"lll\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tSource: \"^//go:dosomething\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tLinters: []string{\"someotherlinter\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tLinters: []string{\"somelinter\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t},\n\t\t},\n\t}\n\n\tp := NewSeverity(log, lineCache, opts)\n\n\tcases := []issueTestCase{\n\t\t{Path: \"ssl.go\", Text: \"ssl\", Linter: \"gosec\"},\n\t\t{Path: \"e.go\", Text: \"some\", Linter: \"linter\"},\n\t\t{Path: \"e_test.go\", Text: \"testonly\", Linter: \"testlinter\"},\n\t\t{Path: \"e.go\", Text: \"nontestonly\", Linter: \"testlinter\"},\n\t\t{Path: \"e_test.go\", Text: \"nontestonly\", Linter: \"testlinter\"},\n\t\t{Path: filepath.FromSlash(\"testdata/severity/exclude_rules.go\"), Line: 3, Linter: \"lll\"},\n\t\t{Path: filepath.FromSlash(\"testdata/severity/severity_rules.go\"), Line: 3, Linter: \"invalidgo\"},\n\t\t{Path: \"someotherlinter.go\", Text: \"someotherlinter\", Linter: \"someotherlinter\"},\n\t\t{Path: \"somenotmatchlinter.go\", Text: \"somenotmatchlinter\", Linter: \"somenotmatchlinter\"},\n\t\t{Path: \"empty.go\", Text: \"empty\", Linter: \"empty\"},\n\t}\n\n\tvar issues []*result.Issue\n\tfor _, c := range cases {\n\t\tissues = append(issues, newIssueFromIssueTestCase(c))\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\n\tvar resultingCases []issueTestCase\n\tfor _, i := range processedIssues {\n\t\tresultingCases = append(resultingCases, issueTestCase{\n\t\t\tPath:     i.FilePath(),\n\t\t\tLinter:   i.FromLinter,\n\t\t\tText:     i.Text,\n\t\t\tLine:     i.Line(),\n\t\t\tSeverity: i.Severity,\n\t\t})\n\t}\n\n\texpectedCases := []issueTestCase{\n\t\t{Path: \"ssl.go\", Text: \"ssl\", Linter: \"gosec\", Severity: \"info\"},\n\t\t{Path: \"e.go\", Text: \"some\", Linter: \"linter\", Severity: \"info\"},\n\t\t{Path: \"e_test.go\", Text: \"testonly\", Linter: \"testlinter\", Severity: \"info\"},\n\t\t{Path: \"e.go\", Text: \"nontestonly\", Linter: \"testlinter\", Severity: \"info\"},       // matched\n\t\t{Path: \"e_test.go\", Text: \"nontestonly\", Linter: \"testlinter\", Severity: \"error\"}, // not matched\n\t\t{Path: filepath.FromSlash(\"testdata/severity/exclude_rules.go\"), Line: 3, Linter: \"lll\", Severity: \"error\"},\n\t\t{Path: filepath.FromSlash(\"testdata/severity/severity_rules.go\"), Line: 3, Linter: \"invalidgo\", Severity: \"info\"},\n\t\t{Path: \"someotherlinter.go\", Text: \"someotherlinter\", Linter: \"someotherlinter\", Severity: \"info\"},\n\t\t{Path: \"somenotmatchlinter.go\", Text: \"somenotmatchlinter\", Linter: \"somenotmatchlinter\", Severity: \"error\"},\n\t\t{Path: \"empty.go\", Text: \"empty\", Linter: \"empty\", Severity: \"error\"},\n\t}\n\n\tassert.Equal(t, expectedCases, resultingCases)\n}\n\nfunc TestSeverity_text(t *testing.T) {\n\topts := &config.Severity{\n\t\tRules: []config.SeverityRule{\n\t\t\t{\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:    \"^severity$\",\n\t\t\t\t\tLinters: []string{\"linter\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tp := NewSeverity(nil, nil, opts)\n\n\ttexts := []string{\"seveRity\", \"1\", \"\", \"serverit\", \"notseverity\"}\n\tvar issues []*result.Issue\n\tfor _, t := range texts {\n\t\tissues = append(issues, &result.Issue{\n\t\t\tText:       t,\n\t\t\tFromLinter: \"linter\",\n\t\t})\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\tassert.Len(t, processedIssues, len(issues))\n\n\tvar processedTexts []string\n\tfor _, i := range processedIssues {\n\t\tprocessedTexts = append(processedTexts, i.Text)\n\t}\n\n\tassert.Equal(t, texts, processedTexts)\n}\n\nfunc TestSeverity_onlyDefault(t *testing.T) {\n\tlineCache := fsutils.NewLineCache(fsutils.NewFileCache())\n\tlog := logutils.NewStderrLog(logutils.DebugKeyEmpty)\n\n\topts := config.Severity{\n\t\tDefault: \"info\",\n\t\tRules:   []config.SeverityRule{},\n\t}\n\n\tp := NewSeverity(log, lineCache, &opts)\n\n\tcases := []issueTestCase{\n\t\t{Path: \"ssl.go\", Text: \"ssl\", Linter: \"gosec\"},\n\t\t{Path: \"empty.go\", Text: \"empty\", Linter: \"empty\"},\n\t}\n\n\tvar issues []*result.Issue\n\tfor _, c := range cases {\n\t\tissues = append(issues, newIssueFromIssueTestCase(c))\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\n\tvar resultingCases []issueTestCase\n\tfor _, i := range processedIssues {\n\t\tresultingCases = append(resultingCases, issueTestCase{\n\t\t\tPath:     i.FilePath(),\n\t\t\tLinter:   i.FromLinter,\n\t\t\tText:     i.Text,\n\t\t\tLine:     i.Line(),\n\t\t\tSeverity: i.Severity,\n\t\t})\n\t}\n\n\texpectedCases := []issueTestCase{\n\t\t{Path: \"ssl.go\", Text: \"ssl\", Linter: \"gosec\", Severity: \"info\"},\n\t\t{Path: \"empty.go\", Text: \"empty\", Linter: \"empty\", Severity: \"info\"},\n\t}\n\n\tassert.Equal(t, expectedCases, resultingCases)\n}\n\nfunc TestSeverity_empty(t *testing.T) {\n\tp := NewSeverity(nil, nil, &config.Severity{})\n\n\tprocessAssertSame(t, p, newIssueFromTextTestCase(\"test\"))\n}\n\nfunc TestSeverity_caseSensitive(t *testing.T) {\n\tlineCache := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\topts := &config.Severity{\n\t\tDefault: \"error\",\n\t\tRules: []config.SeverityRule{\n\t\t\t{\n\t\t\t\tSeverity: \"info\",\n\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\tText:    \"^ssl$\",\n\t\t\t\t\tLinters: []string{\"gosec\", \"someotherlinter\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tp := NewSeverity(nil, lineCache, opts)\n\n\tcases := []issueTestCase{\n\t\t{Path: \"e.go\", Text: \"ssL\", Linter: \"gosec\"},\n\t}\n\n\tvar issues []*result.Issue\n\tfor _, c := range cases {\n\t\tissues = append(issues, newIssueFromIssueTestCase(c))\n\t}\n\n\tprocessedIssues := process(t, p, issues...)\n\n\tvar resultingCases []issueTestCase\n\tfor _, i := range processedIssues {\n\t\tresultingCases = append(resultingCases, issueTestCase{\n\t\t\tPath:     i.FilePath(),\n\t\t\tLinter:   i.FromLinter,\n\t\t\tText:     i.Text,\n\t\t\tLine:     i.Line(),\n\t\t\tSeverity: i.Severity,\n\t\t})\n\t}\n\n\texpectedCases := []issueTestCase{\n\t\t{Path: \"e.go\", Text: \"ssL\", Linter: \"gosec\", Severity: \"error\"},\n\t}\n\n\tassert.Equal(t, expectedCases, resultingCases)\n}\n\nfunc TestSeverity_transform(t *testing.T) {\n\tlineCache := fsutils.NewLineCache(fsutils.NewFileCache())\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\topts     *config.Severity\n\t\tissue    *result.Issue\n\t\texpected *result.Issue\n\t}{\n\t\t{\n\t\t\tdesc: \"apply severity from rule\",\n\t\t\topts: &config.Severity{\n\t\t\t\tDefault: \"error\",\n\t\t\t\tRules: []config.SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"info\",\n\t\t\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\t\t\tLinters: []string{\"linter1\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tissue: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter1\",\n\t\t\t},\n\t\t\texpected: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter1\",\n\t\t\t\tSeverity:   \"info\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"apply severity from default\",\n\t\t\topts: &config.Severity{\n\t\t\t\tDefault: \"error\",\n\t\t\t\tRules: []config.SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"info\",\n\t\t\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\t\t\tLinters: []string{\"linter1\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tissue: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t},\n\t\t\texpected: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t\tSeverity:   \"error\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"severity from rule override severity from linter\",\n\t\t\topts: &config.Severity{\n\t\t\t\tDefault: \"error\",\n\t\t\t\tRules: []config.SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"info\",\n\t\t\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\t\t\tLinters: []string{\"linter1\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tissue: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter1\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t\texpected: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter1\",\n\t\t\t\tSeverity:   \"info\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"severity from default override severity from linter\",\n\t\t\topts: &config.Severity{\n\t\t\t\tDefault: \"error\",\n\t\t\t\tRules: []config.SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"info\",\n\t\t\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\t\t\tLinters: []string{\"linter1\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tissue: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t\texpected: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t\tSeverity:   \"error\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"keep severity from linter as rule\",\n\t\t\topts: &config.Severity{\n\t\t\t\tDefault: \"error\",\n\t\t\t\tRules: []config.SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: severityFromLinter,\n\t\t\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\t\t\tLinters: []string{\"linter1\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tissue: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter1\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t\texpected: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter1\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"keep severity from linter as default\",\n\t\t\topts: &config.Severity{\n\t\t\t\tDefault: severityFromLinter,\n\t\t\t\tRules: []config.SeverityRule{\n\t\t\t\t\t{\n\t\t\t\t\t\tSeverity: \"info\",\n\t\t\t\t\t\tBaseRule: config.BaseRule{\n\t\t\t\t\t\t\tLinters: []string{\"linter1\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tissue: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t\texpected: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"keep severity from linter as default (without rule)\",\n\t\t\topts: &config.Severity{\n\t\t\t\tDefault: severityFromLinter,\n\t\t\t},\n\t\t\tissue: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t\texpected: &result.Issue{\n\t\t\t\tText:       \"This is a report\",\n\t\t\t\tFromLinter: \"linter2\",\n\t\t\t\tSeverity:   \"huge\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tp := NewSeverity(nil, lineCache, test.opts)\n\n\t\t\tnewIssue := p.transform(test.issue)\n\n\t\t\tassert.Equal(t, test.expected, newIssue)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/sort_results.go",
    "content": "package processors\n\nimport (\n\t\"cmp\"\n\t\"fmt\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst (\n\torderNameFile     = \"file\"\n\torderNameLinter   = \"linter\"\n\torderNameSeverity = \"severity\"\n)\n\nconst (\n\tless = iota - 1\n\tequal\n\tgreater\n)\n\nvar _ Processor = (*SortResults)(nil)\n\ntype issueComparator func(a, b *result.Issue) int\n\n// SortResults sorts reports based on criteria:\n//   - file names, line numbers, positions\n//   - linter names\n//   - severity names\ntype SortResults struct {\n\tcmps map[string][]issueComparator\n\n\tcfg *config.Output\n}\n\nfunc NewSortResults(cfg *config.Output) *SortResults {\n\treturn &SortResults{\n\t\tcmps: map[string][]issueComparator{\n\t\t\t// For sorting we are comparing (in next order):\n\t\t\t// file names, line numbers, position, and finally - giving up.\n\t\t\torderNameFile: {byFileName, byLine, byColumn},\n\t\t\t// For sorting we are comparing: linter name\n\t\t\torderNameLinter: {byLinter},\n\t\t\t// For sorting we are comparing: severity\n\t\t\torderNameSeverity: {bySeverity},\n\t\t},\n\t\tcfg: cfg,\n\t}\n}\n\nfunc (SortResults) Name() string { return \"sort_results\" }\n\n// Process is performing sorting of the result issues.\nfunc (p SortResults) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif len(p.cfg.SortOrder) == 0 {\n\t\tp.cfg.SortOrder = []string{orderNameLinter, orderNameFile}\n\t}\n\n\tvar cmps []issueComparator\n\n\tfor _, name := range p.cfg.SortOrder {\n\t\tc, ok := p.cmps[name]\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"unsupported sort-order name %q\", name)\n\t\t}\n\n\t\tcmps = append(cmps, c...)\n\t}\n\n\tcomp := mergeComparators(cmps...)\n\n\tslices.SortFunc(issues, func(a, b *result.Issue) int {\n\t\treturn comp(a, b)\n\t})\n\n\treturn issues, nil\n}\n\nfunc (SortResults) Finish() {}\n\nfunc byFileName(a, b *result.Issue) int {\n\treturn strings.Compare(a.FilePath(), b.FilePath())\n}\n\nfunc byLine(a, b *result.Issue) int {\n\treturn numericCompare(a.Line(), b.Line())\n}\n\nfunc byColumn(a, b *result.Issue) int {\n\treturn numericCompare(a.Column(), b.Column())\n}\n\nfunc byLinter(a, b *result.Issue) int {\n\treturn strings.Compare(a.FromLinter, b.FromLinter)\n}\n\nfunc bySeverity(a, b *result.Issue) int {\n\treturn severityCompare(a.Severity, b.Severity)\n}\n\nfunc severityCompare(a, b string) int {\n\t// The position inside the slice define the importance (lower to higher).\n\tclassic := []string{\"low\", \"medium\", \"high\", \"warning\", \"error\"}\n\n\tif slices.Contains(classic, a) && slices.Contains(classic, b) {\n\t\treturn cmp.Compare(slices.Index(classic, a), slices.Index(classic, b))\n\t}\n\n\tif slices.Contains(classic, a) {\n\t\treturn greater\n\t}\n\n\tif slices.Contains(classic, b) {\n\t\treturn less\n\t}\n\n\treturn strings.Compare(a, b)\n}\n\nfunc numericCompare(a, b int) int {\n\t// Negative values and zeros are skipped (equal) because they either invalid or  \"neutral\" (default int value).\n\tif a <= 0 || b <= 0 {\n\t\treturn equal\n\t}\n\n\treturn cmp.Compare(a, b)\n}\n\nfunc mergeComparators(comps ...issueComparator) issueComparator {\n\treturn func(a, b *result.Issue) int {\n\t\tfor _, comp := range comps {\n\t\t\ti := comp(a, b)\n\t\t\tif i != equal {\n\t\t\t\treturn i\n\t\t\t}\n\t\t}\n\n\t\treturn equal\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/sort_results_test.go",
    "content": "package processors\n\nimport (\n\t\"fmt\"\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar issues = []*result.Issue{\n\t{\n\t\tFromLinter: \"b\",\n\t\tSeverity:   \"medium\",\n\t\tPos: token.Position{\n\t\t\tFilename: \"file_windows.go\",\n\t\t\tColumn:   80,\n\t\t\tLine:     10,\n\t\t},\n\t},\n\t{\n\t\tFromLinter: \"a\",\n\t\tSeverity:   \"low\",\n\t\tPos: token.Position{\n\t\t\tFilename: \"file_linux.go\",\n\t\t\tColumn:   70,\n\t\t\tLine:     11,\n\t\t},\n\t},\n\t{\n\t\tFromLinter: \"c\",\n\t\tSeverity:   \"high\",\n\t\tPos: token.Position{\n\t\t\tFilename: \"file_darwin.go\",\n\t\t\tLine:     12,\n\t\t},\n\t},\n\t{\n\t\tFromLinter: \"c\",\n\t\tSeverity:   \"high\",\n\t\tPos: token.Position{\n\t\t\tFilename: \"file_darwin.go\",\n\t\t\tColumn:   60,\n\t\t\tLine:     10,\n\t\t},\n\t},\n}\n\nvar extraSeverityIssues = []*result.Issue{\n\t{\n\t\tFromLinter: \"c\",\n\t\tSeverity:   \"error\",\n\t\tPos: token.Position{\n\t\t\tFilename: \"file_darwin.go\",\n\t\t\tColumn:   60,\n\t\t\tLine:     10,\n\t\t},\n\t},\n\t{\n\t\tFromLinter: \"c\",\n\t\tSeverity:   \"aaaa\",\n\t\tPos: token.Position{\n\t\t\tFilename: \"file_darwin.go\",\n\t\t\tColumn:   60,\n\t\t\tLine:     10,\n\t\t},\n\t},\n}\n\ntype compareTestCase struct {\n\ta, b     *result.Issue\n\texpected int\n}\n\nfunc testCompareValues(t *testing.T, cmp issueComparator, name string, tests []compareTestCase) {\n\tfor i, test := range tests {\n\t\tt.Run(fmt.Sprintf(\"%s(%d)\", name, i), func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tres := cmp(test.a, test.b)\n\n\t\t\tassert.Equal(t, compToString(test.expected), compToString(res))\n\t\t})\n\t}\n}\n\nfunc Test_byLine(t *testing.T) {\n\ttestCompareValues(t, byLine, \"Compare By Line\", []compareTestCase{\n\t\t{issues[0], issues[1], less},    // 10 vs 11\n\t\t{issues[0], issues[0], equal},   // 10 vs 10\n\t\t{issues[3], issues[3], equal},   // 10 vs 10\n\t\t{issues[0], issues[3], equal},   // 10 vs 10\n\t\t{issues[3], issues[2], less},    // 10 vs 12\n\t\t{issues[1], issues[1], equal},   // 11 vs 11\n\t\t{issues[1], issues[0], greater}, // 11 vs 10\n\t\t{issues[1], issues[2], less},    // 11 vs 12\n\t\t{issues[2], issues[3], greater}, // 12 vs 10\n\t\t{issues[2], issues[1], greater}, // 12 vs 11\n\t\t{issues[2], issues[2], equal},   // 12 vs 12\n\t})\n}\n\nfunc Test_byFileName(t *testing.T) {\n\ttestCompareValues(t, byFileName, \"Compare By File Name\", []compareTestCase{\n\t\t{issues[0], issues[1], greater}, // file_windows.go vs file_linux.go\n\t\t{issues[1], issues[2], greater}, // file_linux.go vs file_darwin.go\n\t\t{issues[2], issues[3], equal},   // file_darwin.go vs file_darwin.go\n\t\t{issues[1], issues[1], equal},   // file_linux.go vs file_linux.go\n\t\t{issues[1], issues[0], less},    // file_linux.go vs file_windows.go\n\t\t{issues[3], issues[2], equal},   // file_darwin.go vs file_darwin.go\n\t\t{issues[2], issues[1], less},    // file_darwin.go vs file_linux.go\n\t\t{issues[0], issues[0], equal},   // file_windows.go vs file_windows.go\n\t\t{issues[2], issues[2], equal},   // file_darwin.go vs file_darwin.go\n\t\t{issues[3], issues[3], equal},   // file_darwin.go vs file_darwin.go\n\t})\n}\n\nfunc Test_byColumn(t *testing.T) {\n\ttestCompareValues(t, byColumn, \"Compare By Column\", []compareTestCase{\n\t\t{issues[0], issues[1], greater}, // 80 vs 70\n\t\t{issues[1], issues[2], equal},   // 70 vs zero value\n\t\t{issues[3], issues[3], equal},   // 60 vs 60\n\t\t{issues[2], issues[3], equal},   // zero value vs 60\n\t\t{issues[2], issues[1], equal},   // zero value vs 70\n\t\t{issues[1], issues[0], less},    // 70 vs 80\n\t\t{issues[1], issues[1], equal},   // 70 vs 70\n\t\t{issues[3], issues[2], equal},   // vs zero value\n\t\t{issues[2], issues[2], equal},   // zero value vs zero value\n\t\t{issues[1], issues[1], equal},   // 70 vs 70\n\t})\n}\n\nfunc Test_byLinter(t *testing.T) {\n\ttestCompareValues(t, byLinter, \"Compare By Linter\", []compareTestCase{\n\t\t{issues[0], issues[1], greater}, // b vs a\n\t\t{issues[1], issues[2], less},    // a vs c\n\t\t{issues[2], issues[3], equal},   // c vs c\n\t\t{issues[1], issues[1], equal},   // a vs a\n\t\t{issues[1], issues[0], less},    // a vs b\n\t\t{issues[3], issues[2], equal},   // c vs c\n\t\t{issues[2], issues[1], greater}, // c vs a\n\t\t{issues[0], issues[0], equal},   // b vs b\n\t\t{issues[2], issues[2], equal},   // a vs a\n\t\t{issues[3], issues[3], equal},   // c vs c\n\t})\n}\n\nfunc Test_bySeverity(t *testing.T) {\n\ttestCompareValues(t, bySeverity, \"Compare By Severity\", []compareTestCase{\n\t\t{issues[0], issues[1], greater},                           // medium vs low\n\t\t{issues[1], issues[2], less},                              // low vs high\n\t\t{issues[2], issues[3], equal},                             // high vs high\n\t\t{issues[1], issues[1], equal},                             // low vs low\n\t\t{issues[1], issues[0], less},                              // low vs medium\n\t\t{issues[3], issues[2], equal},                             // high vs high\n\t\t{issues[2], issues[1], greater},                           // high vs low\n\t\t{issues[0], issues[0], equal},                             // medium vs medium\n\t\t{issues[2], issues[2], equal},                             // low vs low\n\t\t{issues[3], issues[3], equal},                             // high vs high\n\t\t{extraSeverityIssues[0], extraSeverityIssues[1], greater}, // classic vs unknown\n\t\t{extraSeverityIssues[1], extraSeverityIssues[0], less},    // unknown vs classic\n\t})\n}\n\nfunc Test_mergeComparators(t *testing.T) {\n\ttestCompareValues(t, mergeComparators(byFileName, byLine, byColumn), \"Nested Comparing\",\n\t\t[]compareTestCase{\n\t\t\t{issues[1], issues[0], less},    // file_linux.go vs file_windows.go\n\t\t\t{issues[2], issues[1], less},    // file_darwin.go vs file_linux.go\n\t\t\t{issues[0], issues[1], greater}, // file_windows.go vs file_linux.go\n\t\t\t{issues[1], issues[2], greater}, // file_linux.go vs file_darwin.go\n\t\t\t{issues[3], issues[2], less},    // file_darwin.go vs file_darwin.go, 10 vs 12\n\t\t\t{issues[0], issues[0], equal},   // file_windows.go vs file_windows.go\n\t\t\t{issues[2], issues[3], greater}, // file_darwin.go vs file_darwin.go, 12 vs 10\n\t\t\t{issues[1], issues[1], equal},   // file_linux.go vs file_linux.go\n\t\t\t{issues[2], issues[2], equal},   // file_darwin.go vs file_darwin.go\n\t\t\t{issues[3], issues[3], equal},   // file_darwin.go vs file_darwin.go\n\t\t},\n\t)\n}\n\nfunc Test_numericCompare(t *testing.T) {\n\ttests := []struct {\n\t\ta, b     int\n\t\texpected int\n\t}{\n\t\t{0, 0, equal},\n\t\t{0, 1, equal},\n\t\t{1, 0, equal},\n\t\t{1, -1, equal},\n\t\t{-1, 1, equal},\n\t\t{1, 1, equal},\n\t\t{1, 2, less},\n\t\t{2, 1, greater},\n\t}\n\n\tfor i, test := range tests {\n\t\tt.Run(fmt.Sprintf(\"%s(%d)\", \"Numeric Compare\", i), func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tres := numericCompare(test.a, test.b)\n\n\t\t\tassert.Equal(t, compToString(test.expected), compToString(res))\n\t\t})\n\t}\n}\n\nfunc TestSortResults_Process(t *testing.T) {\n\ttests := make([]*result.Issue, len(issues))\n\tcopy(tests, issues)\n\n\tcfg := &config.Output{}\n\n\tsr := NewSortResults(cfg)\n\n\tresults, err := sr.Process(tests)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []*result.Issue{issues[1], issues[0], issues[3], issues[2]}, results)\n}\n\nfunc compToString(c int) string {\n\tswitch c {\n\tcase less:\n\t\treturn \"less\"\n\tcase greater:\n\t\treturn \"greater\"\n\tcase equal:\n\t\treturn \"equal\"\n\tdefault:\n\t\treturn \"error\"\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/source_code.go",
    "content": "package processors\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nvar _ Processor = (*SourceCode)(nil)\n\n// SourceCode modifies displayed information based on [result.Issue.GetLineRange()].\n//\n// This is used:\n//   - to display the \"UnderLinePointer\".\n//   - in some rare cases to display multiple lines instead of one (ex: `dupl`)\n//\n// It requires to use [fsutils.LineCache] ([fsutils.FileCache]) to get the file information before the fixes.\ntype SourceCode struct {\n\tlineCache *fsutils.LineCache\n\tlog       logutils.Log\n}\n\nfunc NewSourceCode(lc *fsutils.LineCache, log logutils.Log) *SourceCode {\n\treturn &SourceCode{\n\t\tlineCache: lc,\n\t\tlog:       log,\n\t}\n}\n\nfunc (SourceCode) Name() string {\n\treturn \"source_code\"\n}\n\nfunc (p SourceCode) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\treturn transformIssues(issues, p.transform), nil\n}\n\nfunc (SourceCode) Finish() {}\n\nfunc (p SourceCode) transform(issue *result.Issue) *result.Issue {\n\tnewIssue := *issue\n\n\tlineRange := issue.GetLineRange()\n\tfor lineNumber := lineRange.From; lineNumber <= lineRange.To; lineNumber++ {\n\t\tline, err := p.lineCache.GetLine(issue.FilePath(), lineNumber)\n\t\tif err != nil {\n\t\t\tp.log.Warnf(\"Failed to get line %d for file %s: %s\",\n\t\t\t\tlineNumber, issue.FilePath(), err)\n\n\t\t\treturn issue\n\t\t}\n\n\t\tnewIssue.SourceLines = append(newIssue.SourceLines, line)\n\t}\n\n\treturn &newIssue\n}\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_generated_file_filter/exclude.go",
    "content": "// first line\n// second line\n\n// third line\n\npackage exclusion_generated_file_filter // this text also\n// and this text also\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_generated_file_filter/exclude_block_comment.go",
    "content": "/*\n * first line\n *\n * second line\n * third line\n */\n\n// and this text also\n\n/*\nthis type of block comment also\n*/\n\n/* this one line comment also */\n\npackage exclusion_generated_file_filter\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_generated_file_filter/exclude_doc.go",
    "content": "package exclusion_generated_file_filter\n\n// DO NOT EDIT\n\nimport \"fmt\"\n\n//nolint:all\nfunc PrintString(s string) {\n\tfmt.Printf(\"%s\", s)\n}\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_generated_file_filter/exclude_long_line.go",
    "content": "// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\npackage exclusion_generated_file_filter\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_generated_file_filter/go_strict.go",
    "content": "// foo foo foo.\n// foo foo foo.\n// foo foo foo.\n\n// Code generated by example — DO NOT EDIT.\n\npackage exclusion_generated_file_filter\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_generated_file_filter/go_strict_invalid.go",
    "content": "package exclusion_generated_file_filter\n\n// Code generated by example; DO NOT EDIT.\nfunc _() {\n\n}\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_rules/case_sensitive.go",
    "content": "package exclusion_rules\n\n// GO:generate long line that will be excluded by default processor but will not be affected by case-sensitive one because of capital GO\n"
  },
  {
    "path": "pkg/result/processors/testdata/exclusion_rules/exclusion_rules.go",
    "content": "package exclusion_rules\n\n//go:generate --long line --with a --lot of --arguments --that we --would like --to exclude --from lll --issues --by exclude-rules\n\n// long line that we don't want to exclude from lll issues. Use the similar pattern: go:generate. This line should be reported by lll\n"
  },
  {
    "path": "pkg/result/processors/testdata/nolint_filter/apply_to_unknown.go",
    "content": "package nolint_filter\n\nfunc bar() {\n\t_ = 0 // nolint: foobar\n}\n"
  },
  {
    "path": "pkg/result/processors/testdata/nolint_filter/bad_names.go",
    "content": "package nolint_filter\n\nimport \"math\"\n\nfunc RetErr() error {\n\treturn nil\n}\n\nfunc MissedErrorCheck() {\n\tRetErr() //nolint:bad1,errcheck\n}\n\n//nolint:bad2,errcheck\nfunc MissedErrorCheck2() {\n\tRetErr()\n}\n\nfunc _() {\n\tx := math.MinInt8\n\tfor {\n\t\t_ = x\n\t\tx = 0 //nolint:bad1,ineffassign\n\t\tx = 0\n\t}\n}\n"
  },
  {
    "path": "pkg/result/processors/testdata/nolint_filter/nolint.go",
    "content": "package nolint_filter\n\nvar nolintSpecific int    //nolint:gofmt\nvar nolintSpace int       // nolint: gofmt\nvar nolintSpaces int      //nolint:gofmt, govet\nvar nolintAll int         // nolint:all\nvar nolintAndAppendix int // nolint:all // another comment\n\n//nolint:all\nvar nolintVarByPrecedingComment int\n\n//nolint:all\n\nvar dontNolintVarByPrecedingCommentBecauseOfNewLine int\n\nvar nolintPrecedingVar string //nolint:all\nvar dontNolintVarByPrecedingCommentBecauseOfDifferentColumn int\n\n//nolint:all\nfunc nolintFuncByPrecedingComment() *string {\n\txv := \"v\"\n\treturn &xv\n}\n\n//nolint:all\n// second line\nfunc nolintFuncByPrecedingMultilineComment1() *string {\n\txv := \"v\"\n\treturn &xv\n}\n\n// first line\n//nolint:all\nfunc nolintFuncByPrecedingMultilineComment2() *string {\n\txv := \"v\"\n\treturn &xv\n}\n\n// first line\n//nolint:all\n// third line\nfunc nolintFuncByPrecedingMultilineComment3() *string {\n\txv := \"v\"\n\treturn &xv\n}\n\nvar nolintAliasGosec bool //nolint:gosec\n\n//nolint:errcheck\nvar (\n\tnolintVarBlockVar1 int\n\tnolintVarBlockVar2 int\n)\n"
  },
  {
    "path": "pkg/result/processors/testdata/nolint_filter/nolint2.go",
    "content": "package nolint_filter\n\nimport (\n\t\"bytes\"\n\t\"io\"\n)\n\nfunc noTransitiveExpanding() {\n\t//nolint:errcheck\n\tvar buf io.Writer = &bytes.Buffer{}\n\tbuf.Write([]byte(\"123\"))\n}\n\nfunc nolintFuncByInlineCommentDoesNotWork() { //nolint:errcheck\n\tvar buf io.Writer = &bytes.Buffer{}\n\tbuf.Write([]byte(\"123\"))\n}\n"
  },
  {
    "path": "pkg/result/processors/testdata/nolint_filter/unused.go",
    "content": "package nolint_filter\n\nvar nolintMisspell int //nolint:misspell\n\nvar nolintMisspellUnusedOK int //nolint:misspell,nolintlint\n"
  },
  {
    "path": "pkg/result/processors/testdata/nolint_filter/whole_file.go",
    "content": "//nolint:errcheck\npackage nolint_filter\n\nfunc RetError() error {\n\treturn nil\n}\n\nfunc MissedErrorCheck1() {\n\tRetErr()\n}\n\nfunc jo(v, w bool) bool {\n\treturn v == w || v == w\n}\n"
  },
  {
    "path": "pkg/result/processors/testdata/severity/exclude_rules.go",
    "content": "package severity\n\n//go:generate --long line --with a --lot of --arguments --that we --would like --to exclude --from lll --issues --by exclude-rules\n\n// long line that we don't want to exclude from lll issues. Use the similar pattern: go:generate. This line should be reported by lll\n"
  },
  {
    "path": "pkg/result/processors/testdata/severity/severity_rules.go",
    "content": "package severity\n\n//go:dosomething\n"
  },
  {
    "path": "pkg/result/processors/uniq_by_line.go",
    "content": "package processors\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst uniqByLineLimit = 1\n\nvar _ Processor = (*UniqByLine)(nil)\n\n// UniqByLine filters reports to keep only one report by line of code.\ntype UniqByLine struct {\n\tfileLineCounter fileLineCounter\n\tenabled         bool\n}\n\nfunc NewUniqByLine(enable bool) *UniqByLine {\n\treturn &UniqByLine{\n\t\tfileLineCounter: fileLineCounter{},\n\t\tenabled:         enable,\n\t}\n}\n\nfunc (*UniqByLine) Name() string {\n\treturn \"uniq_by_line\"\n}\n\nfunc (p *UniqByLine) Process(issues []*result.Issue) ([]*result.Issue, error) {\n\tif !p.enabled {\n\t\treturn issues, nil\n\t}\n\n\treturn filterIssuesUnsafe(issues, p.shouldPassIssue), nil\n}\n\nfunc (*UniqByLine) Finish() {}\n\nfunc (p *UniqByLine) shouldPassIssue(issue *result.Issue) bool {\n\tif p.fileLineCounter.GetCount(issue) == uniqByLineLimit {\n\t\treturn false\n\t}\n\n\tp.fileLineCounter.Increment(issue)\n\n\treturn true\n}\n\ntype fileLineCounter map[string]map[int]int\n\nfunc (f fileLineCounter) GetCount(issue *result.Issue) int {\n\treturn f.getCounter(issue)[issue.Line()]\n}\n\nfunc (f fileLineCounter) Increment(issue *result.Issue) {\n\tf.getCounter(issue)[issue.Line()]++\n}\n\nfunc (f fileLineCounter) getCounter(issue *result.Issue) map[int]int {\n\tlc := f[issue.FilePath()]\n\n\tif lc == nil {\n\t\tlc = map[int]int{}\n\t\tf[issue.FilePath()] = lc\n\t}\n\n\treturn lc\n}\n"
  },
  {
    "path": "pkg/result/processors/uniq_by_line_test.go",
    "content": "package processors\n\nimport (\n\t\"go/token\"\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nfunc newULIssue(file string, line int) *result.Issue {\n\treturn &result.Issue{\n\t\tPos: token.Position{\n\t\t\tFilename: file,\n\t\t\tLine:     line,\n\t\t},\n\t}\n}\n\nfunc TestUniqByLine(t *testing.T) {\n\tp := NewUniqByLine(true)\n\ti1 := newULIssue(\"f1\", 1)\n\n\tprocessAssertSame(t, p, i1)\n\tprocessAssertEmpty(t, p, i1) // check skipping\n\tprocessAssertEmpty(t, p, i1) // check accumulated error\n\n\tprocessAssertSame(t, p, newULIssue(\"f1\", 2)) // another line\n\tprocessAssertSame(t, p, newULIssue(\"f2\", 1)) // another file\n}\n\nfunc TestUniqByLineDisabled(t *testing.T) {\n\tp := NewUniqByLine(false)\n\ti1 := newULIssue(\"f1\", 1)\n\n\tprocessAssertSame(t, p, i1)\n\tprocessAssertSame(t, p, i1) // check the same issue passed twice\n}\n"
  },
  {
    "path": "pkg/timeutils/stopwatch.go",
    "content": "package timeutils\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\nconst noStagesText = \"no stages\"\n\ntype Stopwatch struct {\n\tname      string\n\tstartedAt time.Time\n\tlog       logutils.Log\n\n\tstages map[string]time.Duration\n\tmu     sync.Mutex\n}\n\nfunc NewStopwatch(name string, log logutils.Log) *Stopwatch {\n\treturn &Stopwatch{\n\t\tname:      name,\n\t\tstartedAt: time.Now(),\n\t\tstages:    map[string]time.Duration{},\n\t\tlog:       log,\n\t}\n}\n\ntype stageDuration struct {\n\tname string\n\td    time.Duration\n}\n\nfunc (s *Stopwatch) stageDurationsSorted() []stageDuration {\n\tstageDurations := make([]stageDuration, 0, len(s.stages))\n\tfor n, d := range s.stages {\n\t\tstageDurations = append(stageDurations, stageDuration{\n\t\t\tname: n,\n\t\t\td:    d,\n\t\t})\n\t}\n\tsort.Slice(stageDurations, func(i, j int) bool {\n\t\treturn stageDurations[i].d > stageDurations[j].d\n\t})\n\treturn stageDurations\n}\n\nfunc (s *Stopwatch) sprintStages() string {\n\tif len(s.stages) == 0 {\n\t\treturn noStagesText\n\t}\n\n\tstageDurations := s.stageDurationsSorted()\n\n\tstagesStrings := make([]string, 0, len(stageDurations))\n\tfor _, s := range stageDurations {\n\t\tstagesStrings = append(stagesStrings, fmt.Sprintf(\"%s: %s\", s.name, s.d))\n\t}\n\n\treturn fmt.Sprintf(\"stages: %s\", strings.Join(stagesStrings, \", \"))\n}\n\nfunc (s *Stopwatch) sprintTopStages(n int) string {\n\tif len(s.stages) == 0 {\n\t\treturn noStagesText\n\t}\n\n\tstageDurations := s.stageDurationsSorted()\n\n\tvar stagesStrings []string\n\tfor i := 0; i < len(stageDurations) && i < n; i++ {\n\t\ts := stageDurations[i]\n\t\tstagesStrings = append(stagesStrings, fmt.Sprintf(\"%s: %s\", s.name, s.d))\n\t}\n\n\treturn fmt.Sprintf(\"top %d stages: %s\", n, strings.Join(stagesStrings, \", \"))\n}\n\nfunc (s *Stopwatch) Print() {\n\tp := fmt.Sprintf(\"%s took %s\", s.name, time.Since(s.startedAt))\n\tif len(s.stages) == 0 {\n\t\ts.log.Infof(\"%s\", p)\n\t\treturn\n\t}\n\n\ts.log.Infof(\"%s with %s\", p, s.sprintStages())\n}\n\nfunc (s *Stopwatch) PrintStages() {\n\tvar stagesDuration time.Duration\n\tfor _, s := range s.stages {\n\t\tstagesDuration += s\n\t}\n\ts.log.Infof(\"%s took %s with %s\", s.name, stagesDuration, s.sprintStages())\n}\n\nfunc (s *Stopwatch) PrintTopStages(n int) {\n\tvar stagesDuration time.Duration\n\tfor _, s := range s.stages {\n\t\tstagesDuration += s\n\t}\n\ts.log.Infof(\"%s took %s with %s\", s.name, stagesDuration, s.sprintTopStages(n))\n}\n\nfunc (s *Stopwatch) TrackStage(name string, f func()) {\n\tstartedAt := time.Now()\n\tf()\n\n\ts.mu.Lock()\n\ts.stages[name] += time.Since(startedAt)\n\ts.mu.Unlock()\n}\n\nfunc (s *Stopwatch) TrackStageErr(name string, f func() error) error {\n\tstartedAt := time.Now()\n\terr := f()\n\n\ts.mu.Lock()\n\ts.stages[name] += time.Since(startedAt)\n\ts.mu.Unlock()\n\n\treturn err\n}\n\nfunc TrackStage[T any](s *Stopwatch, name string, f func() (T, error)) (T, error) {\n\tvar result T\n\tvar err error\n\n\ts.TrackStage(name, func() {\n\t\tresult, err = f()\n\t})\n\n\treturn result, err\n}\n"
  },
  {
    "path": "scripts/bench/bench_local.sh",
    "content": "#!/bin/bash -e\n\n# Benchmark with a local version\n# Usage: ./scripts/bench/bench_local.sh gosec v1.59.0\n\n# ex: gosec\nLINTER=$1\n\n# ex: v1.59.0\nVERSION=$2\n\n\nif [ -z \"$LINTER\" ] || [ -z \"$VERSION\" ]; then\n  cat <<-EOF\nMissing required arguments!\n\nUsage:   $0 <linter> <old version> <new version>\nExample: $0 gosec v1.58.1 v1.58.2\nEOF\n\n  exit 1\nfi\n\n## Clean\n\nfunction cleanBinaries() {\n  echo \"Clean binaries\"\n  rm \"./golangci-lint-${VERSION}\"\n  rm ./golangci-lint\n}\n\ntrap cleanBinaries EXIT\n\n## Download version\n\ncurl -sSfL https://golangci-lint.run/install.sh | sh -s -- -b \"./temp-${VERSION}\" \"${VERSION}\"\n\nmv \"temp-${VERSION}/golangci-lint\" \"./golangci-lint-${VERSION}\"\nrm -rf \"temp-${VERSION}\"\n\n## Build local version\n## use `go build` to set ldflags (it reduces some performance differences with binaries created by goreleaser)\n\ngo build -trimpath -ldflags '-s -w' -o golangci-lint ./cmd/golangci-lint\n\n## Run\n\nhyperfine --warmup 1 \\\n-n 'local' --prepare './golangci-lint cache clean' \"./golangci-lint run --issues-exit-code 0 ---output.text.print-issued-lines=false --enable-only ${LINTER}\" \\\n-n \"${VERSION}\" --prepare \"./golangci-lint-${VERSION} cache clean\" \"./golangci-lint-${VERSION} run --issues-exit-code 0 ---output.text.print-issued-lines=false --enable-only ${LINTER}\"\n"
  },
  {
    "path": "scripts/bench/bench_version.sh",
    "content": "#!/bin/bash -e\n\n# Benchmark between 2 existing versions\n# Usage: ./scripts/bench/bench_version.sh gosec v1.58.1 v1.58.2\n\n# ex: gosec\nLINTER=\"$1\"\n\n# ex: v1.58.1\nVERSION_OLD=\"$2\"\n# ex: v1.58.2\nVERSION_NEW=\"$3\"\n\nif [ -z \"$LINTER\" ] || [ -z \"$VERSION_OLD\" ] || [ -z \"$VERSION_NEW\" ]; then\n  cat <<-EOF\nMissing required arguments!\n\nUsage:   $0 <linter> <old version> <new version>\nExample: $0 gosec v1.58.1 v1.58.2\nEOF\n\n  exit 1\nfi\n\n## Clean\n\nfunction cleanBinaries() {\n  echo \"Clean binaries\"\n  rm \"./golangci-lint-${VERSION_OLD}\"\n  rm \"./golangci-lint-${VERSION_NEW}\"\n}\n\ntrap cleanBinaries EXIT\n\n## Install\n\nfunction install() {\n  local VERSION=$1\n\n  curl -sSfL https://golangci-lint.run/install.sh | sh -s -- -b \"./temp-${VERSION}\" \"${VERSION}\"\n\n  mv \"temp-${VERSION}/golangci-lint\" \"./golangci-lint-${VERSION}\"\n  rm -rf \"temp-${VERSION}\"\n}\n\n## VERSION_OLD\n\ninstall \"${VERSION_OLD}\"\n\n## VERSION_NEW\n\ninstall \"${VERSION_NEW}\"\n\n## Run\n\nhyperfine --warmup 1 \\\n-n \"${VERSION_OLD}\" --prepare \"./golangci-lint-${VERSION_OLD} cache clean\" \"./golangci-lint-${VERSION_OLD} run --issues-exit-code 0 --output.text.print-issued-lines=false --enable-only ${LINTER}\" \\\n-n \"${VERSION_NEW}\" --prepare \"./golangci-lint-${VERSION_NEW} cache clean\" \"./golangci-lint-${VERSION_NEW} run --issues-exit-code 0 --output.text.print-issued-lines=false --enable-only ${LINTER}\"\n"
  },
  {
    "path": "scripts/bench/readme.md",
    "content": "# Benchmarks\n\nThe script use [Hyperfine](https://github.com/sharkdp/hyperfine) to benchmark the command line of golangci-lint.\n\n## Benchmark one linter: with a local version\n\n```bash\nmake bench_local LINTER=gosec VERSION=v1.59.0\n```\n\n## Benchmark one linter: between 2 existing versions\n\n```bash\nmake bench_version LINTER=gosec VERSION_OLD=v1.58.1 VERSION_NEW=v1.59.0 \n```\n"
  },
  {
    "path": "scripts/gen_github_action_config/go.mod",
    "content": "module github.com/golangci/golangci-lint/v2/scripts/gen_github_action_config\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/shurcooL/githubv4 v0.0.0-20240727222349-48295856cce7\n\tgithub.com/stretchr/testify v1.11.1\n\tgolang.org/x/oauth2 v0.36.0\n)\n\nrequire (\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "scripts/gen_github_action_config/go.sum",
    "content": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/shurcooL/githubv4 v0.0.0-20240727222349-48295856cce7 h1:cYCy18SHPKRkvclm+pWm1Lk4YrREb4IOIb/YdFO0p2M=\ngithub.com/shurcooL/githubv4 v0.0.0-20240727222349-48295856cce7/go.mod h1:zqMwyHmnN/eDOZOdiTohqIUKUrTFX62PNlu7IJdu0q8=\ngithub.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 h1:17JxqqJY66GmZVHkmAsGEkcIu0oCe3AM420QDgGwZx0=\ngithub.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466/go.mod h1:9dIRpgIY7hVhoqfe0/FcYp0bpInZaT7dc3BYOprrIUE=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngolang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=\ngolang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "scripts/gen_github_action_config/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/shurcooL/githubv4\"\n\t\"golang.org/x/oauth2\"\n)\n\nconst noPatch = -1\n\nfunc main() {\n\tif err := run(context.Background()); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc run(ctx context.Context) error {\n\tif len(os.Args) != 2 {\n\t\treturn fmt.Errorf(\"usage: %s out-path.json\", filepath.Base(os.Args[0]))\n\t}\n\n\tallReleases, err := fetchAllReleases(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to fetch all releases: %w\", err)\n\t}\n\n\tdest := os.Args[1]\n\n\text := filepath.Ext(dest)\n\n\t// https://github.com/golangci/golangci-lint-action/blob/5421a116d2bf2a1d53595d0dca7da6e18bd1cfd7/src/version.ts#L43-L47\n\tminAllowedVersionV1 := version{major: 1, minor: 28, patch: 3}\n\n\t// For compatibility with v1: it should always be related to v1 only.\n\t// TODO(ldez): it should be removed but I don't know when.\n\terr = generate(allReleases, minAllowedVersionV1, dest)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to generate v1: %w\", err)\n\t}\n\n\tdestV1 := filepath.Join(filepath.Dir(dest), strings.TrimSuffix(filepath.Base(dest), ext)+\"-v1\"+ext)\n\n\terr = generate(allReleases, minAllowedVersionV1, destV1)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to generate v1: %w\", err)\n\t}\n\n\tdestV2 := filepath.Join(filepath.Dir(dest), strings.TrimSuffix(filepath.Base(dest), ext)+\"-v2\"+ext)\n\n\terr = generate(allReleases, version{major: 2, minor: 0, patch: 0}, destV2)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to generate v2: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc generate(allReleases []release, minAllowedVersion version, dest string) error {\n\tcfg, err := buildConfig(allReleases, minAllowedVersion)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to build config: %w\", err)\n\t}\n\n\toutFile, err := os.Create(dest)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create output config file: %w\", err)\n\t}\n\n\tdefer outFile.Close()\n\n\tenc := json.NewEncoder(outFile)\n\tenc.SetIndent(\"\", \"  \")\n\n\tif err = enc.Encode(cfg); err != nil {\n\t\treturn fmt.Errorf(\"failed to json encode config: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc fetchAllReleases(ctx context.Context) ([]release, error) {\n\tgithubToken := os.Getenv(\"GITHUB_TOKEN\")\n\tif githubToken == \"\" {\n\t\treturn nil, errors.New(\"no GITHUB_TOKEN environment variable\")\n\t}\n\n\tclient := githubv4.NewClient(oauth2.NewClient(ctx, oauth2.StaticTokenSource(&oauth2.Token{AccessToken: githubToken})))\n\n\tvar q struct {\n\t\tRepository struct {\n\t\t\tReleases struct {\n\t\t\t\tNodes    []release\n\t\t\t\tPageInfo struct {\n\t\t\t\t\tEndCursor   githubv4.String\n\t\t\t\t\tHasNextPage bool\n\t\t\t\t}\n\t\t\t} `graphql:\"releases(first: 50, orderBy: { field: CREATED_AT, direction: DESC }, after: $releasesCursor)\"`\n\t\t} `graphql:\"repository(owner: $owner, name: $name)\"`\n\t}\n\n\tvars := map[string]any{\n\t\t\"owner\":          githubv4.String(\"golangci\"),\n\t\t\"name\":           githubv4.String(\"golangci-lint\"),\n\t\t\"releasesCursor\": (*githubv4.String)(nil),\n\t}\n\n\tvar allReleases []release\n\tfor {\n\t\terr := client.Query(ctx, &q, vars)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to fetch releases page from GitHub: %w\", err)\n\t\t}\n\n\t\treleases := q.Repository.Releases\n\t\tallReleases = append(allReleases, releases.Nodes...)\n\n\t\tif !releases.PageInfo.HasNextPage {\n\t\t\tbreak\n\t\t}\n\n\t\tvars[\"releasesCursor\"] = githubv4.NewString(releases.PageInfo.EndCursor)\n\t}\n\n\treturn allReleases, nil\n}\n\nfunc buildConfig(releases []release, minAllowedVersion version) (*actionConfig, error) {\n\tversionToRelease := map[version]release{}\n\n\tfor _, rel := range releases {\n\t\tver, err := parseVersion(rel.TagName)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to parse release %s version: %w\", rel.TagName, err)\n\t\t}\n\n\t\tif _, ok := versionToRelease[*ver]; ok {\n\t\t\treturn nil, fmt.Errorf(\"duplicate release %s\", rel.TagName)\n\t\t}\n\n\t\tversionToRelease[*ver] = rel\n\t}\n\n\tmaxPatchReleases := map[string]version{}\n\n\tfor ver := range versionToRelease {\n\t\tkey := fmt.Sprintf(\"v%d.%d\", ver.major, ver.minor)\n\n\t\tif mapVer, ok := maxPatchReleases[key]; !ok || ver.isAfterOrEq(&mapVer) {\n\t\t\tmaxPatchReleases[key] = ver\n\t\t}\n\t}\n\n\tminorVersionToConfig := map[string]versionConfig{}\n\n\tlatestVersion := version{}\n\tlatestVersionConfig := versionConfig{}\n\n\tfor minorVersionedStr, maxPatchVersion := range maxPatchReleases {\n\t\tif minAllowedVersion.major < maxPatchVersion.major {\n\t\t\tminorVersionToConfig[minorVersionedStr] = versionConfig{\n\t\t\t\tError: fmt.Sprintf(\"golangci-lint version '%s' isn't supported: only v%d versions are supported\",\n\t\t\t\t\tminorVersionedStr, minAllowedVersion.major),\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif !maxPatchVersion.isAfterOrEq(&minAllowedVersion) {\n\t\t\tminorVersionToConfig[minorVersionedStr] = versionConfig{\n\t\t\t\tError: fmt.Sprintf(\"golangci-lint version '%s' isn't supported: we support only %s and later versions\",\n\t\t\t\t\tminorVersionedStr, minAllowedVersion),\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\terr := findLinuxAssetURL(&maxPatchVersion, versionToRelease[maxPatchVersion].ReleaseAssets.Nodes)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to find linux asset url for release %s: %w\", maxPatchVersion, err)\n\t\t}\n\n\t\tminorVersionToConfig[minorVersionedStr] = versionConfig{\n\t\t\tTargetVersion: maxPatchVersion.String(),\n\t\t}\n\n\t\tif maxPatchVersion.isAfterOrEq(&latestVersion) {\n\t\t\tlatestVersion = maxPatchVersion\n\t\t\tlatestVersionConfig.TargetVersion = maxPatchVersion.String()\n\t\t}\n\t}\n\n\tminorVersionToConfig[\"latest\"] = latestVersionConfig\n\n\treturn &actionConfig{MinorVersionToConfig: minorVersionToConfig}, nil\n}\n\nfunc findLinuxAssetURL(ver *version, releaseAssets []releaseAsset) error {\n\tpattern := fmt.Sprintf(\"golangci-lint-%d.%d.%d-linux-amd64.tar.gz\", ver.major, ver.minor, ver.patch)\n\n\tfor _, relAsset := range releaseAssets {\n\t\tif strings.HasSuffix(relAsset.DownloadURL, pattern) {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn fmt.Errorf(\"no matched asset url for pattern %q\", pattern)\n}\n\nfunc parseVersion(s string) (*version, error) {\n\tconst vPrefix = \"v\"\n\tif !strings.HasPrefix(s, vPrefix) {\n\t\treturn nil, fmt.Errorf(\"version %q should start with %q\", s, vPrefix)\n\t}\n\n\tvar nums []int\n\n\tfor part := range strings.SplitSeq(strings.TrimPrefix(s, vPrefix), \".\") {\n\t\tnum, err := strconv.Atoi(part)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to parse version %q: %w\", s, err)\n\t\t}\n\n\t\tnums = append(nums, num)\n\t}\n\n\tswitch len(nums) {\n\tcase 2:\n\t\treturn &version{major: nums[0], minor: nums[1], patch: noPatch}, nil\n\tcase 3:\n\t\treturn &version{major: nums[0], minor: nums[1], patch: nums[2]}, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"invalid version format: %s\", s)\n\t}\n}\n"
  },
  {
    "path": "scripts/gen_github_action_config/main_test.go",
    "content": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_buildConfig(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc       string\n\t\tinputPath  string\n\t\tminVersion version\n\t\texpected   string\n\t}{\n\t\t{\n\t\t\tdesc:       \"v1\",\n\t\t\tinputPath:  \"all-releases.json\",\n\t\t\tminVersion: version{major: 1, minor: 28, patch: 3},\n\t\t\texpected:   \"github-action-config.json\",\n\t\t},\n\t\t{\n\t\t\tdesc:       \"v1 only\",\n\t\t\tinputPath:  \"all-releases-v2.json\",\n\t\t\tminVersion: version{major: 1, minor: 28, patch: 3},\n\t\t\texpected:   \"github-action-config-v1.json\",\n\t\t},\n\t\t{\n\t\t\tdesc:       \"v2\",\n\t\t\tinputPath:  \"all-releases-v2.json\",\n\t\t\tminVersion: version{major: 2, minor: 0, patch: 0},\n\t\t\texpected:   \"github-action-config-v2.json\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tallReleases := unmarshalRelease(t, test.inputPath)\n\n\t\t\tconfig, err := buildConfig(allReleases, test.minVersion)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tdata, err := json.MarshalIndent(config, \"\", \"  \")\n\t\t\trequire.NoError(t, err)\n\n\t\t\texpected, err := os.ReadFile(filepath.Join(\"testdata\", test.expected))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.JSONEq(t, string(expected), string(data))\n\t\t})\n\t}\n}\n\nfunc unmarshalRelease(t *testing.T, filename string) []release {\n\tfile, err := os.Open(filepath.Join(\"testdata\", filename))\n\trequire.NoError(t, err)\n\n\tt.Cleanup(func() {\n\t\t_ = file.Close()\n\t})\n\n\tvar data []release\n\terr = json.NewDecoder(file).Decode(&data)\n\trequire.NoError(t, err)\n\n\treturn data\n}\n"
  },
  {
    "path": "scripts/gen_github_action_config/testdata/all-releases-v2.json",
    "content": "[\n  {\n    \"TagName\": \"v2.0.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v2.0.0/golangci-lint-2.0.0-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.62.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.62.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.61.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.60.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.60.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.60.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv6.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.59.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.59.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.58.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-loong64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.58.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.58.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.57.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.57.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.57.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.56.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-loong64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.56.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.56.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.55.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.55.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.55.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.54.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.54.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.54.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv6.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-loong64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.52.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.52.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.52.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.51.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.51.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.51.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.50.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.50.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.49.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.48.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.46.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.46.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-ppc64le.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.46.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.45.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.45.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv6.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.45.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.44.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-riscv64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.44.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64le.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.44.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv7.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.43.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-s390x.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.42.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv6.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.42.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.41.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-amd64.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.41.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-arm64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.40.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.40.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv7.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.39.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64le.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.38.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-s390x.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.37.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-s390x.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.37.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.36.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-arm64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.35.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-amd64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.35.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.35.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.34.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.34.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.33.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.33.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv7.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.33.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.32.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.32.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-amd64.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.32.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.31.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.30.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.29.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-amd64.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-arm64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.27.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint.exe-1.27.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint.exe-1.27.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.26.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.25.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-mips64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.25.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-s390x.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.24.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.8\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.7\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.6\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-s390x.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.22.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.22.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-darwin-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.22.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.20.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.21.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-ppc64le.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.20.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.19.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-arm64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.19.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.18.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.17.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.17.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-darwin-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.16.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.15.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.14.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.13.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.13.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.13\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.5\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.10.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.10.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.10\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-windows-386.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.8.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.8\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.6.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.6\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.5\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.4.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.7\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.6\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.5\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": []\n    }\n  },\n  {\n    \"TagName\": \"v1.3.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": []\n    }\n  }\n]\n"
  },
  {
    "path": "scripts/gen_github_action_config/testdata/all-releases.json",
    "content": "[\n  {\n    \"TagName\": \"v1.63.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.4/golangci-lint-1.63.4-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.3/golangci-lint-1.63.3-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.2/golangci-lint-1.63.2-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.1/golangci-lint-1.63.1-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.63.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.63.0/golangci-lint-1.63.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.62.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.2/golangci-lint-1.62.2-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.62.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.61.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.61.0/golangci-lint-1.61.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.60.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.3/golangci-lint-1.60.3-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.60.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.2/golangci-lint-1.60.2-linux-386.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.60.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.60.1/golangci-lint-1.60.1-linux-armv6.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.59.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.1/golangci-lint-1.59.1-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.59.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.59.0/golangci-lint-1.59.0-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.58.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.2/golangci-lint-1.58.2-linux-loong64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.58.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.1/golangci-lint-1.58.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.58.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.58.0/golangci-lint-1.58.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.57.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.2/golangci-lint-1.57.2-linux-mips64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.57.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.1/golangci-lint-1.57.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.57.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.57.0/golangci-lint-1.57.0-linux-mips64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.56.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.2/golangci-lint-1.56.2-linux-loong64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.56.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.1/golangci-lint-1.56.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.56.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.56.0/golangci-lint-1.56.0-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.55.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.2/golangci-lint-1.55.2-linux-mips64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.55.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.1/golangci-lint-1.55.1-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.55.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-mips64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.54.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.2/golangci-lint-1.54.2-linux-riscv64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.54.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.1/golangci-lint-1.54.1-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.54.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.54.0/golangci-lint-1.54.0-linux-armv6.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-illumos-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.3/golangci-lint-1.53.3-linux-loong64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.2/golangci-lint-1.53.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.1/golangci-lint-1.53.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.53.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.53.0/golangci-lint-1.53.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.52.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.2/golangci-lint-1.52.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.52.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.1/golangci-lint-1.52.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.52.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.52.0/golangci-lint-1.52.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.51.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-source.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.2/golangci-lint-1.51.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.51.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.1/golangci-lint-1.51.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.51.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-loong64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-netbsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-loong64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-loong64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.50.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.1/golangci-lint-1.50.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.50.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.50.0/golangci-lint-1.50.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.49.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.49.0/golangci-lint-1.49.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.48.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.48.0/golangci-lint-1.48.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.3/golangci-lint-1.47.3-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.2/golangci-lint-1.47.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.1/golangci-lint-1.47.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.47.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.47.0/golangci-lint-1.47.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.46.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.2/golangci-lint-1.46.2-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.46.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.1/golangci-lint-1.46.1-linux-ppc64le.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.46.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.46.0/golangci-lint-1.46.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.45.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.2/golangci-lint-1.45.2-linux-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.45.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.1/golangci-lint-1.45.1-linux-armv6.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.45.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.45.0/golangci-lint-1.45.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.44.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.2/golangci-lint-1.44.2-linux-riscv64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.44.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.1/golangci-lint-1.44.1-linux-mips64le.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.44.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.44.0/golangci-lint-1.44.0-linux-armv7.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.43.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.43.0/golangci-lint-1.43.0-linux-s390x.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.42.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-arm64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.1/golangci-lint-1.42.1-linux-armv6.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.42.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-riscv64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-riscv64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-riscv64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.42.0/golangci-lint-1.42.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.41.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.1/golangci-lint-1.41.1-linux-amd64.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.41.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-arm64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.40.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.1/golangci-lint-1.40.1-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.40.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-armv6.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-windows-armv7.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.40.0/golangci-lint-1.40.0-linux-armv7.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.39.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.39.0/golangci-lint-1.39.0-linux-mips64le.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.38.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-s390x.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.37.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-s390x.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.37.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-darwin-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-mips64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.37.0/golangci-lint-1.37.0-linux-armv7.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.36.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.36.0/golangci-lint-1.36.0-linux-arm64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.35.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.2/golangci-lint-1.35.2-linux-amd64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.35.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.1/golangci-lint-1.35.1-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.35.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.35.0/golangci-lint-1.35.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.34.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.1/golangci-lint-1.34.1-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.34.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.34.0/golangci-lint-1.34.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.33.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.1/golangci-lint-1.33.1-freebsd-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.33.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.2/golangci-lint-1.33.2-linux-armv7.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.33.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.33.0/golangci-lint-1.33.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.32.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.2/golangci-lint-1.32.2-freebsd-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.32.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.1/golangci-lint-1.32.1-linux-amd64.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.32.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.32.0/golangci-lint-1.32.0-linux-s390x.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.31.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.31.0/golangci-lint-1.31.0-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.30.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.30.0/golangci-lint-1.30.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.29.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.29.0/golangci-lint-1.29.0-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.3/golangci-lint-1.28.3-linux-amd64.deb\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.2/golangci-lint-1.28.2-linux-ppc64le.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.1/golangci-lint-1.28.1-linux-arm64.rpm\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.28.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-386.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-s390x.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-386.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-s390x.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-amd64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-ppc64le.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv6.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-amd64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-arm64.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv7.rpm\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-arm64.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv6.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv7.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-ppc64le.deb\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.28.0/golangci-lint-1.28.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.27.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint.exe-1.27.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint.exe-1.27.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.27.0/golangci-lint-1.27.0-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.26.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.26.0/golangci-lint-1.26.0-freebsd-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.25.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.1/golangci-lint-1.25.1-linux-mips64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.25.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.25.0/golangci-lint-1.25.0-linux-s390x.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.24.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.24.0/golangci-lint-1.24.0-freebsd-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.8\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.8/golangci-lint-1.23.8-linux-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.7\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.6\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-mips64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-mips64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.6/golangci-lint-1.23.6-linux-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.3/golangci-lint-1.23.3-linux-s390x.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.2/golangci-lint-1.23.2-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.1/golangci-lint-1.23.1-freebsd-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.23.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.23.0/golangci-lint-1.23.0-linux-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.22.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.2/golangci-lint-1.22.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.22.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.1/golangci-lint-1.22.1-darwin-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.22.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.22.0/golangci-lint-1.22.0-freebsd-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.20.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.1/golangci-lint-1.20.1-freebsd-armv7.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.21.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.21.0/golangci-lint-1.21.0-linux-ppc64le.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.20.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-ppc64le.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-s390x.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.20.0/golangci-lint-1.20.0-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.19.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.1/golangci-lint-1.19.1-linux-arm64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.19.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.19.0/golangci-lint-1.19.0-freebsd-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.18.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-arm64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-armv6.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-linux-armv7.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.18.0/golangci-lint-1.18.0-freebsd-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.17.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.1/golangci-lint-1.17.1-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.17.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.17.0/golangci-lint-1.17.0-darwin-386.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.16.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.16.0/golangci-lint-1.16.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.15.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.15.0/golangci-lint-1.15.0-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.14.0\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.14.0/golangci-lint-1.14.0-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.13.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.2/golangci-lint-1.13.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.13.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13.1/golangci-lint-1.13.1-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.13\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.13/golangci-lint-1.13-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.5\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.5/golangci-lint-1.12.5-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.4/golangci-lint-1.12.4-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.3/golangci-lint-1.12.3-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.2/golangci-lint-1.12.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12.1/golangci-lint-1.12.1-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.12\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.12/golangci-lint-1.12-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.3/golangci-lint-1.11.3-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.2/golangci-lint-1.11.2-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11.1/golangci-lint-1.11.1-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.11\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.11/golangci-lint-1.11-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.10.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.2/golangci-lint-1.10.2-linux-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.10.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10.1/golangci-lint-1.10.1-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.10\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.10/golangci-lint-1.10-windows-amd64.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.3/golangci-lint-1.9.3-darwin-amd64.tar.gz\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-checksums.txt\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.2/golangci-lint-1.9.2-windows-386.zip\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9.1/golangci-lint-1.9.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.9\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.9/golangci-lint-1.9-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.8.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8.1/golangci-lint-1.8.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.8\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.8/golangci-lint-1.8-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.3/golangci-lint-1.7.3-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7.2\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.2/golangci-lint-1.7.2-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7.1/golangci-lint-1.7.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.7\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.7/golangci-lint-1.7-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.6.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6.1/golangci-lint-1.6.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.6\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.6/golangci-lint-1.6-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.5\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.5/golangci-lint-1.5-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.4.1\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4.1/golangci-lint-1.4.1-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.4/golangci-lint-1.4-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.7\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.7/golangci-lint-1.3.7-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.6\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.6/golangci-lint-1.3.6-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.5\",\n    \"ReleaseAssets\": {\n      \"Nodes\": [\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-linux-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-windows-386.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-windows-amd64.zip\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-darwin-386.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-linux-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-darwin-amd64.tar.gz\"\n        },\n        {\n          \"DownloadURL\": \"https://github.com/golangci/golangci-lint/releases/download/v1.3.5/golangci-lint-1.3.5-checksums.txt\"\n        }\n      ]\n    }\n  },\n  {\n    \"TagName\": \"v1.3.4\",\n    \"ReleaseAssets\": {\n      \"Nodes\": []\n    }\n  },\n  {\n    \"TagName\": \"v1.3.3\",\n    \"ReleaseAssets\": {\n      \"Nodes\": []\n    }\n  }\n]\n"
  },
  {
    "path": "scripts/gen_github_action_config/testdata/github-action-config-v1.json",
    "content": "{\n  \"MinorVersionToConfig\": {\n    \"latest\": {\n      \"TargetVersion\": \"v1.63.4\"\n    },\n    \"v1.10\": {\n      \"Error\": \"golangci-lint version 'v1.10' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.11\": {\n      \"Error\": \"golangci-lint version 'v1.11' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.12\": {\n      \"Error\": \"golangci-lint version 'v1.12' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.13\": {\n      \"Error\": \"golangci-lint version 'v1.13' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.14\": {\n      \"Error\": \"golangci-lint version 'v1.14' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.15\": {\n      \"Error\": \"golangci-lint version 'v1.15' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.16\": {\n      \"Error\": \"golangci-lint version 'v1.16' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.17\": {\n      \"Error\": \"golangci-lint version 'v1.17' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.18\": {\n      \"Error\": \"golangci-lint version 'v1.18' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.19\": {\n      \"Error\": \"golangci-lint version 'v1.19' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.20\": {\n      \"Error\": \"golangci-lint version 'v1.20' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.21\": {\n      \"Error\": \"golangci-lint version 'v1.21' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.22\": {\n      \"Error\": \"golangci-lint version 'v1.22' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.23\": {\n      \"Error\": \"golangci-lint version 'v1.23' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.24\": {\n      \"Error\": \"golangci-lint version 'v1.24' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.25\": {\n      \"Error\": \"golangci-lint version 'v1.25' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.26\": {\n      \"Error\": \"golangci-lint version 'v1.26' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.27\": {\n      \"Error\": \"golangci-lint version 'v1.27' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.28\": {\n      \"TargetVersion\": \"v1.28.3\"\n    },\n    \"v1.29\": {\n      \"TargetVersion\": \"v1.29.0\"\n    },\n    \"v1.3\": {\n      \"Error\": \"golangci-lint version 'v1.3' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.30\": {\n      \"TargetVersion\": \"v1.30.0\"\n    },\n    \"v1.31\": {\n      \"TargetVersion\": \"v1.31.0\"\n    },\n    \"v1.32\": {\n      \"TargetVersion\": \"v1.32.2\"\n    },\n    \"v1.33\": {\n      \"TargetVersion\": \"v1.33.2\"\n    },\n    \"v1.34\": {\n      \"TargetVersion\": \"v1.34.1\"\n    },\n    \"v1.35\": {\n      \"TargetVersion\": \"v1.35.2\"\n    },\n    \"v1.36\": {\n      \"TargetVersion\": \"v1.36.0\"\n    },\n    \"v1.37\": {\n      \"TargetVersion\": \"v1.37.1\"\n    },\n    \"v1.38\": {\n      \"TargetVersion\": \"v1.38.0\"\n    },\n    \"v1.39\": {\n      \"TargetVersion\": \"v1.39.0\"\n    },\n    \"v1.4\": {\n      \"Error\": \"golangci-lint version 'v1.4' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.40\": {\n      \"TargetVersion\": \"v1.40.1\"\n    },\n    \"v1.41\": {\n      \"TargetVersion\": \"v1.41.1\"\n    },\n    \"v1.42\": {\n      \"TargetVersion\": \"v1.42.1\"\n    },\n    \"v1.43\": {\n      \"TargetVersion\": \"v1.43.0\"\n    },\n    \"v1.44\": {\n      \"TargetVersion\": \"v1.44.2\"\n    },\n    \"v1.45\": {\n      \"TargetVersion\": \"v1.45.2\"\n    },\n    \"v1.46\": {\n      \"TargetVersion\": \"v1.46.2\"\n    },\n    \"v1.47\": {\n      \"TargetVersion\": \"v1.47.3\"\n    },\n    \"v1.48\": {\n      \"TargetVersion\": \"v1.48.0\"\n    },\n    \"v1.49\": {\n      \"TargetVersion\": \"v1.49.0\"\n    },\n    \"v1.5\": {\n      \"Error\": \"golangci-lint version 'v1.5' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.50\": {\n      \"TargetVersion\": \"v1.50.1\"\n    },\n    \"v1.51\": {\n      \"TargetVersion\": \"v1.51.2\"\n    },\n    \"v1.52\": {\n      \"TargetVersion\": \"v1.52.2\"\n    },\n    \"v1.53\": {\n      \"TargetVersion\": \"v1.53.3\"\n    },\n    \"v1.54\": {\n      \"TargetVersion\": \"v1.54.2\"\n    },\n    \"v1.55\": {\n      \"TargetVersion\": \"v1.55.2\"\n    },\n    \"v1.56\": {\n      \"TargetVersion\": \"v1.56.2\"\n    },\n    \"v1.57\": {\n      \"TargetVersion\": \"v1.57.2\"\n    },\n    \"v1.58\": {\n      \"TargetVersion\": \"v1.58.2\"\n    },\n    \"v1.59\": {\n      \"TargetVersion\": \"v1.59.1\"\n    },\n    \"v1.6\": {\n      \"Error\": \"golangci-lint version 'v1.6' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.60\": {\n      \"TargetVersion\": \"v1.60.3\"\n    },\n    \"v1.61\": {\n      \"TargetVersion\": \"v1.61.0\"\n    },\n    \"v1.62\": {\n      \"TargetVersion\": \"v1.62.2\"\n    },\n    \"v1.63\": {\n      \"TargetVersion\": \"v1.63.4\"\n    },\n    \"v1.7\": {\n      \"Error\": \"golangci-lint version 'v1.7' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.8\": {\n      \"Error\": \"golangci-lint version 'v1.8' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.9\": {\n      \"Error\": \"golangci-lint version 'v1.9' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v2.0\": {\n      \"Error\": \"golangci-lint version 'v2.0' isn't supported: only v1 versions are supported\"\n    }\n  }\n}\n"
  },
  {
    "path": "scripts/gen_github_action_config/testdata/github-action-config-v2.json",
    "content": "{\n  \"MinorVersionToConfig\": {\n    \"latest\": {\n      \"TargetVersion\": \"v2.0.0\"\n    },\n    \"v1.10\": {\n      \"Error\": \"golangci-lint version 'v1.10' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.11\": {\n      \"Error\": \"golangci-lint version 'v1.11' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.12\": {\n      \"Error\": \"golangci-lint version 'v1.12' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.13\": {\n      \"Error\": \"golangci-lint version 'v1.13' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.14\": {\n      \"Error\": \"golangci-lint version 'v1.14' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.15\": {\n      \"Error\": \"golangci-lint version 'v1.15' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.16\": {\n      \"Error\": \"golangci-lint version 'v1.16' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.17\": {\n      \"Error\": \"golangci-lint version 'v1.17' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.18\": {\n      \"Error\": \"golangci-lint version 'v1.18' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.19\": {\n      \"Error\": \"golangci-lint version 'v1.19' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.20\": {\n      \"Error\": \"golangci-lint version 'v1.20' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.21\": {\n      \"Error\": \"golangci-lint version 'v1.21' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.22\": {\n      \"Error\": \"golangci-lint version 'v1.22' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.23\": {\n      \"Error\": \"golangci-lint version 'v1.23' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.24\": {\n      \"Error\": \"golangci-lint version 'v1.24' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.25\": {\n      \"Error\": \"golangci-lint version 'v1.25' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.26\": {\n      \"Error\": \"golangci-lint version 'v1.26' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.27\": {\n      \"Error\": \"golangci-lint version 'v1.27' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.28\": {\n      \"Error\": \"golangci-lint version 'v1.28' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.29\": {\n      \"Error\": \"golangci-lint version 'v1.29' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.3\": {\n      \"Error\": \"golangci-lint version 'v1.3' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.30\": {\n      \"Error\": \"golangci-lint version 'v1.30' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.31\": {\n      \"Error\": \"golangci-lint version 'v1.31' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.32\": {\n      \"Error\": \"golangci-lint version 'v1.32' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.33\": {\n      \"Error\": \"golangci-lint version 'v1.33' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.34\": {\n      \"Error\": \"golangci-lint version 'v1.34' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.35\": {\n      \"Error\": \"golangci-lint version 'v1.35' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.36\": {\n      \"Error\": \"golangci-lint version 'v1.36' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.37\": {\n      \"Error\": \"golangci-lint version 'v1.37' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.38\": {\n      \"Error\": \"golangci-lint version 'v1.38' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.39\": {\n      \"Error\": \"golangci-lint version 'v1.39' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.4\": {\n      \"Error\": \"golangci-lint version 'v1.4' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.40\": {\n      \"Error\": \"golangci-lint version 'v1.40' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.41\": {\n      \"Error\": \"golangci-lint version 'v1.41' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.42\": {\n      \"Error\": \"golangci-lint version 'v1.42' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.43\": {\n      \"Error\": \"golangci-lint version 'v1.43' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.44\": {\n      \"Error\": \"golangci-lint version 'v1.44' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.45\": {\n      \"Error\": \"golangci-lint version 'v1.45' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.46\": {\n      \"Error\": \"golangci-lint version 'v1.46' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.47\": {\n      \"Error\": \"golangci-lint version 'v1.47' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.48\": {\n      \"Error\": \"golangci-lint version 'v1.48' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.49\": {\n      \"Error\": \"golangci-lint version 'v1.49' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.5\": {\n      \"Error\": \"golangci-lint version 'v1.5' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.50\": {\n      \"Error\": \"golangci-lint version 'v1.50' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.51\": {\n      \"Error\": \"golangci-lint version 'v1.51' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.52\": {\n      \"Error\": \"golangci-lint version 'v1.52' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.53\": {\n      \"Error\": \"golangci-lint version 'v1.53' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.54\": {\n      \"Error\": \"golangci-lint version 'v1.54' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.55\": {\n      \"Error\": \"golangci-lint version 'v1.55' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.56\": {\n      \"Error\": \"golangci-lint version 'v1.56' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.57\": {\n      \"Error\": \"golangci-lint version 'v1.57' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.58\": {\n      \"Error\": \"golangci-lint version 'v1.58' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.59\": {\n      \"Error\": \"golangci-lint version 'v1.59' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.6\": {\n      \"Error\": \"golangci-lint version 'v1.6' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.60\": {\n      \"Error\": \"golangci-lint version 'v1.60' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.61\": {\n      \"Error\": \"golangci-lint version 'v1.61' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.62\": {\n      \"Error\": \"golangci-lint version 'v1.62' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.63\": {\n      \"Error\": \"golangci-lint version 'v1.63' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.7\": {\n      \"Error\": \"golangci-lint version 'v1.7' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.8\": {\n      \"Error\": \"golangci-lint version 'v1.8' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v1.9\": {\n      \"Error\": \"golangci-lint version 'v1.9' isn't supported: we support only v2.0.0 and later versions\"\n    },\n    \"v2.0\": {\n      \"TargetVersion\": \"v2.0.0\"\n    }\n  }\n}\n"
  },
  {
    "path": "scripts/gen_github_action_config/testdata/github-action-config.json",
    "content": "{\n  \"MinorVersionToConfig\": {\n    \"latest\": {\n      \"TargetVersion\": \"v1.63.4\"\n    },\n    \"v1.10\": {\n      \"Error\": \"golangci-lint version 'v1.10' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.11\": {\n      \"Error\": \"golangci-lint version 'v1.11' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.12\": {\n      \"Error\": \"golangci-lint version 'v1.12' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.13\": {\n      \"Error\": \"golangci-lint version 'v1.13' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.14\": {\n      \"Error\": \"golangci-lint version 'v1.14' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.15\": {\n      \"Error\": \"golangci-lint version 'v1.15' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.16\": {\n      \"Error\": \"golangci-lint version 'v1.16' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.17\": {\n      \"Error\": \"golangci-lint version 'v1.17' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.18\": {\n      \"Error\": \"golangci-lint version 'v1.18' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.19\": {\n      \"Error\": \"golangci-lint version 'v1.19' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.20\": {\n      \"Error\": \"golangci-lint version 'v1.20' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.21\": {\n      \"Error\": \"golangci-lint version 'v1.21' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.22\": {\n      \"Error\": \"golangci-lint version 'v1.22' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.23\": {\n      \"Error\": \"golangci-lint version 'v1.23' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.24\": {\n      \"Error\": \"golangci-lint version 'v1.24' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.25\": {\n      \"Error\": \"golangci-lint version 'v1.25' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.26\": {\n      \"Error\": \"golangci-lint version 'v1.26' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.27\": {\n      \"Error\": \"golangci-lint version 'v1.27' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.28\": {\n      \"TargetVersion\": \"v1.28.3\"\n    },\n    \"v1.29\": {\n      \"TargetVersion\": \"v1.29.0\"\n    },\n    \"v1.3\": {\n      \"Error\": \"golangci-lint version 'v1.3' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.30\": {\n      \"TargetVersion\": \"v1.30.0\"\n    },\n    \"v1.31\": {\n      \"TargetVersion\": \"v1.31.0\"\n    },\n    \"v1.32\": {\n      \"TargetVersion\": \"v1.32.2\"\n    },\n    \"v1.33\": {\n      \"TargetVersion\": \"v1.33.2\"\n    },\n    \"v1.34\": {\n      \"TargetVersion\": \"v1.34.1\"\n    },\n    \"v1.35\": {\n      \"TargetVersion\": \"v1.35.2\"\n    },\n    \"v1.36\": {\n      \"TargetVersion\": \"v1.36.0\"\n    },\n    \"v1.37\": {\n      \"TargetVersion\": \"v1.37.1\"\n    },\n    \"v1.38\": {\n      \"TargetVersion\": \"v1.38.0\"\n    },\n    \"v1.39\": {\n      \"TargetVersion\": \"v1.39.0\"\n    },\n    \"v1.4\": {\n      \"Error\": \"golangci-lint version 'v1.4' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.40\": {\n      \"TargetVersion\": \"v1.40.1\"\n    },\n    \"v1.41\": {\n      \"TargetVersion\": \"v1.41.1\"\n    },\n    \"v1.42\": {\n      \"TargetVersion\": \"v1.42.1\"\n    },\n    \"v1.43\": {\n      \"TargetVersion\": \"v1.43.0\"\n    },\n    \"v1.44\": {\n      \"TargetVersion\": \"v1.44.2\"\n    },\n    \"v1.45\": {\n      \"TargetVersion\": \"v1.45.2\"\n    },\n    \"v1.46\": {\n      \"TargetVersion\": \"v1.46.2\"\n    },\n    \"v1.47\": {\n      \"TargetVersion\": \"v1.47.3\"\n    },\n    \"v1.48\": {\n      \"TargetVersion\": \"v1.48.0\"\n    },\n    \"v1.49\": {\n      \"TargetVersion\": \"v1.49.0\"\n    },\n    \"v1.5\": {\n      \"Error\": \"golangci-lint version 'v1.5' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.50\": {\n      \"TargetVersion\": \"v1.50.1\"\n    },\n    \"v1.51\": {\n      \"TargetVersion\": \"v1.51.2\"\n    },\n    \"v1.52\": {\n      \"TargetVersion\": \"v1.52.2\"\n    },\n    \"v1.53\": {\n      \"TargetVersion\": \"v1.53.3\"\n    },\n    \"v1.54\": {\n      \"TargetVersion\": \"v1.54.2\"\n    },\n    \"v1.55\": {\n      \"TargetVersion\": \"v1.55.2\"\n    },\n    \"v1.56\": {\n      \"TargetVersion\": \"v1.56.2\"\n    },\n    \"v1.57\": {\n      \"TargetVersion\": \"v1.57.2\"\n    },\n    \"v1.58\": {\n      \"TargetVersion\": \"v1.58.2\"\n    },\n    \"v1.59\": {\n      \"TargetVersion\": \"v1.59.1\"\n    },\n    \"v1.6\": {\n      \"Error\": \"golangci-lint version 'v1.6' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.60\": {\n      \"TargetVersion\": \"v1.60.3\"\n    },\n    \"v1.61\": {\n      \"TargetVersion\": \"v1.61.0\"\n    },\n    \"v1.62\": {\n      \"TargetVersion\": \"v1.62.2\"\n    },\n    \"v1.63\": {\n      \"TargetVersion\": \"v1.63.4\"\n    },\n    \"v1.7\": {\n      \"Error\": \"golangci-lint version 'v1.7' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.8\": {\n      \"Error\": \"golangci-lint version 'v1.8' isn't supported: we support only v1.28.3 and later versions\"\n    },\n    \"v1.9\": {\n      \"Error\": \"golangci-lint version 'v1.9' isn't supported: we support only v1.28.3 and later versions\"\n    }\n  }\n}\n"
  },
  {
    "path": "scripts/gen_github_action_config/types.go",
    "content": "package main\n\nimport \"fmt\"\n\ntype versionConfig struct {\n\tError string `json:\",omitempty\"`\n\n\tTargetVersion string `json:\",omitempty\"`\n}\n\ntype actionConfig struct {\n\tMinorVersionToConfig map[string]versionConfig\n}\n\ntype version struct {\n\tmajor, minor, patch int\n}\n\nfunc (v version) String() string {\n\tret := fmt.Sprintf(\"v%d.%d\", v.major, v.minor)\n\n\tif v.patch != noPatch {\n\t\tret += fmt.Sprintf(\".%d\", v.patch)\n\t}\n\n\treturn ret\n}\n\nfunc (v version) isAfterOrEq(vv *version) bool {\n\tif v.major != vv.major {\n\t\treturn v.major >= vv.major\n\t}\n\n\tif v.minor != vv.minor {\n\t\treturn v.minor >= vv.minor\n\t}\n\n\treturn v.patch >= vv.patch\n}\n\ntype release struct {\n\tTagName       string\n\tReleaseAssets struct {\n\t\tNodes []releaseAsset\n\t} `graphql:\"releaseAssets(first: 50)\"`\n}\n\ntype releaseAsset struct {\n\tDownloadURL string\n}\n"
  },
  {
    "path": "scripts/print_ast/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"log\"\n)\n\nfunc main() {\n\tvar filename string\n\tflag.StringVar(&filename, \"f\", \"\", \"input file\")\n\tflag.Parse()\n\n\tfset := token.NewFileSet()\n\tf, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to parse file %s: %s\", filename, err)\n\t}\n\tast.Print(fset, f)\n}\n"
  },
  {
    "path": "scripts/website/copy_jsonschema/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\n\thcversion \"github.com/hashicorp/go-version\"\n\n\t\"github.com/golangci/golangci-lint/v2/scripts/website/github\"\n)\n\nfunc main() {\n\terr := copySchemas()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc copySchemas() error {\n\tdstDir := filepath.FromSlash(\"docs/static/jsonschema/\")\n\n\terr := os.RemoveAll(dstDir)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"remove dir: %w\", err)\n\t}\n\n\terr = os.CopyFS(dstDir, os.DirFS(\"jsonschema\"))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"copy FS: %w\", err)\n\t}\n\n\terr = copyLatestSchema(dstDir)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"copy files: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc copyLatestSchema(dstDir string) error {\n\tsrc := filepath.FromSlash(\"jsonschema/golangci.jsonschema.json\")\n\n\tlatest, err := github.GetLatestVersion()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get latest release version: %w\", err)\n\t}\n\n\tversion, err := hcversion.NewVersion(latest)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"parse version: %w\", err)\n\t}\n\n\tfiles := []string{\n\t\tfmt.Sprintf(\"golangci.v%d.jsonschema.json\", version.Segments()[0]),\n\t\tfmt.Sprintf(\"golangci.v%d.%d.jsonschema.json\", version.Segments()[0], version.Segments()[1]),\n\t}\n\n\tfor _, dst := range files {\n\t\terr = copyFile(filepath.Join(dstDir, dst), src)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"copy file %s to %s: %w\", src, dst, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc copyFile(dst, src string) error {\n\tsource, err := os.Open(src)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open file %s: %w\", src, err)\n\t}\n\n\tdefer func() { _ = source.Close() }()\n\n\tinfo, err := source.Stat()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"file %s not found: %w\", src, err)\n\t}\n\n\tdestination, err := os.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, info.Mode())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create file %s: %w\", dst, err)\n\t}\n\n\tdefer func() { _ = destination.Close() }()\n\n\t_, err = io.Copy(destination, source)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "scripts/website/dump_info/cmd_help.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/scripts/website/types\"\n)\n\nfunc saveCLIHelp(ctx context.Context, dst string) error {\n\terr := exec.CommandContext(ctx, \"make\", \"build\").Run()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't run make build: %w\", err)\n\t}\n\n\tlintersOut, err := exec.CommandContext(ctx, \"./golangci-lint\", \"help\", \"linters\").Output()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"can't run linters cmd: %w\", err)\n\t}\n\n\tlintersOutParts := bytes.Split(lintersOut, []byte(\"\\n\\n\"))\n\n\tdata := types.CLIHelp{\n\t\tEnable: string(lintersOutParts[0]),\n\t}\n\n\tdata.RootCmdHelp, err = getCmdHelp(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.RunCmdHelp, err = getCmdHelp(ctx, \"run\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.LintersCmdHelp, err = getCmdHelp(ctx, \"linters\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.FmtCmdHelp, err = getCmdHelp(ctx, \"fmt\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.FormattersCmdHelp, err = getCmdHelp(ctx, \"formatters\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.HelpCmdHelp, err = getCmdHelp(ctx, \"help\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.ConfigCmdHelp, err = getCmdHelp(ctx, \"config\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.MigrateCmdHelp, err = getCmdHelp(ctx, \"migrate\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.CustomCmdHelp, err = getCmdHelp(ctx, \"custom\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.CacheCmdHelp, err = getCmdHelp(ctx, \"cache\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.VersionCmdHelp, err = getCmdHelp(ctx, \"version\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata.CompletionCmdHelp, err = getCmdHelp(ctx, \"completion\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn saveToJSONFile(dst, data)\n}\n\nfunc getCmdHelp(ctx context.Context, names ...string) (string, error) {\n\targs := slices.Clone(names)\n\targs = append(args, \"--help\")\n\n\thelpCmd := exec.CommandContext(ctx, \"./golangci-lint\", args...)\n\thelpCmd.Env = append(helpCmd.Env, os.Environ()...)\n\n\thelp, err := helpCmd.Output()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"can't run help cmd: %w\", err)\n\t}\n\n\treturn string(help), nil\n}\n"
  },
  {
    "path": "scripts/website/dump_info/default_exclusions.go",
    "content": "package main\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/pkg/result/processors\"\n\t\"github.com/golangci/golangci-lint/v2/scripts/website/types\"\n)\n\nfunc saveDefaultExclusions(dst string) error {\n\tdata := make(map[string][]types.ExcludeRule)\n\n\tfor name, rules := range processors.LinterExclusionPresets {\n\t\tfor _, rule := range rules {\n\t\t\tdata[name] = append(data[name], types.ExcludeRule{\n\t\t\t\tLinters:    rule.Linters,\n\t\t\t\tPath:       rule.Path,\n\t\t\t\tPathExcept: rule.PathExcept,\n\t\t\t\tText:       rule.Text,\n\t\t\t\tSource:     rule.Source,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn saveToJSONFile(dst, data)\n}\n"
  },
  {
    "path": "scripts/website/dump_info/formatters.go",
    "content": "package main\n\nimport (\n\t\"maps\"\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/scripts/website/types\"\n)\n\nfunc saveFormatters(dst string) error {\n\tlinters, _ := lintersdb.NewLinterBuilder().Build(config.NewDefault())\n\n\tvar wraps []types.LinterWrapper\n\tfor _, l := range linters {\n\t\tif l.IsDeprecated() && l.Deprecation.Level > linter.DeprecationWarning {\n\t\t\tcontinue\n\t\t}\n\n\t\tif !goformatters.IsFormatter(l.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\twrapper := types.LinterWrapper{\n\t\t\tName:             l.Linter.Name(),\n\t\t\tDesc:             l.Linter.Desc(),\n\t\t\tGroups:           slices.AppendSeq(make([]string, 0, len(l.Groups)), maps.Keys(l.Groups)),\n\t\t\tLoadMode:         l.LoadMode,\n\t\t\tAlternativeNames: l.AlternativeNames,\n\t\t\tOriginalURL:      l.OriginalURL,\n\t\t\tInternal:         l.Internal,\n\t\t\tCanAutoFix:       l.CanAutoFix,\n\t\t\tIsSlow:           l.IsSlow,\n\t\t\tDoesChangeTypes:  l.DoesChangeTypes,\n\t\t\tSince:            l.Since,\n\t\t}\n\n\t\tif l.Deprecation != nil {\n\t\t\twrapper.Deprecation = &types.Deprecation{\n\t\t\t\tSince:       l.Deprecation.Since,\n\t\t\t\tMessage:     l.Deprecation.Message,\n\t\t\t\tReplacement: l.Deprecation.Replacement,\n\t\t\t}\n\t\t}\n\n\t\twraps = append(wraps, wrapper)\n\t}\n\n\treturn saveToJSONFile(dst, wraps)\n}\n"
  },
  {
    "path": "scripts/website/dump_info/linters.go",
    "content": "package main\n\nimport (\n\t\"maps\"\n\t\"slices\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/goformatters\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/scripts/website/types\"\n)\n\nfunc saveLinters(dst string) error {\n\tlinters, _ := lintersdb.NewLinterBuilder().Build(config.NewDefault())\n\n\tvar wraps []types.LinterWrapper\n\tfor _, l := range linters {\n\t\tif l.IsDeprecated() && l.Deprecation.Level > linter.DeprecationWarning {\n\t\t\tcontinue\n\t\t}\n\n\t\tif goformatters.IsFormatter(l.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\twrapper := types.LinterWrapper{\n\t\t\tName:             l.Linter.Name(),\n\t\t\tDesc:             l.Linter.Desc(),\n\t\t\tGroups:           slices.AppendSeq(make([]string, 0, len(l.Groups)), maps.Keys(l.Groups)),\n\t\t\tLoadMode:         l.LoadMode,\n\t\t\tAlternativeNames: l.AlternativeNames,\n\t\t\tOriginalURL:      l.OriginalURL,\n\t\t\tInternal:         l.Internal,\n\t\t\tCanAutoFix:       l.CanAutoFix,\n\t\t\tIsSlow:           l.IsSlow,\n\t\t\tDoesChangeTypes:  l.DoesChangeTypes,\n\t\t\tSince:            l.Since,\n\t\t}\n\n\t\tif l.Deprecation != nil {\n\t\t\twrapper.Deprecation = &types.Deprecation{\n\t\t\t\tSince:       l.Deprecation.Since,\n\t\t\t\tMessage:     l.Deprecation.Message,\n\t\t\t\tReplacement: l.Deprecation.Replacement,\n\t\t\t}\n\t\t}\n\n\t\twraps = append(wraps, wrapper)\n\t}\n\n\treturn saveToJSONFile(dst, wraps)\n}\n"
  },
  {
    "path": "scripts/website/dump_info/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc main() {\n\tdataDir := filepath.Join(\"docs\", \"data\")\n\n\terr := saveLinters(filepath.Join(dataDir, \"linters_info.json\"))\n\tif err != nil {\n\t\tlog.Fatalf(\"Save linters: %v\", err)\n\t}\n\n\terr = saveFormatters(filepath.Join(dataDir, \"formatters_info.json\"))\n\tif err != nil {\n\t\tlog.Fatalf(\"Save formatters: %v\", err)\n\t}\n\n\terr = saveDefaultExclusions(filepath.Join(dataDir, \"exclusion_presets.json\"))\n\tif err != nil {\n\t\tlog.Fatalf(\"Save default exclusions: %v\", err)\n\t}\n\n\terr = saveCLIHelp(context.Background(), filepath.Join(dataDir, \"cli_help.json\"))\n\tif err != nil {\n\t\tlog.Fatalf(\"Save CLI help: %v\", err)\n\t}\n\n\terr = saveThanksList(filepath.Join(dataDir, \"thanks.json\"))\n\tif err != nil {\n\t\tlog.Fatalf(\"Save thanks list: %v\", err)\n\t}\n}\n\nfunc saveToJSONFile(dst string, data any) error {\n\tfile, err := os.Create(dst)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open file (%s): %w\", dst, err)\n\t}\n\n\tdefer func() { _ = file.Close() }()\n\n\tencoder := json.NewEncoder(file)\n\tencoder.SetIndent(\"\", \"  \")\n\n\terr = encoder.Encode(data)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"encode JSON (%s): %w\", dst, err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "scripts/website/dump_info/thanks.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n\t\"regexp\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n)\n\nconst (\n\thostGitHub   = \"github\"\n\thostGitLab   = \"gitlab\"\n\thostCodeberg = \"codeberg\"\n)\n\ntype authorDetails struct {\n\tName    string   `json:\"name\"`\n\tLinters []string `json:\"linters\"`\n\tProfile string   `json:\"profile\"`\n\tAvatar  string   `json:\"avatar\"`\n}\n\nfunc saveThanksList(dst string) error {\n\treturn saveToJSONFile(dst, getThanksList())\n}\n\nfunc getThanksList() []*authorDetails {\n\taddedAuthors := map[string]*authorDetails{}\n\n\tlinters, _ := lintersdb.NewLinterBuilder().Build(config.NewDefault())\n\n\tfor _, lc := range linters {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif lc.OriginalURL == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tif lc.IsDeprecated() && lc.Deprecation.Level > linter.DeprecationWarning {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfo := extractInfo(lc)\n\n\t\tswitch {\n\t\tcase info.FromGitHub():\n\t\t\tif _, ok := addedAuthors[info.Author]; ok {\n\t\t\t\taddedAuthors[info.Author].Linters = append(addedAuthors[info.Author].Linters, lc.Name())\n\t\t\t} else {\n\t\t\t\taddedAuthors[info.Author] = &authorDetails{\n\t\t\t\t\tName:    info.Author,\n\t\t\t\t\tLinters: []string{lc.Name()},\n\t\t\t\t\tProfile: fmt.Sprintf(\"https://github.com/sponsors/%s\", info.Author),\n\t\t\t\t\tAvatar:  fmt.Sprintf(\"https://github.com/%[1]s.png\", info.Author),\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase info.FromGitLab():\n\t\t\tif _, ok := addedAuthors[info.Author]; ok {\n\t\t\t\taddedAuthors[info.Author].Linters = append(addedAuthors[info.Author].Linters, lc.Name())\n\t\t\t} else {\n\t\t\t\tghAuthor := info.Author\n\t\t\t\tif info.Author == \"bosi\" {\n\t\t\t\t\tghAuthor = \"bosix\"\n\t\t\t\t}\n\n\t\t\t\taddedAuthors[info.Author] = &authorDetails{\n\t\t\t\t\tName:    info.Author,\n\t\t\t\t\tLinters: []string{lc.Name()},\n\t\t\t\t\tProfile: fmt.Sprintf(\"https://gitlab.com/%[1]s\", info.Author),\n\t\t\t\t\tAvatar:  fmt.Sprintf(\"https://github.com/%[1]s.png\", ghAuthor),\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase info.FromCodeberg():\n\t\t\tif _, ok := addedAuthors[info.Author]; ok {\n\t\t\t\taddedAuthors[info.Author].Linters = append(addedAuthors[info.Author].Linters, lc.Name())\n\t\t\t} else {\n\t\t\t\taddedAuthors[info.Author] = &authorDetails{\n\t\t\t\t\tName:    info.Author,\n\t\t\t\t\tLinters: []string{lc.Name()},\n\t\t\t\t\tProfile: fmt.Sprintf(\"https://codeberg.org/%[1]s\", info.Author),\n\t\t\t\t\tAvatar:  fmt.Sprintf(\"https://codeberg.org/%[1]s.png\", info.Author),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tauthors := slices.SortedFunc(maps.Keys(addedAuthors), func(a string, b string) int {\n\t\treturn strings.Compare(strings.ToLower(a), strings.ToLower(b))\n\t})\n\n\tvar details []*authorDetails\n\n\tfor _, author := range authors {\n\t\tdetails = append(details, addedAuthors[author])\n\t}\n\n\treturn details\n}\n\ntype authorInfo struct {\n\tAuthor string\n\tHost   string\n}\n\nfunc extractInfo(lc *linter.Config) authorInfo {\n\texp := regexp.MustCompile(`https://(github|gitlab|codeberg)\\.(?:com|org)/([^/]+)/.*`)\n\n\tswitch lc.Name() {\n\tcase \"exhaustruct\":\n\t\treturn authorInfo{Author: \"xobotyi\", Host: hostGitHub}\n\n\tcase \"misspell\":\n\t\treturn authorInfo{Author: \"client9\", Host: hostGitHub}\n\n\tcase \"fatcontext\":\n\t\treturn authorInfo{Author: \"Crocmagnon\", Host: hostGitHub}\n\n\tcase \"godoclint\":\n\t\treturn authorInfo{Author: \"babakks\", Host: hostGitHub}\n\n\tcase \"goprintffuncname\":\n\t\treturn authorInfo{Author: \"jirfag\", Host: hostGitHub}\n\n\tcase \"sqlclosecheck\":\n\t\treturn authorInfo{Author: \"ryanrolds\", Host: hostGitHub}\n\n\tdefault:\n\t\tif strings.HasPrefix(lc.OriginalURL, \"https://pkg.go.dev/\") {\n\t\t\treturn authorInfo{Author: \"golang\", Host: hostGitHub}\n\t\t}\n\n\t\tif !exp.MatchString(lc.OriginalURL) {\n\t\t\treturn authorInfo{}\n\t\t}\n\n\t\tsubmatch := exp.FindAllStringSubmatch(lc.OriginalURL, -1)\n\n\t\tinfo := authorInfo{\n\t\t\tAuthor: submatch[0][2],\n\t\t\tHost:   submatch[0][1],\n\t\t}\n\n\t\tswitch info.Author {\n\t\tcase \"gostaticanalysis\":\n\t\t\tinfo.Author = \"tenntenn\"\n\n\t\tcase \"go-simpler\":\n\t\t\tinfo.Author = \"tmzane\"\n\n\t\tcase \"curioswitch\":\n\t\t\tinfo.Author = \"chokoswitch\"\n\n\t\tcase \"GaijinEntertainment\":\n\t\t\tinfo.Author = \"xobotyi\"\n\n\t\tcase \"OpenPeeDeeP\":\n\t\t\tinfo.Author = \"dixonwille\"\n\n\t\tcase \"golangci\":\n\t\t\treturn authorInfo{}\n\t\t}\n\n\t\treturn info\n\t}\n}\n\nfunc (i authorInfo) FromGitHub() bool {\n\treturn i.Host == hostGitHub\n}\n\nfunc (i authorInfo) FromGitLab() bool {\n\treturn i.Host == hostGitLab\n}\n\nfunc (i authorInfo) FromCodeberg() bool {\n\treturn i.Host == hostCodeberg\n}\n"
  },
  {
    "path": "scripts/website/dump_info/thanks_test.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/linter\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\ntype FakeLinter struct {\n\tname string\n}\n\nfunc (*FakeLinter) Run(_ context.Context, _ *linter.Context) ([]*result.Issue, error) {\n\treturn nil, nil\n}\n\nfunc (f *FakeLinter) Name() string {\n\treturn f.name\n}\n\nfunc (*FakeLinter) Desc() string {\n\treturn \"fake linter\"\n}\n\nfunc Test_extractInfo(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tlc       *linter.Config\n\t\texpected authorInfo\n\t}{\n\t\t{\n\t\t\tdesc: \"from GitHub\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://github.com/owner/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"owner\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"from GitLab\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://gitlab.com/owner/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"owner\", Host: \"gitlab\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"from Codeberg\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://codeberg.org/owner/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"owner\", Host: \"codeberg\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"gostaticanalysis\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://github.com/gostaticanalysis/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"tenntenn\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"go-simpler\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://github.com/go-simpler/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"tmzane\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"curioswitch\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://github.com/curioswitch/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"chokoswitch\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"GaijinEntertainment\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://github.com/GaijinEntertainment/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"xobotyi\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"OpenPeeDeeP\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://github.com/OpenPeeDeeP/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"dixonwille\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"misspell\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"misspell\"},\n\t\t\t\tOriginalURL: \"https://github.com/myorg/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"client9\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"pkg.go.dev\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://pkg.go.dev/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{Author: \"golang\", Host: \"github\"},\n\t\t},\n\t\t{\n\t\t\tdesc: \"golangci\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://github.com/golangci/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{},\n\t\t},\n\t\t{\n\t\t\tdesc: \"invalid\",\n\t\t\tlc: &linter.Config{\n\t\t\t\tLinter:      &FakeLinter{name: \"fake\"},\n\t\t\t\tOriginalURL: \"https://example.com/linter\",\n\t\t\t},\n\t\t\texpected: authorInfo{},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tinfo := extractInfo(test.lc)\n\n\t\t\tassert.Equal(t, test.expected, info)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "scripts/website/expand_templates/.gitignore",
    "content": "ConfigurationFile.md\nConfigurationFile.json\nFormattersSettings.md\nFormattersSettings.json\nLintersSettings.md\nLintersSettings.json\n"
  },
  {
    "path": "scripts/website/expand_templates/changelog.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc copyChangelogs(dir string) error {\n\tdata := map[string]string{\n\t\t\"CHANGELOG.md\":    filepath.Join(dir, \"raw_changelog.tmp\"),\n\t\t\"CHANGELOG-v1.md\": filepath.Join(dir, \"raw_changelog_v1.tmp\"),\n\t}\n\n\tfor src, dst := range data {\n\t\terr := copyChangelog(src, dst)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc copyChangelog(src, dst string) error {\n\tmarkerStart := \"<!-- START --->\"\n\n\tin, err := os.ReadFile(src)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tout, err := os.Create(dst)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer func() { _ = out.Close() }()\n\n\tvar write bool\n\n\tfor line := range bytes.Lines(bytes.ReplaceAll(in, []byte(\"### \"), []byte(\"## \"))) {\n\t\tif bytes.Equal(bytes.TrimSpace(line), []byte(markerStart)) {\n\t\t\twrite = true\n\t\t\tcontinue\n\t\t}\n\n\t\tif !write {\n\t\t\tcontinue\n\t\t}\n\n\t\t_, err = out.Write(line)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "scripts/website/expand_templates/configuration.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/scripts/website/types\"\n)\n\nconst (\n\tkeyLinters    = \"linters\"\n\tkeyFormatters = \"formatters\"\n\tkeySettings   = \"settings\"\n)\n\ntype SettingSnippets struct {\n\tConfigurationFile  map[string]string\n\tLintersSettings    map[string]string\n\tFormattersSettings map[string]string\n}\n\ntype ExampleSnippetsExtractor struct {\n\treferencePath string\n\tassetsPath    string\n}\n\nfunc NewExampleSnippetsExtractor() *ExampleSnippetsExtractor {\n\treturn &ExampleSnippetsExtractor{\n\t\treferencePath: \".golangci.reference.yml\",\n\t\tassetsPath:    filepath.Join(\"docs\", \"data\"),\n\t}\n}\n\nfunc (e *ExampleSnippetsExtractor) GetExampleSnippets() (*SettingSnippets, error) {\n\treference, err := os.ReadFile(e.referencePath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't read .golangci.reference.yml: %w\", err)\n\t}\n\n\tsnippets, err := e.extractExampleSnippets(reference)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't extract example snippets from .golangci.reference.yml: %w\", err)\n\t}\n\n\treturn snippets, nil\n}\n\nfunc (e *ExampleSnippetsExtractor) extractExampleSnippets(example []byte) (*SettingSnippets, error) {\n\tvar data yaml.Node\n\tif err := yaml.Unmarshal(example, &data); err != nil {\n\t\treturn nil, err\n\t}\n\n\troot := data.Content[0]\n\n\tglobalNode := &yaml.Node{\n\t\tKind:        root.Kind,\n\t\tStyle:       root.Style,\n\t\tTag:         root.Tag,\n\t\tValue:       root.Value,\n\t\tAnchor:      root.Anchor,\n\t\tAlias:       root.Alias,\n\t\tHeadComment: root.HeadComment,\n\t\tLineComment: root.LineComment,\n\t\tFootComment: root.FootComment,\n\t\tLine:        root.Line,\n\t\tColumn:      root.Column,\n\t}\n\n\tsnippets := SettingSnippets{\n\t\tConfigurationFile: make(map[string]string),\n\t}\n\n\tfor j, node := range root.Content {\n\t\tswitch node.Value {\n\t\tcase \"run\", \"output\", keyLinters, keyFormatters, \"issues\", \"severity\", \"version\":\n\t\tdefault:\n\t\t\tcontinue\n\t\t}\n\n\t\tnextNode := root.Content[j+1]\n\n\t\tnewNode := &yaml.Node{\n\t\t\tKind: nextNode.Kind,\n\t\t\tContent: []*yaml.Node{\n\t\t\t\t{\n\t\t\t\t\tHeadComment: fmt.Sprintf(\"See the dedicated %q documentation section.\", node.Value),\n\t\t\t\t\tKind:        node.Kind,\n\t\t\t\t\tStyle:       node.Style,\n\t\t\t\t\tTag:         node.Tag,\n\t\t\t\t\tValue:       \"option\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tKind:  node.Kind,\n\t\t\t\t\tStyle: node.Style,\n\t\t\t\t\tTag:   node.Tag,\n\t\t\t\t\tValue: \"value\",\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\tif node.Value == \"version\" {\n\t\t\tn := &yaml.Node{\n\t\t\t\tHeadComment: fmt.Sprintf(\"See the dedicated %q documentation section.\", node.Value),\n\t\t\t\tKind:        node.Kind,\n\t\t\t\tStyle:       node.Style,\n\t\t\t\tTag:         node.Tag,\n\t\t\t\tValue:       node.Value,\n\t\t\t\tContent:     node.Content,\n\t\t\t}\n\n\t\t\tglobalNode.Content = append(globalNode.Content, n, nextNode)\n\t\t} else {\n\t\t\tglobalNode.Content = append(globalNode.Content, node, newNode)\n\t\t}\n\n\t\tif node.Value == keyLinters || node.Value == keyFormatters {\n\t\t\tfor i := 0; i < len(nextNode.Content); i++ {\n\t\t\t\tif nextNode.Content[i].Value != keySettings {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tsettingSections, err := e.getSettingSections(node, nextNode.Content[i+1])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tswitch node.Value {\n\t\t\t\tcase keyLinters:\n\t\t\t\t\tsnippets.LintersSettings = settingSections\n\n\t\t\t\tcase keyFormatters:\n\t\t\t\t\tsnippets.FormattersSettings = settingSections\n\t\t\t\t}\n\n\t\t\t\tnextNode.Content[i+1].Content = []*yaml.Node{\n\t\t\t\t\t{\n\t\t\t\t\t\tHeadComment: fmt.Sprintf(`See the dedicated \"%s.%s\" documentation section.`, node.Value, nextNode.Content[i].Value),\n\t\t\t\t\t\tKind:        node.Kind,\n\t\t\t\t\t\tStyle:       node.Style,\n\t\t\t\t\t\tTag:         node.Tag,\n\t\t\t\t\t\tValue:       \"option\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tKind:  node.Kind,\n\t\t\t\t\t\tStyle: node.Style,\n\t\t\t\t\t\tTag:   node.Tag,\n\t\t\t\t\t\tValue: \"value\",\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\ti++\n\t\t\t}\n\t\t}\n\n\t\tnodeSection := &yaml.Node{\n\t\t\tKind:    root.Kind,\n\t\t\tStyle:   root.Style,\n\t\t\tTag:     root.Tag,\n\t\t\tValue:   root.Value,\n\t\t\tContent: []*yaml.Node{node, nextNode},\n\t\t}\n\n\t\tbuf := bytes.NewBuffer(nil)\n\t\tencoder := yaml.NewEncoder(buf)\n\t\tencoder.SetIndent(2)\n\n\t\terr := encoder.Encode(nodeSection)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tsnippets.ConfigurationFile[node.Value] = buf.String()\n\t}\n\n\tbuf := bytes.NewBuffer(nil)\n\tencoder := yaml.NewEncoder(buf)\n\tencoder.SetIndent(2)\n\n\terr := encoder.Encode(globalNode)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsnippets.ConfigurationFile[\"root\"] = buf.String()\n\n\treturn &snippets, nil\n}\n\nfunc (e *ExampleSnippetsExtractor) getSettingSections(node, nextNode *yaml.Node) (map[string]string, error) {\n\t// Extract YAML settings\n\tallNodes := make(map[string]*yaml.Node)\n\n\tfor i := 0; i < len(nextNode.Content); i += 2 {\n\t\tallNodes[nextNode.Content[i].Value] = &yaml.Node{\n\t\t\tKind:  yaml.MappingNode,\n\t\t\tTag:   nextNode.Tag,\n\t\t\tValue: node.Value,\n\t\t\tContent: []*yaml.Node{\n\t\t\t\t{\n\t\t\t\t\tKind:  yaml.ScalarNode,\n\t\t\t\t\tValue: node.Value,\n\t\t\t\t\tTag:   node.Tag,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tKind: yaml.MappingNode,\n\t\t\t\t\tContent: []*yaml.Node{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tKind:  yaml.ScalarNode,\n\t\t\t\t\t\t\tValue: \"settings\",\n\t\t\t\t\t\t\tTag:   node.Tag,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tKind:    yaml.MappingNode,\n\t\t\t\t\t\t\tTag:     nextNode.Tag,\n\t\t\t\t\t\t\tContent: []*yaml.Node{nextNode.Content[i], nextNode.Content[i+1]},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t}\n\n\tlinterSettings := make(map[string]string)\n\n\t// Using linter information\n\tlinters, err := readJSONFile[[]*types.LinterWrapper](filepath.Join(e.assetsPath, fmt.Sprintf(\"%s_info.json\", node.Value)))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, lc := range linters {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif lc.Deprecation != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tsettings, ok := allNodes[lc.Name]\n\t\tif !ok {\n\t\t\tif hasSettings(lc.Name) {\n\t\t\t\tlog.Printf(\"can't find %s settings in .golangci.reference.yml\", lc.Name)\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\tbuf := bytes.NewBuffer(nil)\n\t\tencoder := yaml.NewEncoder(buf)\n\t\tencoder.SetIndent(2)\n\n\t\terr := encoder.Encode(settings)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tlinterSettings[lc.Name] = buf.String()\n\t}\n\n\treturn linterSettings, nil\n}\n\nfunc hasSettings(name string) bool {\n\ttp := reflect.TypeFor[config.LintersSettings]()\n\n\tfor i := range tp.NumField() {\n\t\tif strings.EqualFold(name, tp.Field(i).Name) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\ttp = reflect.TypeFor[config.FormatterSettings]()\n\n\tfor i := range tp.NumField() {\n\t\tif strings.EqualFold(name, tp.Field(i).Name) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "scripts/website/expand_templates/configuration_test.go",
    "content": "package main\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_ExampleSnippetsExtractor_GetExampleSnippets(t *testing.T) {\n\tt.Skip(\"only for debugging purpose\")\n\n\te := &ExampleSnippetsExtractor{\n\t\treferencePath: filepath.Join(\"..\", \"..\", \"..\", \".golangci.next.reference.yml\"),\n\t\tassetsPath:    filepath.Join(\"..\", \"..\", \"..\", \"docs\", \"data\"),\n\t}\n\n\tm, err := e.GetExampleSnippets()\n\trequire.NoError(t, err)\n\n\tt.Log(m)\n\n\terr = saveToJSONFile(\"ConfigurationFile.json\", m.ConfigurationFile)\n\trequire.NoError(t, err)\n\n\terr = saveToJSONFile(\"LintersSettings.json\", m.LintersSettings)\n\trequire.NoError(t, err)\n\n\terr = saveToJSONFile(\"FormattersSettings.json\", m.FormattersSettings)\n\trequire.NoError(t, err)\n}\n"
  },
  {
    "path": "scripts/website/expand_templates/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/golangci/golangci-lint/v2/scripts/website/github\"\n)\n\nfunc main() {\n\terr := saveTmp(filepath.Join(\"docs\", \".tmp\"))\n\tif err != nil {\n\t\tlog.Fatalf(\"Save tmp: %s\", err)\n\t}\n\n\terr = saveData(filepath.Join(\"docs\", \"data\"))\n\tif err != nil {\n\t\tlog.Fatalf(\"Save data: %s\", err)\n\t}\n\n\tlog.Print(\"Successfully expanded templates\")\n}\n\nfunc saveTmp(tmpDir string) error {\n\terr := os.RemoveAll(tmpDir)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"remove tmp dir: %w\", err)\n\t}\n\n\terr = os.MkdirAll(tmpDir, os.ModePerm)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create tmp dir: %w\", err)\n\t}\n\n\terr = copyPluginReference(tmpDir)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"copy plugin reference: %w\", err)\n\t}\n\n\terr = copyChangelogs(tmpDir)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"copy changelog: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc saveData(dir string) error {\n\tlatestVersion, err := github.GetLatestVersion()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get the latest version: %w\", err)\n\t}\n\n\terr = saveToJSONFile(filepath.Join(dir, \"version.json\"), map[string]string{\"version\": latestVersion})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"save latest version: %w\", err)\n\t}\n\n\tsnippets, err := NewExampleSnippetsExtractor().GetExampleSnippets()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get example snippets: %w\", err)\n\t}\n\n\terr = saveToJSONFile(filepath.Join(dir, \"linter_settings.json\"), snippets.LintersSettings)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"save linter snippets: %w\", err)\n\t}\n\n\terr = saveToJSONFile(filepath.Join(dir, \"formatter_settings.json\"), snippets.FormattersSettings)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"save formatter snippets: %w\", err)\n\t}\n\n\terr = saveToJSONFile(filepath.Join(dir, \"configuration_file.json\"), snippets.ConfigurationFile)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"save configuration file snippets: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc readJSONFile[T any](src string) (T, error) {\n\tfile, err := os.Open(src)\n\tif err != nil {\n\t\tvar zero T\n\t\treturn zero, fmt.Errorf(\"open file %s: %w\", src, err)\n\t}\n\n\tdefer func() { _ = file.Close() }()\n\n\tvar result T\n\terr = json.NewDecoder(file).Decode(&result)\n\tif err != nil {\n\t\tvar zero T\n\t\treturn zero, fmt.Errorf(\"decode JSON file %s: %w\", src, err)\n\t}\n\n\treturn result, nil\n}\n\nfunc saveToJSONFile(dst string, data any) error {\n\tfile, err := os.Create(dst)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open file (%s): %w\", dst, err)\n\t}\n\n\tdefer func() { _ = file.Close() }()\n\n\tencoder := json.NewEncoder(file)\n\tencoder.SetIndent(\"\", \"  \")\n\n\terr = encoder.Encode(data)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"encode JSON (%s): %w\", dst, err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "scripts/website/expand_templates/plugins.go",
    "content": "package main\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc copyPluginReference(dir string) error {\n\tin, err := os.Open(\".custom-gcl.reference.yml\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer func() { _ = in.Close() }()\n\n\tout, err := os.Create(filepath.Join(dir, \".custom-gcl.reference.yml\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer func() { _ = out.Close() }()\n\n\t_, err = io.Copy(out, in)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "scripts/website/github/github.go",
    "content": "package github\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"time\"\n)\n\nconst endpoint = \"https://api.github.com/repos/golangci/golangci-lint/releases/latest\"\n\ntype releaseInfo struct {\n\tTagName string `json:\"tag_name\"`\n}\n\n// GetLatestVersion gets latest release information.\nfunc GetLatestVersion() (string, error) {\n\t//nolint:noctx // request timeout handled by the client\n\treq, err := http.NewRequest(http.MethodGet, endpoint, http.NoBody)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"prepare a HTTP request: %w\", err)\n\t}\n\n\treq.Header.Set(\"Accept\", \"application/vnd.github.v3+json\")\n\n\tclient := &http.Client{Timeout: 2 * time.Second}\n\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"get HTTP response for the latest tag: %w\", err)\n\t}\n\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"read a body for the latest tag: %w\", err)\n\t}\n\n\trelease := releaseInfo{}\n\n\terr = json.Unmarshal(body, &release)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"unmarshal the body for the latest tag: %w\", err)\n\t}\n\n\treturn release.TagName, nil\n}\n"
  },
  {
    "path": "scripts/website/types/types.go",
    "content": "package types\n\nimport (\n\t\"golang.org/x/tools/go/packages\"\n)\n\ntype CLIHelp struct {\n\tEnable            string `json:\"defaultEnabledLinters\"`\n\tRootCmdHelp       string `json:\"rootOutput\"`\n\tRunCmdHelp        string `json:\"runOutput\"`\n\tLintersCmdHelp    string `json:\"lintersOutput\"`\n\tFmtCmdHelp        string `json:\"fmtOutput\"`\n\tFormattersCmdHelp string `json:\"formattersOutput\"`\n\tHelpCmdHelp       string `json:\"helpOutput\"`\n\tMigrateCmdHelp    string `json:\"migrateOutput\"`\n\tConfigCmdHelp     string `json:\"configOutput\"`\n\tCustomCmdHelp     string `json:\"customOutput\"`\n\tCacheCmdHelp      string `json:\"cacheOutput\"`\n\tVersionCmdHelp    string `json:\"versionOutput\"`\n\tCompletionCmdHelp string `json:\"completionOutput\"`\n}\n\ntype ExcludeRule struct {\n\tLinters    []string `json:\"linters,omitempty\"`\n\tPath       string   `json:\"path,omitempty\"`\n\tPathExcept string   `json:\"path-except,omitempty\"`\n\tText       string   `json:\"text,omitempty\"`\n\tSource     string   `json:\"source,omitempty\"`\n}\n\ntype Deprecation struct {\n\tSince       string `json:\"since,omitempty\"`\n\tMessage     string `json:\"message,omitempty\"`\n\tReplacement string `json:\"replacement,omitempty\"`\n}\n\n// LinterWrapper same fields but with struct tags.\n// The field Name and Desc are added to have the information about the linter.\n// The field Linter is removed (not serializable).\ntype LinterWrapper struct {\n\tName string `json:\"name\"` // From linter.\n\tDesc string `json:\"desc\"` // From linter.\n\n\tGroups []string `json:\"groups,omitempty\"`\n\n\tLoadMode packages.LoadMode `json:\"loadMode,omitempty\"`\n\n\tInPresets        []string `json:\"inPresets,omitempty\"`\n\tAlternativeNames []string `json:\"alternativeNames,omitempty\"`\n\n\tOriginalURL     string `json:\"originalURL,omitempty\"`\n\tInternal        bool   `json:\"internal\"`\n\tCanAutoFix      bool   `json:\"canAutoFix,omitempty\"`\n\tIsSlow          bool   `json:\"isSlow\"`\n\tDoesChangeTypes bool   `json:\"doesChangeTypes,omitempty\"`\n\n\tSince       string       `json:\"since,omitempty\"`\n\tDeprecation *Deprecation `json:\"deprecation,omitempty\"`\n}\n\nfunc (l *LinterWrapper) IsDeprecated() bool {\n\treturn l.Deprecation != nil\n}\n"
  },
  {
    "path": "test/bench/bench_test.go",
    "content": "package bench\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"go/build\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/shirou/gopsutil/v4/process\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n)\n\nconst binName = \"golangci-lint-bench\"\n\ntype repo struct {\n\tname string\n\tdir  string\n}\n\ntype metrics struct {\n\tpeakMemMB int\n\tduration  time.Duration\n}\n\nfunc Benchmark_linters(b *testing.B) {\n\tinstallGolangCILint(b)\n\n\trepos := getAllRepositories(b)\n\n\tlinters := getLinterNames(b, false)\n\n\tfor _, linter := range linters {\n\t\tb.Run(linter, func(b *testing.B) {\n\t\t\targs := []string{\n\t\t\t\t\"run\",\n\t\t\t\t\"--issues-exit-code=0\",\n\t\t\t\t\"--timeout=30m\",\n\t\t\t\t\"--no-config\",\n\t\t\t\t\"--default=none\",\n\t\t\t\t\"--enable\", linter,\n\t\t\t}\n\n\t\t\tfor _, repo := range repos {\n\t\t\t\tb.Run(repo.name, func(b *testing.B) {\n\t\t\t\t\t_ = exec.CommandContext(b.Context(), binName, \"cache\", \"clean\").Run()\n\n\t\t\t\t\tb.Chdir(repo.dir)\n\n\t\t\t\t\tlc := countGoLines(b)\n\n\t\t\t\t\tb.ResetTimer()\n\n\t\t\t\t\tresult := launch(b, run, args)\n\n\t\t\t\t\tb.Logf(\"%s on %s (%d kLoC): time: %s, memory: %dMB\",\n\t\t\t\t\t\tlinter, repo.name, lc/1000, result.duration, result.peakMemMB)\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Benchmark_golangciLint(b *testing.B) {\n\tinstallGolangCILint(b)\n\n\t_ = exec.CommandContext(b.Context(), binName, \"cache\", \"clean\").Run()\n\n\tcases := getAllRepositories(b)\n\n\targs := []string{\n\t\t\"run\",\n\t\t\"--issues-exit-code=0\",\n\t\t\"--timeout=30m\",\n\t\t\"--no-config\",\n\t\t\"--default=none\",\n\t}\n\n\tlinters := getLinterNames(b, false)\n\n\tfor _, linter := range linters {\n\t\targs = append(args, \"--enable\", linter)\n\t}\n\n\tfor _, c := range cases {\n\t\tb.Run(c.name, func(b *testing.B) {\n\t\t\tb.Chdir(c.dir)\n\n\t\t\tlc := countGoLines(b)\n\n\t\t\tb.ResetTimer()\n\n\t\t\tresult := launch(b, run, args)\n\n\t\t\tb.Logf(\"%s (%d kLoC): time: %s, memory: %dMB\",\n\t\t\t\tc.name, lc/1000, result.duration, result.peakMemMB)\n\t\t})\n\t}\n}\n\nfunc getAllRepositories(tb testing.TB) []repo {\n\ttb.Helper()\n\n\tbenchRoot := os.Getenv(\"GCL_BENCH_ROOT\")\n\tif benchRoot == \"\" {\n\t\tbenchRoot = tb.TempDir()\n\t}\n\n\treturn []repo{\n\t\t{\n\t\t\tname: \"golangci/golangci-lint\",\n\t\t\tdir:  cloneGithubProject(tb, benchRoot, \"golangci\", \"golangci-lint\"),\n\t\t},\n\t\t{\n\t\t\tname: \"goreleaser/goreleaser\",\n\t\t\tdir:  cloneGithubProject(tb, benchRoot, \"goreleaser\", \"goreleaser\"),\n\t\t},\n\t\t{\n\t\t\tname: \"gohugoio/hugo\",\n\t\t\tdir:  cloneGithubProject(tb, benchRoot, \"gohugoio\", \"hugo\"),\n\t\t},\n\t\t{\n\t\t\tname: \"pact-foundation/pact-go\", // CGO inside\n\t\t\tdir:  cloneGithubProject(tb, benchRoot, \"pact-foundation\", \"pact-go\"),\n\t\t},\n\t\t{\n\t\t\tname: \"kubernetes/kubernetes\",\n\t\t\tdir:  cloneGithubProject(tb, benchRoot, \"kubernetes\", \"kubernetes\"),\n\t\t},\n\t\t{\n\t\t\tname: \"moby/buildkit\",\n\t\t\tdir:  cloneGithubProject(tb, benchRoot, \"moby\", \"buildkit\"),\n\t\t},\n\t\t{\n\t\t\tname: \"go source code\",\n\t\t\tdir:  filepath.Join(build.Default.GOROOT, \"src\"),\n\t\t},\n\t}\n}\n\nfunc cloneGithubProject(tb testing.TB, benchRoot, owner, name string) string {\n\ttb.Helper()\n\n\tdir := filepath.Join(benchRoot, owner, name)\n\n\tif _, err := os.Stat(dir); os.IsNotExist(err) {\n\t\trepo := fmt.Sprintf(\"https://github.com/%s/%s.git\", owner, name)\n\n\t\terr = exec.CommandContext(tb.Context(), \"git\", \"clone\", \"--depth\", \"1\", \"--single-branch\", repo, dir).Run()\n\t\tif err != nil {\n\t\t\ttb.Fatalf(\"can't git clone %s/%s: %s\", owner, name, err)\n\t\t}\n\t}\n\n\treturn dir\n}\n\nfunc launch(tb testing.TB, run func(testing.TB, string, []string), args []string) *metrics {\n\ttb.Helper()\n\n\tdoneCh := make(chan struct{})\n\n\tpeakMemCh := trackPeakMemoryUsage(tb, doneCh)\n\n\tstartedAt := time.Now()\n\trun(tb, binName, args)\n\tduration := time.Since(startedAt)\n\n\tclose(doneCh)\n\n\tpeakUsedMemMB := <-peakMemCh\n\n\treturn &metrics{\n\t\tpeakMemMB: peakUsedMemMB,\n\t\tduration:  duration,\n\t}\n}\n\nfunc run(tb testing.TB, name string, args []string) {\n\ttb.Helper()\n\n\tcmd := exec.CommandContext(tb.Context(), name, args...)\n\tif os.Getenv(\"PRINT_CMD\") == \"1\" {\n\t\tlog.Print(strings.Join(cmd.Args, \" \"))\n\t}\n\n\tout, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\ttb.Fatalf(\"can't run golangci-lint: %s, %s\", err, out)\n\t}\n\n\tif os.Getenv(\"PRINT_OUTPUT\") == \"1\" {\n\t\ttb.Log(string(out))\n\t}\n}\n\nfunc countGoLines(tb testing.TB) int {\n\ttb.Helper()\n\n\tcmd := exec.CommandContext(tb.Context(), \"bash\", \"-c\", `find . -type f -name \"*.go\" |  grep -F -v vendor | xargs wc -l | tail -1`)\n\n\tout, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\ttb.Log(string(out))\n\t\ttb.Fatalf(\"can't run go lines counter: %s\", err)\n\t}\n\n\tlineCount, _, _ := bytes.Cut(bytes.TrimSpace(out), []byte(\" \"))\n\n\tn, err := strconv.Atoi(string(lineCount))\n\tif err != nil {\n\t\ttb.Log(string(out))\n\t\ttb.Fatalf(\"can't parse go lines count: %s\", err)\n\t}\n\n\treturn n\n}\n\nfunc getLinterMemoryMB(tb testing.TB) (int, error) {\n\ttb.Helper()\n\n\tprocesses, err := process.Processes()\n\tif err != nil {\n\t\ttb.Fatalf(\"can't get processes: %s\", err)\n\t}\n\n\tvar progPID int32\n\tfor _, p := range processes {\n\t\texe, err := p.Exe()\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\t// The executable name can be shorter than the binary name.\n\t\tif strings.HasPrefix(binName, filepath.Base(exe)) {\n\t\t\tprogPID = p.Pid\n\t\t\tbreak\n\t\t}\n\t}\n\tif progPID == 0 {\n\t\treturn 0, errors.New(\"no process\")\n\t}\n\n\tallProgPIDs := []int32{progPID}\n\tfor _, p := range processes {\n\t\tppid, err := p.Ppid()\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif ppid == progPID {\n\t\t\tallProgPIDs = append(allProgPIDs, p.Pid)\n\t\t}\n\t}\n\n\tvar totalProgMemBytes uint64\n\tfor _, pid := range allProgPIDs {\n\t\tp, err := process.NewProcess(pid)\n\t\tif err != nil {\n\t\t\tcontinue // subprocess could die\n\t\t}\n\n\t\tmi, err := p.MemoryInfo()\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\ttotalProgMemBytes += mi.RSS\n\t}\n\n\treturn int(totalProgMemBytes / 1024 / 1024), nil\n}\n\nfunc trackPeakMemoryUsage(tb testing.TB, doneCh <-chan struct{}) chan int {\n\ttb.Helper()\n\n\tresCh := make(chan int)\n\n\tgo func() {\n\t\tvar peakUsedMemMB int\n\t\tt := time.NewTicker(time.Millisecond * 5)\n\t\tdefer t.Stop()\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-doneCh:\n\t\t\t\tresCh <- peakUsedMemMB\n\t\t\t\tclose(resCh)\n\t\t\t\treturn\n\t\t\tcase <-t.C:\n\t\t\t}\n\n\t\t\tm, err := getLinterMemoryMB(tb)\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif m > peakUsedMemMB {\n\t\t\t\tpeakUsedMemMB = m\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn resCh\n}\n\nfunc installGolangCILint(tb testing.TB) {\n\ttb.Helper()\n\n\tif os.Getenv(\"GOLANGCI_LINT_INSTALLED\") == \"true\" {\n\t\treturn\n\t}\n\n\tparentPath := findMakefile(tb)\n\n\tcmd := exec.CommandContext(tb.Context(), \"make\", \"-C\", parentPath, \"build\")\n\n\toutput, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\ttb.Log(string(output))\n\t}\n\n\trequire.NoError(tb, err, \"can't build golangci-lint\")\n\n\tgclBench := filepath.Join(build.Default.GOPATH, \"bin\", binName)\n\t_ = os.Remove(gclBench)\n\n\tabs, err := filepath.Abs(filepath.Join(parentPath, \"golangci-lint\"))\n\trequire.NoError(tb, err)\n\n\terr = os.Symlink(abs, gclBench)\n\ttb.Cleanup(func() {\n\t\t_ = os.Remove(gclBench)\n\t})\n\n\trequire.NoError(tb, err, \"can't create symlink: %s\", gclBench)\n}\n\nfunc findMakefile(tb testing.TB) string {\n\ttb.Helper()\n\n\twd, err := os.Getwd()\n\trequire.NoError(tb, err)\n\n\tfor wd != \"/\" {\n\t\t_, err = os.Stat(filepath.Join(wd, \"Makefile\"))\n\t\tif err != nil {\n\t\t\twd = filepath.Dir(wd)\n\t\t\tcontinue\n\t\t}\n\n\t\tbreak\n\t}\n\n\there, _ := os.Getwd()\n\n\trel, err := filepath.Rel(here, wd)\n\trequire.NoError(tb, err)\n\n\treturn rel\n}\n\nfunc getLinterNames(tb testing.TB, fastOnly bool) []string {\n\ttb.Helper()\n\n\t// add linter names here if needed.\n\texcluded := []string{\n\t\t\"gci\",       // Formatter\n\t\t\"gofmt\",     // Formatter\n\t\t\"gofumpt\",   // Formatter\n\t\t\"goimports\", // Formatter\n\t\t\"golines\",   // Formatter\n\t\t\"swaggo\",    // Formatter\n\t}\n\n\tlinters, err := lintersdb.NewLinterBuilder().Build(config.NewDefault())\n\trequire.NoError(tb, err)\n\n\tvar names []string\n\tfor _, lc := range linters {\n\t\tif lc.IsDeprecated() {\n\t\t\tcontinue\n\t\t}\n\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif fastOnly && lc.IsSlowLinter() {\n\t\t\tcontinue\n\t\t}\n\n\t\tif slices.Contains(excluded, lc.Name()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tnames = append(names, lc.Name())\n\t}\n\n\treturn names\n}\n"
  },
  {
    "path": "test/configuration_file_test.go",
    "content": "package test\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/santhosh-tekuri/jsonschema/v6\"\n\t\"github.com/stretchr/testify/require\"\n\t\"go.yaml.in/yaml/v3\"\n)\n\nfunc Test_validateTestConfigurationFiles(t *testing.T) {\n\terr := validateTestConfigurationFiles(\"../jsonschema/golangci.next.jsonschema.json\", \".\")\n\trequire.NoError(t, err)\n}\n\nfunc Test_validateTestConfigurationFilesLinters(t *testing.T) {\n\terr := validateTestConfigurationFiles(\"../jsonschema/golangci.next.jsonschema.json\", \"../pkg/golinters\")\n\trequire.NoError(t, err)\n}\n\nfunc validateTestConfigurationFiles(schemaPath, targetDir string) error {\n\tschema, err := loadSchema(filepath.FromSlash(schemaPath))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"load schema: %w\", err)\n\t}\n\n\tyamlFiles, err := findConfigurationFiles(filepath.FromSlash(targetDir))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"find configuration files: %w\", err)\n\t}\n\n\tvar errAll error\n\tfor _, filename := range yamlFiles {\n\t\t// internal tests\n\t\tif filename == filepath.FromSlash(\"testdata/withconfig/.golangci.yml\") {\n\t\t\tcontinue\n\t\t}\n\n\t\tm, err := decodeYamlFile(filename)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = schema.Validate(m)\n\t\tif err != nil {\n\t\t\tabs, _ := filepath.Abs(filename)\n\t\t\terrAll = errors.Join(errAll, fmt.Errorf(\"%s: %w\", abs, err))\n\t\t}\n\t}\n\n\treturn errAll\n}\n\nfunc loadSchema(schemaPath string) (*jsonschema.Schema, error) {\n\tcompiler := jsonschema.NewCompiler()\n\tcompiler.DefaultDraft(jsonschema.Draft7)\n\n\tschemaFile, err := os.Open(schemaPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"open schema file: %w\", err)\n\t}\n\n\tdefer func() { _ = schemaFile.Close() }()\n\n\tdoc, err := jsonschema.UnmarshalJSON(schemaFile)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unmarshal schema resource: %w\", err)\n\t}\n\n\tif err = compiler.AddResource(filepath.Base(schemaPath), doc); err != nil {\n\t\treturn nil, fmt.Errorf(\"add schema resource: %w\", err)\n\t}\n\n\tschema, err := compiler.Compile(filepath.Base(schemaPath))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"compile schema: %w\", err)\n\t}\n\n\treturn schema, nil\n}\n\nfunc findConfigurationFiles(targetDir string) ([]string, error) {\n\tvar yamlFiles []string\n\n\terr := filepath.WalkDir(targetDir, func(path string, d fs.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif !d.IsDir() && (strings.EqualFold(filepath.Ext(d.Name()), \".yml\") || strings.EqualFold(filepath.Ext(d.Name()), \".yaml\")) {\n\t\t\tyamlFiles = append(yamlFiles, path)\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"walk dir: %w\", err)\n\t}\n\n\treturn yamlFiles, nil\n}\n\nfunc decodeYamlFile(filename string) (any, error) {\n\tyamlFile, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"[%s] file open: %w\", filename, err)\n\t}\n\n\tdefer func() { _ = yamlFile.Close() }()\n\n\tvar m any\n\terr = yaml.NewDecoder(yamlFile).Decode(&m)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"[%s] YAML decode: %w\", filename, err)\n\t}\n\n\treturn m, nil\n}\n"
  },
  {
    "path": "test/enabled_linters_test.go",
    "content": "package test\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/config\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/test/testshared\"\n)\n\nfunc TestEnabledLinters(t *testing.T) {\n\t// require to display the message \"Active x linters: [x,y]\"\n\tt.Setenv(logutils.EnvTestRun, \"1\")\n\n\tcases := []struct {\n\t\tname           string\n\t\tcfg            string\n\t\tenabledLinters []string\n\t\targs           []string\n\t}{\n\t\t{\n\t\t\tname: \"disable govet in config\",\n\t\t\tcfg: `\nversion: \"2\"\nlinters:\n\tdisable:\n\t\t- govet\n\t\t\t`,\n\t\t\tenabledLinters: getEnabledByDefaultLintersExcept(t, \"govet\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable revive in config\",\n\t\t\tcfg: `\nversion: \"2\"\nlinters:\n\tenable:\n\t\t- revive\n\t\t\t`,\n\t\t\tenabledLinters: getEnabledByDefaultLintersWith(t, \"revive\"),\n\t\t},\n\t\t{\n\t\t\tname:           \"disable govet in cmd\",\n\t\t\targs:           []string{\"-Dgovet\"},\n\t\t\tenabledLinters: getEnabledByDefaultLintersExcept(t, \"govet\"),\n\t\t},\n\t\t{\n\t\t\tname: \"enable revive in cmd and enable gofmt in config\",\n\t\t\targs: []string{\"-Erevive\"},\n\t\t\tcfg: `\nversion: \"2\"\nformatters:\n\tenable:\n\t\t- gofmt\n\t\t\t`,\n\t\t\tenabledLinters: getEnabledByDefaultLintersWith(t, \"revive\", \"gofmt\"),\n\t\t},\n\t\t{\n\t\t\tname: \"fast option in config\",\n\t\t\tcfg: `\nversion: \"2\"\nlinters:\n\tdefault: fast\n\t\t\t`,\n\t\t\tenabledLinters: getAllLintersFromGroupFast(t),\n\t\t},\n\t\t{\n\t\t\tname:           \"fast option in flag\",\n\t\t\targs:           []string{\"--default=fast\"},\n\t\t\tenabledLinters: getAllLintersFromGroupFast(t),\n\t\t},\n\t\t{\n\t\t\tname: \"fast option in command-line has higher priority to enable\",\n\t\t\tcfg: `\nversion: \"2\"\nlinters:\n\tdefault: none\n\t\t\t`,\n\t\t\targs:           []string{\"--default=fast\"},\n\t\t\tenabledLinters: getAllLintersFromGroupFast(t),\n\t\t},\n\t\t{\n\t\t\tname:           \"only fast linters with standard group\",\n\t\t\targs:           []string{\"--fast-only\"},\n\t\t\tenabledLinters: []string{\"ineffassign\"},\n\t\t},\n\t\t{\n\t\t\tname:           \"only fast false\",\n\t\t\targs:           []string{\"--fast-only=false\"},\n\t\t\tenabledLinters: getEnabledByDefaultLintersWith(t),\n\t\t},\n\t\t{\n\t\t\tname:           \"fast option combined with enable and enable-all\",\n\t\t\targs:           []string{\"--default=all\", \"--fast-only\", \"--enable=unused\"},\n\t\t\tenabledLinters: getAllLintersFromGroupFast(t),\n\t\t},\n\t}\n\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\tfor _, c := range cases {\n\t\tt.Run(c.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\targs := []string{\"--verbose\"}\n\n\t\t\tr := testshared.NewRunnerBuilder(t).\n\t\t\t\tWithCommand(\"linters\").\n\t\t\t\tWithArgs(args...).\n\t\t\t\tWithArgs(c.args...).\n\t\t\t\tWithConfig(c.cfg).\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun()\n\n\t\t\tsort.Strings(c.enabledLinters)\n\n\t\t\tr.ExpectOutputContains(fmt.Sprintf(\"Active %d linters: [%s]\",\n\t\t\t\tlen(c.enabledLinters), strings.Join(c.enabledLinters, \" \")))\n\t\t})\n\t}\n}\n\nfunc getEnabledByDefaultLintersExcept(t *testing.T, excludes ...string) []string {\n\tt.Helper()\n\n\tlinterNames := getEnabledByDefaultLintersWith(t)\n\n\tvar ret []string\n\tfor _, lc := range linterNames {\n\t\tif slices.Contains(excludes, lc) {\n\t\t\tcontinue\n\t\t}\n\n\t\tret = append(ret, lc)\n\t}\n\n\treturn ret\n}\n\nfunc getEnabledByDefaultLintersWith(t *testing.T, includes ...string) []string {\n\tt.Helper()\n\n\tcfg := &config.Config{\n\t\tLinters: config.Linters{\n\t\t\tDefault: config.GroupStandard,\n\t\t},\n\t}\n\tdbManager, err := lintersdb.NewManager(logutils.NewStderrLog(\"skip\"), cfg, lintersdb.NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\tebdl, err := dbManager.GetEnabledLintersMap()\n\trequire.NoError(t, err)\n\n\tvar ret []string\n\tfor _, lc := range ebdl {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tret = append(ret, lc.Name())\n\t}\n\n\treturn slices.Concat(ret, includes)\n}\n\nfunc getAllLintersFromGroupFast(t *testing.T) []string {\n\tt.Helper()\n\n\tcfg := &config.Config{\n\t\tLinters: config.Linters{\n\t\t\tDefault: config.GroupAll,\n\t\t},\n\t}\n\n\tdbManager, err := lintersdb.NewManager(logutils.NewStderrLog(\"skip\"), cfg, lintersdb.NewLinterBuilder())\n\trequire.NoError(t, err)\n\n\tebdl, err := dbManager.GetEnabledLintersMap()\n\trequire.NoError(t, err)\n\n\tvar ret []string\n\tfor _, lc := range ebdl {\n\t\tif lc.Internal {\n\t\t\tcontinue\n\t\t}\n\n\t\tif lc.IsSlowLinter() {\n\t\t\tcontinue\n\t\t}\n\n\t\tret = append(ret, lc.Name())\n\t}\n\n\treturn ret\n}\n"
  },
  {
    "path": "test/fix_test.go",
    "content": "package test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nfunc TestFix(t *testing.T) {\n\tintegration.RunFix(t)\n}\n\nfunc TestFix_pathPrefix(t *testing.T) {\n\tintegration.RunFixPathPrefix(t)\n}\n"
  },
  {
    "path": "test/linters_test.go",
    "content": "package test\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared\"\n\t\"github.com/golangci/golangci-lint/v2/test/testshared/integration\"\n)\n\nconst testdataDir = \"testdata\"\n\nfunc TestSourcesFromTestdata(t *testing.T) {\n\tintegration.RunTestdata(t)\n}\n\nfunc TestTypecheck(t *testing.T) {\n\ttestshared.SkipOnWindows(t)\n\n\tintegration.RunTestSourcesFromDir(t, filepath.Join(testdataDir, \"notcompiles\"))\n}\n"
  },
  {
    "path": "test/output_test.go",
    "content": "package test\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/test/testshared\"\n)\n\n//nolint:misspell // misspelling is intentional\nconst expectedJSONOutput = `{\"Issues\":[{\"FromLinter\":\"misspell\",\"Text\":\"` + \"`\" + `occured` + \"`\" + ` is a misspelling of ` + \"`\" + `occurred` + \"`\" + `\",\"Severity\":\"\",\"SourceLines\":[\"\\t// comment with incorrect spelling: occured // want \\\"` + \"`\" + `occured` + \"`\" + ` is a misspelling of ` + \"`\" + `occurred` + \"`\" + `\\\"\"],\"Pos\":{\"Filename\":\"testdata/output.go\",\"Offset\":159,\"Line\":6,\"Column\":38},\"SuggestedFixes\":[{\"Message\":\"\",\"TextEdits\":[{\"Pos\":159,\"End\":166,\"NewText\":\"b2NjdXJyZWQ=\"}]}],\"ExpectNoLint\":false,\"ExpectedNoLintLinter\":\"\"}]`\n\nfunc TestOutput_lineNumber(t *testing.T) {\n\tsourcePath := filepath.Join(testdataDir, \"output.go\")\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithArgs(\n\t\t\t\"--default=none\",\n\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t\t\"--output.text.print-linter-name=false\",\n\t\t\t\"--output.text.path=stdout\",\n\t\t).\n\t\tWithDirectives(sourcePath).\n\t\tWithTargetPath(sourcePath).\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\t//nolint:misspell // misspelling is intentional\n\t\tExpectHasIssue(\"testdata/output.go:6:38: `occured` is a misspelling of `occurred`\")\n}\n\nfunc TestOutput_Stderr(t *testing.T) {\n\tsourcePath := filepath.Join(testdataDir, \"output.go\")\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithArgs(\n\t\t\t\"--default=none\",\n\t\t\t\"--output.json.path=stderr\",\n\t\t).\n\t\tWithDirectives(sourcePath).\n\t\tWithTargetPath(sourcePath).\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectHasIssue(testshared.NormalizeFilePathInJSON(expectedJSONOutput))\n}\n\nfunc TestOutput_File(t *testing.T) {\n\tresultPath := filepath.Join(t.TempDir(), \"golangci_lint_test_result\")\n\n\tsourcePath := filepath.Join(testdataDir, \"output.go\")\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithArgs(\n\t\t\t\"--default=none\",\n\t\t\tfmt.Sprintf(\"--output.json.path=%s\", resultPath),\n\t\t).\n\t\tWithDirectives(sourcePath).\n\t\tWithTargetPath(sourcePath).\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectExitCode(exitcodes.IssuesFound)\n\n\tb, err := os.ReadFile(resultPath)\n\trequire.NoError(t, err)\n\trequire.Contains(t, string(b), testshared.NormalizeFilePathInJSON(expectedJSONOutput))\n}\n\nfunc TestOutput_Multiple(t *testing.T) {\n\tsourcePath := filepath.Join(testdataDir, \"output.go\")\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithArgs(\n\t\t\t\"--default=none\",\n\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t\t\"--output.text.print-linter-name=false\",\n\t\t\t\"--output.text.path=stdout\",\n\t\t\t\"--output.json.path=stdout\",\n\t\t).\n\t\tWithDirectives(sourcePath).\n\t\tWithTargetPath(sourcePath).\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\t//nolint:misspell // misspelling is intentional\n\t\tExpectHasIssue(\"testdata/output.go:6:38: `occured` is a misspelling of `occurred`\").\n\t\tExpectOutputContains(testshared.NormalizeFilePathInJSON(expectedJSONOutput))\n}\n"
  },
  {
    "path": "test/run_test.go",
    "content": "package test\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t_ \"github.com/valyala/quicktemplate\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/test/testshared\"\n)\n\nconst minimalPkg = \"minimalpkg\"\n\nfunc TestAutogeneratedNoIssues(t *testing.T) {\n\t_, ci := os.LookupEnv(\"CI\")\n\tif runtime.GOOS == \"windows\" && ci {\n\t\t// Tests on Windows and GitHub action that use a file produce a warning and so an exit code 2:\n\t\t// level=warning msg=\\\"[config_reader] Can't pretty print config file path: can't get relative path for path C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Temp\\\\\\\\golangci_lint_test3234185281.yml and root D:\\\\\\\\a\\\\\\\\golangci-lint\\\\\\\\golangci-lint\\\\\\\\test: Rel: can't make C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Temp\\\\\\\\golangci_lint_test3234185281.yml relative to D:\\\\\\\\a\\\\\\\\golangci-lint\\\\\\\\golangci-lint\\\\\\\\test\\\"\n\t\t//\n\t\t// In the context of a test that ExpectNoIssues this is problem.\n\t\t//\n\t\t// NOTE(ldez): I don't want to create flags only for running tests on Windows + GitHub Action.\n\t\tt.Skip(\"on Windows + GitHub Action\")\n\t}\n\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\tcfg := `\nversion: \"2\"\nlinters:\n\texclusions:\n\t\tgenerated: lax\n`\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithConfig(cfg).\n\t\tWithArgs(\"--show-stats=false\").\n\t\tWithTargetPath(testdataDir, \"autogenerated\").\n\t\tWithBinPath(binPath).\n\t\tRunner().\n\t\tRun().\n\t\tExpectNoIssues()\n}\n\nfunc TestEmptyDirRun(t *testing.T) {\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithEnviron(\"GO111MODULE=off\").\n\t\tWithArgs(\"--show-stats=false\").\n\t\tWithTargetPath(testdataDir, \"nogofiles\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectExitCode(exitcodes.NoGoFiles).\n\t\tExpectOutputContains(\": no go files to analyze\")\n}\n\nfunc TestNotExistingDirRun(t *testing.T) {\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithEnviron(\"GO111MODULE=off\").\n\t\tWithTargetPath(testdataDir, \"no_such_dir\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectExitCode(exitcodes.Failure).\n\t\tExpectOutputContains(\"cannot find package\").\n\t\tExpectOutputContains(testshared.NormalizeFileInString(\"/testdata/no_such_dir\"))\n}\n\nfunc TestNoLintersEnabled(t *testing.T) {\n\tcfg := `\nversion: \"2\"\nlinters:\n\tdefault: none\n\tenable: []\n`\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithConfig(cfg).\n\t\tWithArgs(\"--show-stats=false\").\n\t\tWithTargetPath(testdataDir, \"autogenerated\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectOutputContains(\"Running error: no linters enabled\")\n}\n\nfunc TestSymlinkLoop(t *testing.T) {\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithArgs(\"--show-stats=false\").\n\t\tWithTargetPath(testdataDir, \"symlink_loop\", \"...\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectNoIssues()\n}\n\nfunc TestTimeout(t *testing.T) {\n\tprojectRoot := filepath.Join(\"..\", \"...\")\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithArgs(\"--timeout=1ms\").\n\t\tWithTargetPath(projectRoot).\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectExitCode(exitcodes.Timeout).\n\t\tExpectOutputContains(`Timeout exceeded: try increasing it by passing --timeout option`)\n}\n\nfunc TestTimeoutInConfig(t *testing.T) {\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\tcfg := `\nversion: \"2\"\nrun:\n\ttimeout: 1ms\n`\n\n\t// Run with disallowed option set only in config\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithConfig(cfg).\n\t\tWithTargetPath(testdataDir, minimalPkg).\n\t\tWithBinPath(binPath).\n\t\tRunner().\n\t\tRun().\n\t\tExpectExitCode(exitcodes.Timeout).\n\t\tExpectOutputContains(`Timeout exceeded: try increasing it by passing --timeout option`)\n}\n\nfunc TestTestsAreLintedByDefault(t *testing.T) {\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithTargetPath(testdataDir, \"withtests\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectHasIssue(\"don't use `init` function\")\n}\n\nfunc TestCgoOk(t *testing.T) {\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithNoConfig().\n\t\tWithArgs(\n\t\t\t\"--timeout=3m\",\n\t\t\t\"--show-stats=false\",\n\t\t\t\"--default=all\",\n\t\t).\n\t\tWithTargetPath(testdataDir, \"cgo\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectNoIssues()\n}\n\nfunc TestCgoWithIssues(t *testing.T) {\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\targs     []string\n\t\tdir      string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"govet\",\n\t\t\targs:     []string{\"--no-config\", \"--default=none\", \"-Egovet\"},\n\t\t\tdir:      \"cgo_with_issues\",\n\t\t\texpected: \"Printf format %t has arg cs of wrong type\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"staticcheck\",\n\t\t\targs:     []string{\"--no-config\", \"--default=none\", \"-Estaticcheck\"},\n\t\t\tdir:      \"cgo_with_issues\",\n\t\t\texpected: \"SA5009: Printf format %t has arg #1 of wrong type\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"revive\",\n\t\t\targs:     []string{\"--no-config\", \"--default=none\", \"-Erevive\"},\n\t\t\tdir:      \"cgo_with_issues\",\n\t\t\texpected: \"indent-error-flow: if block ends with a return statement\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttestshared.NewRunnerBuilder(t).\n\t\t\t\tWithArgs(test.args...).\n\t\t\t\tWithTargetPath(testdataDir, test.dir).\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun().\n\t\t\t\tExpectHasIssue(test.expected)\n\t\t})\n\t}\n}\n\n// https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives\nfunc TestLineDirective(t *testing.T) {\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\ttestCases := []struct {\n\t\tdesc       string\n\t\targs       []string\n\t\tconfigPath string\n\t\ttargetPath string\n\t\texpected   string\n\t}{\n\t\t{\n\t\t\tdesc: \"dupl\",\n\t\t\targs: []string{\n\t\t\t\t\"-Edupl\",\n\t\t\t\t\"--default=none\",\n\t\t\t},\n\t\t\tconfigPath: \"testdata/linedirective/dupl.yml\",\n\t\t\ttargetPath: \"linedirective\",\n\t\t\texpected:   \"21-23 lines are duplicate of `testdata/linedirective/hello.go:25-27` (dupl)\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"gomodguard\",\n\t\t\targs: []string{\n\t\t\t\t\"-Egomodguard\",\n\t\t\t\t\"--default=none\",\n\t\t\t},\n\t\t\tconfigPath: \"testdata/linedirective/gomodguard.yml\",\n\t\t\ttargetPath: \"linedirective\",\n\t\t\texpected: \"import of package `golang.org/x/tools/go/analysis` is blocked because the module is not \" +\n\t\t\t\t\"in the allowed modules list. (gomodguard)\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"lll\",\n\t\t\targs: []string{\n\t\t\t\t\"-Elll\",\n\t\t\t\t\"--default=none\",\n\t\t\t},\n\t\t\tconfigPath: \"testdata/linedirective/lll.yml\",\n\t\t\ttargetPath: \"linedirective\",\n\t\t\texpected:   \"The line is 57 characters long, which exceeds the maximum of 50 characters. (lll)\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"misspell\",\n\t\t\targs: []string{\n\t\t\t\t\"-Emisspell\",\n\t\t\t\t\"--default=none\",\n\t\t\t},\n\t\t\tconfigPath: \"\",\n\t\t\ttargetPath: \"linedirective\",\n\t\t\texpected:   \"is a misspelling of `language` (misspell)\",\n\t\t},\n\t\t{\n\t\t\tdesc: \"wsl\",\n\t\t\targs: []string{\n\t\t\t\t\"-Ewsl\",\n\t\t\t\t\"--default=none\",\n\t\t\t},\n\t\t\tconfigPath: \"\",\n\t\t\ttargetPath: \"linedirective\",\n\t\t\texpected:   \"block should not start with a whitespace (wsl)\",\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttestshared.NewRunnerBuilder(t).\n\t\t\t\tWithArgs(test.args...).\n\t\t\t\tWithTargetPath(testdataDir, test.targetPath).\n\t\t\t\tWithConfigFile(test.configPath).\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun().\n\t\t\t\tExpectHasIssue(test.expected)\n\t\t})\n\t}\n}\n\n// https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives\nfunc TestLineDirectiveProcessedFiles(t *testing.T) {\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\targs     []string\n\t\ttarget   string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tdesc: \"lite loading\",\n\t\t\targs: []string{\n\t\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t\t\t\"-Erevive\",\n\t\t\t},\n\t\t\ttarget: \"quicktemplate\",\n\t\t\texpected: []string{\n\t\t\t\t\"testdata/quicktemplate/hello.qtpl.go:26:1: exported: exported function StreamHello should have comment or be unexported (revive)\",\n\t\t\t\t\"testdata/quicktemplate/hello.qtpl.go:39:1: exported: exported function WriteHello should have comment or be unexported (revive)\",\n\t\t\t\t\"testdata/quicktemplate/hello.qtpl.go:50:1: exported: exported function Hello should have comment or be unexported (revive)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"full loading\",\n\t\t\targs: []string{\n\t\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t\t\t\"-Erevive,govet\",\n\t\t\t},\n\t\t\ttarget: \"quicktemplate\",\n\t\t\texpected: []string{\n\t\t\t\t\"testdata/quicktemplate/hello.qtpl.go:26:1: exported: exported function StreamHello should have comment or be unexported (revive)\",\n\t\t\t\t\"testdata/quicktemplate/hello.qtpl.go:39:1: exported: exported function WriteHello should have comment or be unexported (revive)\",\n\t\t\t\t\"testdata/quicktemplate/hello.qtpl.go:50:1: exported: exported function Hello should have comment or be unexported (revive)\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttestshared.NewRunnerBuilder(t).\n\t\t\t\tWithNoConfig().\n\t\t\t\tWithArgs(test.args...).\n\t\t\t\tWithTargetPath(testdataDir, test.target).\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun().\n\t\t\t\tExpectExitCode(exitcodes.IssuesFound).\n\t\t\t\tExpectOutputContains(test.expected...)\n\t\t})\n\t}\n}\n\nfunc TestUnsafeOk(t *testing.T) {\n\t_, ci := os.LookupEnv(\"CI\")\n\tif runtime.GOOS == \"windows\" && ci {\n\t\t// Tests on Windows and GitHub action that use a file produce a warning and so an exit code 2:\n\t\t// level=warning msg=\\\"[config_reader] Can't pretty print config file path: can't get relative path for path C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Temp\\\\\\\\golangci_lint_test3234185281.yml and root D:\\\\\\\\a\\\\\\\\golangci-lint\\\\\\\\golangci-lint\\\\\\\\test: Rel: can't make C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Temp\\\\\\\\golangci_lint_test3234185281.yml relative to D:\\\\\\\\a\\\\\\\\golangci-lint\\\\\\\\golangci-lint\\\\\\\\test\\\"\n\t\t//\n\t\t// In the context of a test that ExpectNoIssues this is problem.\n\t\t//\n\t\t// NOTE(ldez): I don't want to create flags only for running tests on Windows + GitHub Action.\n\t\tt.Skip(\"on Windows + GitHub Action\")\n\t}\n\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\tcfg := `\nversion: \"2\"\nlinters:\n\texclusions:\n\t\tpresets:\n\t\t- common-false-positives\n`\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithConfig(cfg).\n\t\tWithArgs(\n\t\t\t\"--show-stats=false\",\n\t\t\t\"--default=all\",\n\t\t).\n\t\tWithTargetPath(testdataDir, \"unsafe\").\n\t\tWithBinPath(binPath).\n\t\tRunner().\n\t\tRun().\n\t\tExpectNoIssues()\n}\n\nfunc TestSortedResults(t *testing.T) {\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithNoConfig().\n\t\tWithArgs(\n\t\t\t\"--show-stats=false\",\n\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t).\n\t\tWithTargetPath(testdataDir, \"sort_results\").\n\t\tWithBinPath(binPath).\n\t\tRunner().\n\t\tRun().\n\t\tExpectExitCode(exitcodes.IssuesFound).ExpectOutputEq(\n\t\t\"testdata/sort_results/main.go:15:13: Error return value is not checked (errcheck)\" + \"\\n\" +\n\t\t\t\"testdata/sort_results/main.go:12:5: var db is unused (unused)\" + \"\\n\",\n\t)\n}\n\nfunc TestIdentifierUsedOnlyInTests(t *testing.T) {\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithNoConfig().\n\t\tWithArgs(\n\t\t\t\"--show-stats=false\",\n\t\t\t\"--default=none\",\n\t\t\t\"-Eunused\",\n\t\t).\n\t\tWithTargetPath(testdataDir, \"used_only_in_tests\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectNoIssues()\n}\n\nfunc TestUnusedCheckExported(t *testing.T) {\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithArgs(\"--show-stats=false\").\n\t\tWithConfigFile(\"testdata_etc/unused_exported/golangci.yml\").\n\t\tWithTargetPath(\"testdata_etc/unused_exported/...\").\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectNoIssues()\n}\n\nfunc TestConfigFileIsDetected(t *testing.T) {\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\ttestCases := []struct {\n\t\tdesc       string\n\t\ttargetPath string\n\t}{\n\t\t{\n\t\t\tdesc:       \"explicit\",\n\t\t\ttargetPath: filepath.Join(testdataDir, \"withconfig\", \"pkg\"),\n\t\t},\n\t\t{\n\t\t\tdesc:       \"recursive\",\n\t\t\ttargetPath: filepath.Join(testdataDir, \"withconfig\", \"...\"),\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttestshared.NewRunnerBuilder(t).\n\t\t\t\t// WithNoConfig().\n\t\t\t\tWithTargetPath(test.targetPath).\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun().\n\t\t\t\tExpectExitCode(exitcodes.Success).\n\t\t\t\t// test config contains InternalTest: true, it triggers such output\n\t\t\t\tExpectOutputEq(\"test\\n\")\n\t\t})\n\t}\n}\n\nfunc TestEnableAllFastAndEnableCanCoexist(t *testing.T) {\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\ttestCases := []struct {\n\t\tdesc     string\n\t\targs     []string\n\t\texpected []int\n\t}{\n\t\t{\n\t\t\tdesc:     \"fast\",\n\t\t\targs:     []string{\"--fast-only\", \"--default=all\", \"--enable=typecheck\"},\n\t\t\texpected: []int{exitcodes.Success, exitcodes.IssuesFound},\n\t\t},\n\t\t{\n\t\t\tdesc:     \"all\",\n\t\t\targs:     []string{\"--default=all\", \"--enable=typecheck\"},\n\t\t\texpected: []int{exitcodes.Success},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttestshared.NewRunnerBuilder(t).\n\t\t\t\tWithNoConfig().\n\t\t\t\tWithArgs(test.args...).\n\t\t\t\tWithTargetPath(testdataDir, minimalPkg).\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun().\n\t\t\t\tExpectExitCode(test.expected...)\n\t\t})\n\t}\n}\n\nfunc TestAbsPathDirAnalysis(t *testing.T) {\n\tdir := filepath.Join(\"testdata_etc\", \"abspath\") // abs paths don't work with testdata dir\n\tabsDir, err := filepath.Abs(dir)\n\trequire.NoError(t, err)\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithNoConfig().\n\t\tWithArgs(\n\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t\t\"-Erevive\",\n\t\t).\n\t\tWithTargetPath(absDir).\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectHasIssue(\"testdata_etc/abspath/with_issue.go:8:9: \" +\n\t\t\t\"indent-error-flow: if block ends with a return statement, so drop this else and outdent its block (revive)\")\n}\n\nfunc TestAbsPathFileAnalysis(t *testing.T) {\n\tdir := filepath.Join(\"testdata_etc\", \"abspath\", \"with_issue.go\") // abs paths don't work with testdata dir\n\tabsDir, err := filepath.Abs(dir)\n\trequire.NoError(t, err)\n\n\ttestshared.NewRunnerBuilder(t).\n\t\tWithNoConfig().\n\t\tWithArgs(\n\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t\t\"-Erevive\",\n\t\t).\n\t\tWithTargetPath(absDir).\n\t\tRunner().\n\t\tInstall().\n\t\tRun().\n\t\tExpectHasIssue(\"indent-error-flow: if block ends with a return statement, so drop this else and outdent its block (revive)\")\n}\n\nfunc TestPathPrefix(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc    string\n\t\targs    []string\n\t\tpattern string\n\t}{\n\t\t{\n\t\t\tdesc:    \"empty\",\n\t\t\tpattern: \"^test/testdata/withtests/\",\n\t\t},\n\t\t{\n\t\t\tdesc:    \"prefixed\",\n\t\t\targs:    []string{\"--path-prefix=cool\"},\n\t\t\tpattern: \"^cool/test/testdata/withtests\",\n\t\t},\n\t}\n\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\ttestshared.NewRunnerBuilder(t).\n\t\t\t\tWithArgs(\"--show-stats=false\").\n\t\t\t\tWithArgs(test.args...).\n\t\t\t\tWithTargetPath(testdataDir, \"withtests\").\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun().\n\t\t\t\tExpectOutputRegexp(test.pattern)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/testdata/autogenerated/autogenerated.go",
    "content": "// Code generated by ... DO NOT EDIT.\npackage p\n\nvar vvv int\n"
  },
  {
    "path": "test/testdata/autogenerated/do_not_edit.go",
    "content": "// DO NOT EDIT Code generated by something\npackage p\n\nfunc unusedFunc() {}\n"
  },
  {
    "path": "test/testdata/autogenerated/go_bindata.go",
    "content": "// Code generated by go-bindata.\n// sources:\n// bar.baz\n// x/y.z\n// DO NOT EDIT!\npackage p\n\nvar vv int\n"
  },
  {
    "path": "test/testdata/autogenerated/mockgen.go",
    "content": "// Code generated by MockGen. DO NOT EDIT.\n// Source: ./app/analyze/executors/executor.go\n\npackage p\n\nfunc UnusedFunc2() {}\n"
  },
  {
    "path": "test/testdata/autogenerated/protoc_gen_foo.go",
    "content": "// Code generated by protoc-gen-foo\n// source: bar.proto\n// DO NOT EDIT!!!\npackage p\n\nvar v int\n"
  },
  {
    "path": "test/testdata/cgo/main.go",
    "content": "// Package cgoexample ...\npackage cgoexample\n\n/*\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid myprint(char* s) {\n\tprintf(\"%d\\n\", s);\n}\n*/\nimport \"C\"\n\nimport (\n\t\"unsafe\"\n)\n\n// Example ...\nfunc Example() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tC.free(unsafe.Pointer(cs))\n}\n"
  },
  {
    "path": "test/testdata/cgo_with_issues/main.go",
    "content": "package cgoexample\n\n/*\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid myprint(char* s) {\n\tprintf(\"%s\\n\", s);\n}\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\nfunc Example() {\n\tcs := C.CString(\"Hello from stdio\\n\")\n\tC.myprint(cs)\n\tfmt.Printf(\"bad format %t\", cs)\n\tC.free(unsafe.Pointer(cs))\n}\n\nfunc notFormattedForGofmt()  {\n}\n\nfunc errorForRevive(p *int) error {\n\tif p == nil {\n\t\treturn nil\n\t} else {\n\t\treturn nil\n\t}\n}\n\n"
  },
  {
    "path": "test/testdata/configs/custom_linter_goplugin.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    custom:\n      foo:\n        type: \"goplugin\"\n        path: \"bin/linter/myplugin.so\"\n        description: I am a Go plugin system-based custom linter.\n        settings:\n          message: hello\n"
  },
  {
    "path": "test/testdata/configs/custom_linter_module.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    custom:\n      foo:\n        type: \"module\"\n        description: I am a module-based custom linter.\n        settings:\n          message: hello\n"
  },
  {
    "path": "test/testdata/configs/custom_linter_notype.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    custom:\n      foo:\n        path: \"bin/linter/myplugin.so\"\n        description: >\n          I didn't specify the type, so I am a Go plugin system-based custom linter.\n          As such, I need to be specified the path.\n        settings:\n          message: hello\n"
  },
  {
    "path": "test/testdata/configs/default_exclude.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    staticcheck:\n      checks:\n        - all\n\n  exclusions:\n    presets:\n      - std-error-handling\n      - common-false-positives\n      - legacy\n\nrun:\n  relative-path-mode: wd\n"
  },
  {
    "path": "test/testdata/configs/multiple-issues-fix.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - gofumpt\n  settings:\n    gofumpt:\n      extra-rules: true\n\nrun:\n  relative-path-mode: wd\n"
  },
  {
    "path": "test/testdata/configs/output.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    misspell:\n      locale: US\n      ignore-rules:\n        - langauge\n        - Dialogue\n\nrun:\n  relative-path-mode: wd\n"
  },
  {
    "path": "test/testdata/configs/path-except.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    forbidigo:\n      forbid:\n        - pattern: fmt\\.Print.*\n        - pattern: time.Sleep(# no sleeping!)?\n\n  exclusions:\n    rules:\n      # Apply forbidigo only to test files, exclude\n      # it everywhere else.\n      - path-except: _test\\.go\n        linters:\n          - forbidigo\n\nrun:\n  relative-path-mode: wd\n"
  },
  {
    "path": "test/testdata/default_exclude.go",
    "content": "//golangcitest:args -Estaticcheck,revive --internal-cmd-test\n//golangcitest:config_path testdata/configs/default_exclude.yml\n\n/*Package testdata ...*/\npackage testdata\n\n// InvalidFuncComment, both revive and staticcheck (stylecheck) will complain about this, // want `exported: comment on exported function ExportedFunc1 should be of the form \"ExportedFunc1 ...\"`\n// if include EXC0011, only the warning from revive will be ignored.\n// And only the warning from staticcheck (stylecheck) will start with \"ST1020\".\nfunc ExportedFunc1() {\n}\n\n// InvalidFuncComment // want `ST1020: comment on exported function ExportedFunc2 should be of the form \"ExportedFunc2 ...\"`\n//\n//nolint:revive\nfunc ExportedFunc2() {\n}\n\n//nolint:staticcheck\nfunc IgnoreAll() { // want \"exported: exported function IgnoreAll should have comment or be unexported\"\n}\n"
  },
  {
    "path": "test/testdata/fix/in/multiple-issues-fix.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:config_path testdata/configs/multiple-issues-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc main() {\n\t//standard greeting\n\tfmt.Println(\"hello world\")\n\t// langauge\n}\n"
  },
  {
    "path": "test/testdata/fix/out/multiple-issues-fix.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:config_path testdata/configs/multiple-issues-fix.yml\n//golangcitest:expected_exitcode 0\npackage p\n\nimport \"fmt\"\n\nfunc main() {\n\t// standard greeting\n\tfmt.Println(\"hello world\")\n\t// language\n}\n"
  },
  {
    "path": "test/testdata/linedirective/dupl.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    dupl:\n      threshold: 10\n"
  },
  {
    "path": "test/testdata/linedirective/gomodguard.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    gomodguard:\n      allowed:\n        domains:\n          - github.com\n"
  },
  {
    "path": "test/testdata/linedirective/hello.go",
    "content": "// Refers a existent, but non-go file with line directive\n//line hello.tmpl:1\npackage main\n\nimport (\n\t\"golang.org/x/tools/go/analysis\"\n)\n\nfunc _() {\n\tvar x int\n\t_ = x\n\tx = 0 //x\n}\n\nfunc main() {\n\ta()\n\tb()\n\twsl()\n}\n\nfunc a() {\n\tfmt.Println(\"foo\")\n}\n\nfunc b() {\n\tfmt.Println(\"foo\")\n}\n\nfunc c(){\n\t_ = analysis.Analyzer{}\n}\n\nfunc wsl() bool {\n\n\treturn true\n}\n\nfunc notFormatted()  {\n}\n\n// langauge\n"
  },
  {
    "path": "test/testdata/linedirective/hello.tmpl",
    "content": "# This is a template file for some code generator, and is not a valid go source file.\n"
  },
  {
    "path": "test/testdata/linedirective/lll.yml",
    "content": "version: \"2\"\n\nlinters:\n  settings:\n    lll:\n      line-length: 50\n"
  },
  {
    "path": "test/testdata/minimalpkg/minimalpkg.go",
    "content": "// Package minimalpkg ...\npackage minimalpkg\n\n// SomeTestFunc ...\nfunc SomeTestFunc() {}\n"
  },
  {
    "path": "test/testdata/nogofiles/test.txt",
    "content": ""
  },
  {
    "path": "test/testdata/notcompiles/typecheck.go",
    "content": "//golangcitest:args -Emodernize\n//golangcitest:expected_linter typecheck\npackage testdata\n\nfun NotCompiles() { // want \"expected declaration, found.* fun\"\n}\n"
  },
  {
    "path": "test/testdata/notcompiles/typecheck_many_issues.go",
    "content": "//go:build go1.20\n\n//golangcitest:args -Emodernize\n//golangcitest:expected_linter typecheck\npackage testdata\n\nfunc TypeCheckBadCalls() {\n\ttypecheckNotExists1.F1() // want \"undefined: typecheckNotExists1\"\n\ttypecheckNotExists2.F2() // want \"undefined: typecheckNotExists2\"\n\ttypecheckNotExists3.F3() // want \"undefined: typecheckNotExists3\"\n\ttypecheckNotExists4.F4() // want \"undefined: typecheckNotExists4\"\n}\n"
  },
  {
    "path": "test/testdata/output.go",
    "content": "//golangcitest:args -Emisspell\n//golangcitest:config_path testdata/configs/output.yml\npackage testdata\n\nfunc Misspell() {\n\t// comment with incorrect spelling: occured // want \"`occured` is a misspelling of `occurred`\"\n}\n\n// the word langauge should be ignored here: it's set in config\n// the word Dialogue should be ignored here: it's set in config\n"
  },
  {
    "path": "test/testdata/path_except.go",
    "content": "//golangcitest:args -Eforbidigo\n//golangcitest:config_path testdata/configs/path-except.yml\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc Forbidigo() {\n\tfmt.Printf(\"too noisy!!!\")\n\ttime.Sleep(time.Nanosecond)\n}\n"
  },
  {
    "path": "test/testdata/path_except_test.go",
    "content": "//golangcitest:args -Eforbidigo\n//golangcitest:config_path testdata/configs/path-except.yml\npackage testdata\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestForbidigo(t *testing.T) {\n\tfmt.Printf(\"too noisy!!!\")  // want \"use of `fmt\\\\.Printf` forbidden by pattern `fmt\\\\\\\\.Print\\\\.\\\\*`\"\n\ttime.Sleep(time.Nanosecond) // want \"no sleeping!\"\n}\n"
  },
  {
    "path": "test/testdata/quicktemplate/hello.qtpl",
    "content": "All text outside function templates is treated as comments,\ni.e. it is just ignored by quicktemplate compiler (`qtc`). It is for humans.\n\nHello is a simple template function.\n{% func Hello(name string) %}\n\tHello, {%s name %}!\n{% endfunc %}\n"
  },
  {
    "path": "test/testdata/quicktemplate/hello.qtpl.go",
    "content": "// This file is automatically generated by qtc from \"hello.qtpl\".\n// See https://github.com/valyala/quicktemplate for details.\n\n// All text outside function templates is treated as comments,\n// i.e. it is just ignored by quicktemplate compiler (`qtc`). It is for humans.\n//\n// Hello is a simple template function.\n\n//line hello.qtpl:5\npackage quicktemplate\n\n//line hello.qtpl:5\nimport (\n\tqtio422016 \"io\"\n\n\tqt422016 \"github.com/valyala/quicktemplate\"\n)\n\n//line hello.qtpl:5\nvar (\n\t_ = qtio422016.Copy\n\t_ = qt422016.AcquireByteBuffer\n)\n\n//line hello.qtpl:5\nfunc StreamHello(qw422016 *qt422016.Writer, name string) {\n\t//line hello.qtpl:5\n\tqw422016.N().S(`\n\tHello, `)\n\t//line hello.qtpl:6\n\tqw422016.E().S(name)\n\t//line hello.qtpl:6\n\tqw422016.N().S(`!\n`)\n//line hello.qtpl:7\n}\n\n//line hello.qtpl:7\nfunc WriteHello(qq422016 qtio422016.Writer, name string) {\n\t//line hello.qtpl:7\n\tqw422016 := qt422016.AcquireWriter(qq422016)\n\t//line hello.qtpl:7\n\tStreamHello(qw422016, name)\n\t//line hello.qtpl:7\n\tqt422016.ReleaseWriter(qw422016)\n//line hello.qtpl:7\n}\n\n//line hello.qtpl:7\nfunc Hello(name string) string {\n\t//line hello.qtpl:7\n\tqb422016 := qt422016.AcquireByteBuffer()\n\t//line hello.qtpl:7\n\tWriteHello(qb422016, name)\n\t//line hello.qtpl:7\n\tqs422016 := string(qb422016.B)\n\t//line hello.qtpl:7\n\tqt422016.ReleaseByteBuffer(qb422016)\n\t//line hello.qtpl:7\n\treturn qs422016\n//line hello.qtpl:7\n}\n"
  },
  {
    "path": "test/testdata/sort_results/main.go",
    "content": "package sortresults\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n)\n\nfunc returnError() error {\n\treturn errors.New(\"sss\")\n}\n\nvar db *sql.DB\n\nfunc Example() {\n\treturnError()\n}\n"
  },
  {
    "path": "test/testdata/symlink_loop/realpkg/p.go",
    "content": "package p\n"
  },
  {
    "path": "test/testdata/unsafe/pkg.go",
    "content": "// Package pkgunsafe ...\npackage pkgunsafe\n\nimport (\n\t\"log\"\n\t\"unsafe\"\n)\n\n// F ...\nfunc F() {\n\tx := 123 // of type int\n\tp := unsafe.Pointer(&x)\n\tpp := &p // of type *unsafe.Pointer\n\tp = unsafe.Pointer(pp)\n\tlog.Print(p)\n}\n"
  },
  {
    "path": "test/testdata/used_only_in_tests/a.go",
    "content": "package p\n\nfunc f() bool {\n\treturn true\n}\n"
  },
  {
    "path": "test/testdata/used_only_in_tests/a_test.go",
    "content": "package p\n\nimport \"testing\"\n\nfunc TestF(t *testing.T) {\n\tif !f() {\n\t\tt.Fail()\n\t}\n}\n"
  },
  {
    "path": "test/testdata/withconfig/.golangci.yml",
    "content": "InternalTest: true"
  },
  {
    "path": "test/testdata/withconfig/pkg/pkg.go",
    "content": "package pkg\n\nfunc SomeTestFunc() {}\n"
  },
  {
    "path": "test/testdata/withtests/p.go",
    "content": "package withtests\n\nimport \"fmt\"\n\nfunc init() {\n\tfmt.Printf(\"init\")\n}\n"
  },
  {
    "path": "test/testdata/withtests/p_test.go",
    "content": "package withtests\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestSomething(t *testing.T) {\n\tif true {\n\t\treturn\n\t} else {\n\t\tfmt.Printf(\"test\")\n\t}\n}\n"
  },
  {
    "path": "test/testdata/withxtest/p.go",
    "content": "package p\n"
  },
  {
    "path": "test/testdata/withxtest/p_test.go",
    "content": "package p_test\n\nimport \"fmt\"\n\nfunc WithGolintIssues(b bool) { //nolint:staticcheck\n\tif b {\n\t\treturn\n\t} else {\n\t\tfmt.Print(\"1\")\n\t}\n}\n"
  },
  {
    "path": "test/testdata_etc/abspath/with_issue.go",
    "content": "package abspath\n\nimport \"fmt\"\n\nfunc f() {\n\tif true {\n\t\treturn\n\t} else {\n\t\tfmt.Print(\"\")\n\t}\n}\n"
  },
  {
    "path": "test/testdata_etc/unused_exported/golangci.yml",
    "content": "version: \"2\"\n\nlinters:\n  default: none\n  enable:\n    - unused\n"
  },
  {
    "path": "test/testdata_etc/unused_exported/lib/bar_test.go",
    "content": "package lib\n"
  },
  {
    "path": "test/testdata_etc/unused_exported/lib/foo.go",
    "content": "package lib\n\nimport (\n\t\"fmt\"\n)\n\nfunc PublicFunc() {\n\tprivateFunc()\n}\n\nfunc privateFunc() {\n\tfmt.Println(\"side effect\")\n}\n"
  },
  {
    "path": "test/testdata_etc/unused_exported/main.go",
    "content": "package main\n\nimport (\n\t\"github.com/golangci/golangci-lint/v2/test/testdata_etc/unused_exported/lib\"\n)\n\nfunc main() {\n\tlib.PublicFunc()\n}\n"
  },
  {
    "path": "test/testshared/analysis.go",
    "content": "package testshared\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"os\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\t\"text/scanner\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/result\"\n)\n\nconst keyword = \"want\"\n\ntype jsonResult struct {\n\tIssues []*result.Issue\n}\n\ntype expectation struct {\n\tkind string // either \"fact\" or \"diagnostic\"\n\tname string // name of object to which fact belongs, or \"package\" (\"fact\" only)\n\trx   *regexp.Regexp\n}\n\ntype key struct {\n\tfile string\n\tline int\n}\n\n// Analyze analyzes the test expectations ('want').\n// Inspired by:\n// https://github.com/golang/tools/blob/1261a24ceb1867ea7439eda244e53e7ace4ad777/go/analysis/analysistest/analysistest.go#L655-L672\nfunc Analyze(t *testing.T, sourcePath string, rawData []byte) {\n\tt.Helper()\n\n\tfileData, err := os.ReadFile(sourcePath)\n\trequire.NoError(t, err)\n\n\twant, err := parseComments(sourcePath, fileData)\n\trequire.NoError(t, err)\n\n\tvar reportData jsonResult\n\terr = json.Unmarshal(rawData, &reportData)\n\trequire.NoError(t, err, string(rawData))\n\n\tfor _, issue := range reportData.Issues {\n\t\tcheckMessage(t, want, issue.Pos, \"diagnostic\", issue.FromLinter, issue.Text)\n\t}\n\n\tvar surplus []string\n\tfor key, expects := range want {\n\t\tfor _, exp := range expects {\n\t\t\terr := fmt.Sprintf(\"%s:%d: no %s was reported matching %#q\", key.file, key.line, exp.kind, exp.rx)\n\t\t\tsurplus = append(surplus, err)\n\t\t}\n\t}\n\n\tsort.Strings(surplus)\n\n\tfor _, err := range surplus {\n\t\tt.Errorf(\"%s\", err)\n\t}\n}\n\n// Inspired by:\n// https://github.com/golang/tools/blob/1261a24ceb1867ea7439eda244e53e7ace4ad777/go/analysis/analysistest/analysistest.go#L524-L553\nfunc parseComments(sourcePath string, fileData []byte) (map[key][]expectation, error) {\n\tfset := token.NewFileSet()\n\n\t// the error is ignored to let 'typecheck' handle compilation error\n\tf, _ := parser.ParseFile(fset, sourcePath, fileData, parser.ParseComments)\n\n\twant := make(map[key][]expectation)\n\n\tfor _, comment := range f.Comments {\n\t\tfor _, c := range comment.List {\n\t\t\ttext := strings.TrimPrefix(c.Text, \"//\")\n\t\t\tif text == c.Text { // not a //-comment.\n\t\t\t\ttext = strings.TrimPrefix(text, \"/*\")\n\t\t\t\ttext = strings.TrimSuffix(text, \"*/\")\n\t\t\t}\n\n\t\t\tif i := strings.Index(text, \"// \"+keyword); i >= 0 {\n\t\t\t\ttext = text[i+len(\"// \"):]\n\t\t\t}\n\n\t\t\tposn := fset.Position(c.Pos())\n\n\t\t\ttext = strings.TrimSpace(text)\n\n\t\t\tif rest, ok := strings.CutPrefix(text, keyword); ok {\n\t\t\t\tdelta, expects, err := parseExpectations(rest)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\twant[key{sourcePath, posn.Line + delta}] = expects\n\t\t\t}\n\t\t}\n\t}\n\n\treturn want, nil\n}\n\n// Inspired by:\n// https://github.com/golang/tools/blob/1261a24ceb1867ea7439eda244e53e7ace4ad777/go/analysis/analysistest/analysistest.go#L685-L745\nfunc parseExpectations(text string) (lineDelta int, expects []expectation, err error) {\n\tvar scanErr string\n\tsc := new(scanner.Scanner).Init(strings.NewReader(text))\n\tsc.Error = func(_ *scanner.Scanner, msg string) {\n\t\tscanErr = msg // e.g. bad string escape\n\t}\n\tsc.Mode = scanner.ScanIdents | scanner.ScanStrings | scanner.ScanRawStrings | scanner.ScanInts\n\n\tscanRegexp := func(tok rune) (*regexp.Regexp, error) {\n\t\tif tok != scanner.String && tok != scanner.RawString {\n\t\t\treturn nil, fmt.Errorf(\"got %s, want regular expression\",\n\t\t\t\tscanner.TokenString(tok))\n\t\t}\n\t\tpattern, _ := strconv.Unquote(sc.TokenText()) // can't fail\n\t\treturn regexp.Compile(pattern)\n\t}\n\n\tfor {\n\t\ttok := sc.Scan()\n\t\tswitch tok {\n\t\tcase '+':\n\t\t\ttok = sc.Scan()\n\t\t\tif tok != scanner.Int {\n\t\t\t\treturn 0, nil, fmt.Errorf(\"got +%s, want +Int\", scanner.TokenString(tok))\n\t\t\t}\n\t\t\tlineDelta, _ = strconv.Atoi(sc.TokenText())\n\t\tcase scanner.String, scanner.RawString:\n\t\t\trx, err := scanRegexp(tok)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, nil, err\n\t\t\t}\n\t\t\texpects = append(expects, expectation{\"diagnostic\", \"\", rx})\n\n\t\tcase scanner.Ident:\n\t\t\tname := sc.TokenText()\n\t\t\ttok = sc.Scan()\n\t\t\tif tok != ':' {\n\t\t\t\treturn 0, nil, fmt.Errorf(\"got %s after %s, want ':'\",\n\t\t\t\t\tscanner.TokenString(tok), name)\n\t\t\t}\n\t\t\ttok = sc.Scan()\n\t\t\trx, err := scanRegexp(tok)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, nil, err\n\t\t\t}\n\t\t\texpects = append(expects, expectation{\"diagnostic\", name, rx})\n\n\t\tcase scanner.EOF:\n\t\t\tif scanErr != \"\" {\n\t\t\t\treturn 0, nil, fmt.Errorf(\"%s\", scanErr)\n\t\t\t}\n\t\t\treturn lineDelta, expects, nil\n\n\t\tdefault:\n\t\t\treturn 0, nil, fmt.Errorf(\"unexpected %s\", scanner.TokenString(tok))\n\t\t}\n\t}\n}\n\n// Inspired by:\n// https://github.com/golang/tools/blob/1261a24ceb1867ea7439eda244e53e7ace4ad777/go/analysis/analysistest/analysistest.go#L594-L617\nfunc checkMessage(t *testing.T, want map[key][]expectation, posn token.Position, kind, name, message string) {\n\tt.Helper()\n\n\tk := key{posn.Filename, posn.Line}\n\texpects := want[k]\n\tvar unmatched []string\n\n\tfor i, exp := range expects {\n\t\tif exp.kind == kind && (exp.name == \"\" || exp.name == name) {\n\t\t\tif exp.rx.MatchString(message) {\n\t\t\t\t// matched: remove the expectation.\n\t\t\t\texpects[i] = expects[len(expects)-1]\n\t\t\t\texpects = expects[:len(expects)-1]\n\t\t\t\twant[k] = expects\n\t\t\t\treturn\n\t\t\t}\n\t\t\tunmatched = append(unmatched, fmt.Sprintf(\"%#q\", exp.rx))\n\t\t}\n\t}\n\n\tif unmatched == nil {\n\t\tt.Errorf(\"%v: unexpected %s: %v\", posn, kind, message)\n\t} else {\n\t\tt.Errorf(\"%v: %s %q does not match pattern %s\",\n\t\t\tposn, kind, message, strings.Join(unmatched, \" or \"))\n\t}\n}\n"
  },
  {
    "path": "test/testshared/analysis_test.go",
    "content": "package testshared\n\nimport (\n\t\"regexp\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_parseComments(t *testing.T) {\n\ttestCases := []struct {\n\t\tfilename string\n\t\tdata     string\n\t\texpected map[key][]expectation\n\t}{\n\t\t{\n\t\t\tfilename: \"a/b.go\",\n\t\t\tdata: `package main // want package:\"found\"\n\n`,\n\t\t\texpected: map[key][]expectation{\n\t\t\t\t{file: \"a/b.go\", line: 1}: {\n\t\t\t\t\t{kind: \"diagnostic\", name: \"package\", rx: regexp.MustCompile(`found`)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfilename: \"a/c.go\",\n\t\t\tdata: `package main\n\nfunc main() {\n\tprintln(\"hello, world\") // want \"call of println\"\n}\n`,\n\t\t\texpected: map[key][]expectation{\n\t\t\t\t{file: \"a/c.go\", line: 4}: {\n\t\t\t\t\t{kind: \"diagnostic\", name: \"\", rx: regexp.MustCompile(`call of println`)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfilename: \"a/d.go\",\n\t\t\tdata: `package main\n\nfunc main() {\n\t// OK /* */-form.\n\tprintln(\"hello\") /* want \"call of println\" */\n}\n`,\n\t\t\texpected: map[key][]expectation{\n\t\t\t\t{file: \"a/d.go\", line: 5}: {\n\t\t\t\t\t{kind: \"diagnostic\", name: \"\", rx: regexp.MustCompile(`call of println`)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfilename: \"a/e.go\",\n\t\t\tdata: `package main\n\nfunc main() {\n\t// OK  (nested comment)\n\tprintln(\"hello\") // some comment // want \"call of println\"\n}\n`,\n\t\t\texpected: map[key][]expectation{\n\t\t\t\t{file: \"a/e.go\", line: 5}: {\n\t\t\t\t\t{kind: \"diagnostic\", name: \"\", rx: regexp.MustCompile(`call of println`)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfilename: \"a/f.go\",\n\t\t\tdata: `package main\n\nfunc main() {\n\t// OK (nested comment in /**/)\n\tprintln(\"hello\") /* some comment // want \"call of println\" */\n}\n`,\n\t\t\texpected: map[key][]expectation{\n\t\t\t\t{file: \"a/f.go\", line: 5}: {\n\t\t\t\t\t{kind: \"diagnostic\", name: \"\", rx: regexp.MustCompile(`call of println`)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfilename: \"a/g.go\",\n\t\t\tdata: `package main\n\nfunc main() {\n\t// OK (multiple expectations on same line)\n\tprintln(); println() // want \"call of println(...)\" \"call of println(...)\"\n}\n`,\n\t\t\texpected: map[key][]expectation{\n\t\t\t\t{file: \"a/g.go\", line: 5}: {\n\t\t\t\t\t{kind: \"diagnostic\", name: \"\", rx: regexp.MustCompile(`call of println(...)`)},\n\t\t\t\t\t{kind: \"diagnostic\", name: \"\", rx: regexp.MustCompile(`call of println(...)`)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfilename: \"a/h.go\",\n\t\t\tdata: `package main\n\nfunc println(...interface{}) { println() } // want println:\"found\" \"call of println(...)\"\n`,\n\t\t\texpected: map[key][]expectation{\n\t\t\t\t{file: \"a/h.go\", line: 3}: {\n\t\t\t\t\t{kind: \"diagnostic\", name: \"println\", rx: regexp.MustCompile(`found`)},\n\t\t\t\t\t{kind: \"diagnostic\", name: \"\", rx: regexp.MustCompile(`call of println(...)`)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfilename: \"a/b_test.go\",\n\t\t\tdata: `package main\n\n// Test file shouldn't mess with things\n`,\n\t\t\texpected: map[key][]expectation{},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.filename, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\texpectations, err := parseComments(test.filename, []byte(test.data))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.expected, expectations)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/testshared/directives.go",
    "content": "package testshared\n\nimport (\n\t\"bufio\"\n\t\"go/build/constraint\"\n\t\"os\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\thcversion \"github.com/hashicorp/go-version\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n)\n\n// RunContext the information extracted from directives.\ntype RunContext struct {\n\tArgs           []string\n\tConfigPath     string\n\tExpectedLinter string\n\tExitCode       int\n}\n\n// ParseTestDirectives parses test directives from sources files.\n//\n//nolint:funlen,gocyclo // can't be simplified without losing readability\nfunc ParseTestDirectives(tb testing.TB, sourcePath string) *RunContext {\n\ttb.Helper()\n\n\tf, err := os.Open(sourcePath)\n\trequire.NoError(tb, err)\n\ttb.Cleanup(func() { _ = f.Close() })\n\n\trc := &RunContext{\n\t\tExitCode: exitcodes.IssuesFound,\n\t}\n\n\tscanner := bufio.NewScanner(f)\n\tfor scanner.Scan() {\n\t\tline := scanner.Text()\n\t\tif strings.HasPrefix(line, \"/*\") {\n\t\t\tskipMultilineComment(scanner)\n\t\t\tcontinue\n\t\t}\n\t\tif strings.TrimSpace(line) == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif !strings.HasPrefix(line, \"//\") {\n\t\t\tbreak\n\t\t}\n\n\t\tif constraint.IsGoBuild(line) {\n\t\t\tif !evaluateBuildTags(tb, line) {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch {\n\t\tcase strings.HasPrefix(line, \"//golangcitest:\"):\n\t\t\t// Ok\n\t\tcase !strings.Contains(line, \"golangcitest\"):\n\t\t\t// Assume this is a regular comment (required for go-header tests)\n\t\t\tcontinue\n\t\tdefault:\n\t\t\trequire.Failf(tb, \"invalid prefix of comment line %s\", line)\n\t\t}\n\n\t\tbefore, after, found := strings.Cut(line, \" \")\n\t\trequire.Truef(tb, found, \"invalid prefix of comment line %s\", line)\n\n\t\tafter = strings.TrimSpace(after)\n\n\t\tswitch before {\n\t\tcase \"//golangcitest:args\":\n\t\t\trequire.Nil(tb, rc.Args)\n\t\t\trequire.NotEmpty(tb, after)\n\t\t\trc.Args = strings.Split(after, \" \")\n\t\t\tcontinue\n\n\t\tcase \"//golangcitest:config_path\":\n\t\t\trequire.NotEmpty(tb, after)\n\t\t\trc.ConfigPath = after\n\t\t\tcontinue\n\n\t\tcase \"//golangcitest:expected_linter\":\n\t\t\trequire.NotEmpty(tb, after)\n\t\t\trc.ExpectedLinter = after\n\t\t\tcontinue\n\n\t\tcase \"//golangcitest:expected_exitcode\":\n\t\t\trequire.NotEmpty(tb, after)\n\t\t\tval, err := strconv.Atoi(after)\n\t\t\trequire.NoError(tb, err)\n\n\t\t\trc.ExitCode = val\n\t\t\tcontinue\n\n\t\tdefault:\n\t\t\trequire.Failf(tb, \"invalid prefix of comment line %s\", line)\n\t\t}\n\t}\n\n\t// guess the expected linter if none is specified\n\tif rc.ExpectedLinter == \"\" {\n\t\tfor _, arg := range rc.Args {\n\t\t\tif strings.HasPrefix(arg, \"-E\") && !strings.Contains(arg, \",\") {\n\t\t\t\trequire.Empty(tb, rc.ExpectedLinter,\n\t\t\t\t\t\"could not infer expected linter for errors because multiple linters are enabled. \"+\n\t\t\t\t\t\t\"Please use the `//golangcitest:expected_linter ` directive in your test to indicate the linter-under-test.\")\n\t\t\t\trc.ExpectedLinter = arg[2:]\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rc\n}\n\nfunc skipMultilineComment(scanner *bufio.Scanner) {\n\tfor line := scanner.Text(); !strings.Contains(line, \"*/\") && scanner.Scan(); {\n\t\tline = scanner.Text()\n\t}\n}\n\n// evaluateBuildTags Naive implementation of the evaluation of the build tags.\n// Inspired by https://github.com/golang/go/blob/1dcef7b3bdcea4a829ea22c821e6a9484c325d61/src/cmd/go/internal/modindex/build.go#L914-L972\nfunc evaluateBuildTags(tb testing.TB, line string) bool {\n\tparse, err := constraint.Parse(line)\n\trequire.NoError(tb, err)\n\n\treturn parse.Eval(func(tag string) bool {\n\t\tif tag == runtime.GOOS {\n\t\t\treturn true\n\t\t}\n\n\t\tif tag == runtime.GOARCH {\n\t\t\treturn true\n\t\t}\n\n\t\tif buildTagGoVersion(tag) {\n\t\t\treturn true\n\t\t}\n\n\t\treturn false\n\t})\n}\n\nfunc buildTagGoVersion(tag string) bool {\n\t// `runtime.Version()` returns the go version with extra info. (ex: go1.25.1 X:nodwarf5)\n\tbefore, _, _ := strings.Cut(runtime.Version(), \" \")\n\n\tvRuntime, err := hcversion.NewVersion(strings.TrimPrefix(before, \"go\"))\n\tif err != nil {\n\t\treturn false\n\t}\n\n\tvTag, err := hcversion.NewVersion(strings.TrimPrefix(tag, \"go\"))\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn vRuntime.GreaterThanOrEqual(vTag)\n}\n"
  },
  {
    "path": "test/testshared/directives_test.go",
    "content": "package testshared\n\nimport (\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n)\n\nfunc TestParseTestDirectives(t *testing.T) {\n\trc := ParseTestDirectives(t, \"./testdata/all.go\")\n\trequire.NotNil(t, rc)\n\n\texpected := &RunContext{\n\t\tArgs:           []string{\"-Efoo\", \"--simple\", \"--hello=world\"},\n\t\tConfigPath:     \"testdata/example.yml\",\n\t\tExpectedLinter: \"bar\",\n\t\tExitCode:       exitcodes.Success,\n\t}\n\tassert.Equal(t, expected, rc)\n}\n\nfunc Test_evaluateBuildTags(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc   string\n\t\ttag    string\n\t\tassert assert.BoolAssertionFunc\n\t}{\n\t\t{\n\t\t\tdesc:   \"old build tag syntax, version inside the range\",\n\t\t\ttag:    \"// +build go1.18\",\n\t\t\tassert: assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:   \"old build tag syntax, version outside the range\",\n\t\t\ttag:    \"// +build go1.42\",\n\t\t\tassert: assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc:   \"version inside the range\",\n\t\t\ttag:    \"//go:build go1.18\",\n\t\t\tassert: assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:   \"version outside the range\",\n\t\t\ttag:    \"//go:build go1.42\",\n\t\t\tassert: assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc:   \"supported OS\",\n\t\t\ttag:    \"//go:build \" + runtime.GOOS,\n\t\t\tassert: assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:   \"negate unsupported OS\",\n\t\t\ttag:    \"//go:build !wondiws\",\n\t\t\tassert: assert.True,\n\t\t},\n\t\t{\n\t\t\tdesc:   \"unsupported OS\",\n\t\t\ttag:    \"//go:build wondiws\",\n\t\t\tassert: assert.False,\n\t\t},\n\t\t{\n\t\t\tdesc:   \"version inside the range and supported OS\",\n\t\t\ttag:    \"//go:build go1.18 && \" + runtime.GOOS,\n\t\t\tassert: assert.True,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\ttest.assert(t, evaluateBuildTags(t, test.tag))\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/testshared/install.go",
    "content": "package testshared\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/gofrs/flock\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// value: \"true\"\nconst envGolangciLintInstalled = \"GOLANGCI_LINT_INSTALLED\"\n\n// Reduce the number of builds.\n// The majority of tests are NOT executed inside the same process,\n// then this is just to limit some cases (~60 cases).\nvar (\n\tbuiltLock sync.RWMutex\n\tbuilt     bool\n)\n\nfunc InstallGolangciLint(tb testing.TB) string {\n\ttb.Helper()\n\n\tparentPath := findMakefile(tb)\n\n\t// Avoids concurrent builds and copies (before the end of the build).\n\tf := flock.New(filepath.Join(parentPath, \"test.lock\"))\n\n\tif ok, _ := strconv.ParseBool(os.Getenv(envGolangciLintInstalled)); !ok {\n\t\terr := f.Lock()\n\t\trequire.NoError(tb, err)\n\n\t\tdefer func() {\n\t\t\terrU := f.Unlock()\n\t\t\tif errU != nil {\n\t\t\t\ttb.Logf(\"Can't unlock test.lock: %v\", errU)\n\t\t\t}\n\t\t}()\n\n\t\tbuiltLock.Lock()\n\t\tdefer builtLock.Unlock()\n\n\t\tif !built {\n\t\t\tcmd := exec.CommandContext(tb.Context(), \"make\", \"-C\", parentPath, \"build\")\n\n\t\t\toutput, err := cmd.CombinedOutput()\n\t\t\trequire.NoError(tb, err, \"can't install golangci-lint %s\", string(output))\n\n\t\t\tbuilt = true\n\t\t}\n\t}\n\n\t// Allow tests to avoid edge-cases with concurrent runs.\n\tbinPath := filepath.Join(tb.TempDir(), binaryName)\n\n\terr := copyFile(filepath.Join(parentPath, binaryName), binPath)\n\trequire.NoError(tb, err)\n\n\tabs, err := filepath.Abs(binPath)\n\trequire.NoError(tb, err)\n\n\treturn abs\n}\n\nfunc findMakefile(tb testing.TB) string {\n\ttb.Helper()\n\n\twd, _ := os.Getwd()\n\n\tfor wd != \"/\" {\n\t\t_, err := os.Stat(filepath.Join(wd, \"Makefile\"))\n\t\tif err != nil {\n\t\t\twd = filepath.Dir(wd)\n\t\t\tcontinue\n\t\t}\n\n\t\tbreak\n\t}\n\n\there, _ := os.Getwd()\n\n\trel, err := filepath.Rel(here, wd)\n\trequire.NoError(tb, err)\n\n\treturn rel\n}\n\nfunc copyFile(src, dst string) error {\n\tsource, err := os.Open(src)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open file %s: %w\", src, err)\n\t}\n\n\tdefer func() { _ = source.Close() }()\n\n\tinfo, err := source.Stat()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"file %s not found: %w\", src, err)\n\t}\n\n\tdestination, err := os.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, info.Mode())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create file %s: %w\", dst, err)\n\t}\n\n\tdefer func() { _ = destination.Close() }()\n\n\t_, err = io.Copy(destination, source)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"copy file %s to %s: %w\", src, dst, err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "test/testshared/integration/fix.go",
    "content": "package integration\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/test/testshared\"\n)\n\n// value: \"1\"\nconst envKeepTempFiles = \"GL_KEEP_TEMP_FILES\"\n\nfunc setupTestFix(t *testing.T) []string {\n\tt.Helper()\n\n\ttestshared.SkipOnWindows(t)\n\n\ttmpDir := filepath.Join(testdataDir, \"fix.tmp\")\n\t_ = os.RemoveAll(tmpDir) // cleanup previous runs\n\n\tif os.Getenv(envKeepTempFiles) == \"1\" {\n\t\tt.Logf(\"Temp dir for fix test: %s\", tmpDir)\n\t} else {\n\t\tt.Cleanup(func() { _ = os.RemoveAll(tmpDir) })\n\t}\n\n\tsourcesDir := filepath.Join(testdataDir, \"fix\")\n\n\terr := exec.CommandContext(t.Context(), \"cp\", \"-R\", sourcesDir, tmpDir).Run()\n\trequire.NoError(t, err)\n\n\treturn findSources(t, tmpDir, \"in\", \"*.go\")\n}\n\nfunc RunFix(t *testing.T) {\n\tt.Helper()\n\n\trunFix(t)\n}\n\nfunc RunFixPathPrefix(t *testing.T) {\n\tt.Helper()\n\n\trunFix(t, \"--path-prefix=foobar/\")\n}\n\nfunc runFix(t *testing.T, extraArgs ...string) {\n\tt.Helper()\n\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\tsources := setupTestFix(t)\n\n\tfor _, input := range sources {\n\t\tt.Run(filepath.Base(input), func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\trc := testshared.ParseTestDirectives(t, input)\n\t\t\tif rc == nil {\n\t\t\t\tt.Logf(\"Skipped: %s\", input)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttestshared.NewRunnerBuilder(t).\n\t\t\t\tWithArgs(\"--default=none\",\n\t\t\t\t\t\"--output.text.print-issued-lines=false\",\n\t\t\t\t\t\"--output.text.print-linter-name=false\",\n\t\t\t\t\t\"--output.text.path=stdout\",\n\t\t\t\t\t\"--fix\").\n\t\t\t\tWithArgs(extraArgs...).\n\t\t\t\tWithRunContext(rc).\n\t\t\t\tWithTargetPath(input).\n\t\t\t\tWithBinPath(binPath).\n\t\t\t\tRunner().\n\t\t\t\tRun().\n\t\t\t\tExpectExitCode(rc.ExitCode)\n\n\t\t\toutput, err := os.ReadFile(input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\texpectedOutput, err := os.ReadFile(filepath.Join(testdataDir, \"fix\", \"out\", filepath.Base(input)))\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.Equal(t, string(expectedOutput), string(output))\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/testshared/integration/run.go",
    "content": "package integration\n\nimport (\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n\t\"github.com/golangci/golangci-lint/v2/test/testshared\"\n)\n\nconst testdataDir = \"testdata\"\n\nfunc RunTestdata(t *testing.T) {\n\tt.Helper()\n\n\tRunTestSourcesFromDir(t, testdataDir)\n}\n\nfunc RunTestSourcesFromDir(t *testing.T, dir string) {\n\tt.Helper()\n\n\tt.Log(filepath.Join(dir, \"*.go\"))\n\n\tsources := findSources(t, dir, \"*.go\")\n\n\tbinPath := testshared.InstallGolangciLint(t)\n\n\tt.Chdir(dir)\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyTest)\n\tlog.SetLevel(logutils.LogLevelInfo)\n\n\tfor _, source := range sources {\n\t\tt.Run(filepath.Base(source), func(subTest *testing.T) {\n\t\t\tsubTest.Parallel()\n\n\t\t\trel, err := filepath.Rel(dir, source)\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttestOneSource(subTest, log, binPath, rel)\n\t\t})\n\t}\n}\n\nfunc testOneSource(t *testing.T, log *logutils.StderrLog, binPath, sourcePath string) {\n\tt.Helper()\n\n\trc := testshared.ParseTestDirectives(t, sourcePath)\n\tif rc == nil {\n\t\tt.Skipf(\"Skipped: %s\", sourcePath)\n\t}\n\n\targs := []string{\n\t\t\"--default=none\",\n\t\t\"--show-stats=false\",\n\t\t\"--output.json.path=stdout\",\n\t\t\"--max-same-issues=100\",\n\t\t\"--max-issues-per-linter=100\",\n\t}\n\n\tfor _, addArg := range []string{\"\", \"-Etypecheck\"} {\n\t\tcaseArgs := slices.Clone(args)\n\n\t\tif addArg != \"\" {\n\t\t\tcaseArgs = append(caseArgs, addArg)\n\t\t}\n\n\t\tcmd := testshared.NewRunnerBuilder(t).\n\t\t\tWithBinPath(binPath).\n\t\t\tWithArgs(caseArgs...).\n\t\t\tWithRunContext(rc).\n\t\t\tWithTargetPath(sourcePath).\n\t\t\tRunner().\n\t\t\tCommand()\n\n\t\tstartedAt := time.Now()\n\n\t\toutput, err := cmd.CombinedOutput()\n\n\t\tlog.Infof(\"ran [%s] in %s\", strings.Join(cmd.Args, \" \"), time.Since(startedAt))\n\n\t\t// The returned error will be nil if the test file does not have any issues\n\t\t// and thus the linter exits with exit code 0.\n\t\t// So perform the additional assertions only if the error is non-nil.\n\t\tif err != nil {\n\t\t\tvar exitErr *exec.ExitError\n\t\t\trequire.ErrorAs(t, err, &exitErr)\n\t\t}\n\n\t\trequire.Equal(t, rc.ExitCode, cmd.ProcessState.ExitCode(), \"Unexpected exit code: %s\", string(output))\n\n\t\ttestshared.Analyze(t, sourcePath, output)\n\t}\n}\n\nfunc findSources(t *testing.T, pathPatterns ...string) []string {\n\tt.Helper()\n\n\tsources, err := filepath.Glob(filepath.Join(pathPatterns...))\n\trequire.NoError(t, err)\n\trequire.NotEmpty(t, sources)\n\n\treturn sources\n}\n"
  },
  {
    "path": "test/testshared/runner.go",
    "content": "package testshared\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/fsutils\"\n\t\"github.com/golangci/golangci-lint/v2/pkg/logutils\"\n)\n\n// value: \"1\"\nconst envKeepTempFiles = \"GL_KEEP_TEMP_FILES\"\n\ntype RunnerBuilder struct {\n\ttb  testing.TB\n\tlog logutils.Log\n\n\tbinPath string\n\tcommand string\n\tenv     []string\n\n\tconfigPath           string\n\tnoConfig             bool\n\tallowParallelRunners bool\n\targs                 []string\n\ttarget               string\n}\n\nfunc NewRunnerBuilder(tb testing.TB) *RunnerBuilder {\n\ttb.Helper()\n\n\tlog := logutils.NewStderrLog(logutils.DebugKeyTest)\n\tlog.SetLevel(logutils.LogLevelInfo)\n\n\treturn &RunnerBuilder{\n\t\ttb:                   tb,\n\t\tlog:                  log,\n\t\tcommand:              \"run\",\n\t\tallowParallelRunners: true,\n\t}\n}\n\nfunc (b *RunnerBuilder) WithBinPath(binPath string) *RunnerBuilder {\n\tb.binPath = binPath\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) WithCommand(command string) *RunnerBuilder {\n\tb.command = command\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) WithNoConfig() *RunnerBuilder {\n\tb.noConfig = true\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) WithConfigFile(cfgPath string) *RunnerBuilder {\n\tif cfgPath != \"\" {\n\t\tb.configPath = filepath.FromSlash(cfgPath)\n\t}\n\n\tb.noConfig = cfgPath == \"\"\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) WithConfig(cfg string) *RunnerBuilder {\n\tb.tb.Helper()\n\n\tcontent := strings.ReplaceAll(strings.TrimSpace(cfg), \"\\t\", \" \")\n\n\tif content == \"\" {\n\t\treturn b.WithNoConfig()\n\t}\n\n\tcfgFile, err := os.CreateTemp(\"\", \"golangci_lint_test*.yml\")\n\trequire.NoError(b.tb, err)\n\n\tcfgPath := cfgFile.Name()\n\tb.tb.Cleanup(func() {\n\t\tif os.Getenv(envKeepTempFiles) != \"1\" {\n\t\t\t_ = os.Remove(cfgPath)\n\t\t}\n\t})\n\n\t_, err = cfgFile.WriteString(content)\n\trequire.NoError(b.tb, err)\n\n\treturn b.WithConfigFile(cfgPath)\n}\n\nfunc (b *RunnerBuilder) WithRunContext(rc *RunContext) *RunnerBuilder {\n\tif rc == nil {\n\t\treturn b\n\t}\n\n\tdir, err := os.Getwd()\n\trequire.NoError(b.tb, err)\n\n\tconfigPath := filepath.FromSlash(rc.ConfigPath)\n\n\tbase := filepath.Base(dir)\n\tif strings.HasPrefix(configPath, base) {\n\t\tconfigPath = strings.TrimPrefix(configPath, base+string(filepath.Separator))\n\t}\n\n\treturn b.WithConfigFile(configPath).WithArgs(rc.Args...)\n}\n\nfunc (b *RunnerBuilder) WithDirectives(sourcePath string) *RunnerBuilder {\n\tb.tb.Helper()\n\n\treturn b.WithRunContext(ParseTestDirectives(b.tb, sourcePath))\n}\n\nfunc (b *RunnerBuilder) WithEnviron(environ ...string) *RunnerBuilder {\n\tb.env = environ\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) WithNoParallelRunners() *RunnerBuilder {\n\tb.allowParallelRunners = false\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) WithArgs(args ...string) *RunnerBuilder {\n\tb.args = append(b.args, args...)\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) WithTargetPath(targets ...string) *RunnerBuilder {\n\tb.target = filepath.Join(targets...)\n\n\treturn b\n}\n\nfunc (b *RunnerBuilder) Runner() *Runner {\n\tb.tb.Helper()\n\n\tif b.noConfig && b.configPath != \"\" {\n\t\tb.tb.Fatal(\"--no-config and -c cannot be used at the same time\")\n\t}\n\n\tvar arguments []string\n\n\tif b.command == \"run\" {\n\t\targuments = append(arguments, \"--internal-cmd-test\")\n\t\tif b.allowParallelRunners {\n\t\t\targuments = append(arguments, \"--allow-parallel-runners\")\n\t\t}\n\t}\n\n\tif b.noConfig {\n\t\targuments = append(arguments, \"--no-config\")\n\t}\n\n\tif b.configPath != \"\" {\n\t\targuments = append(arguments, \"-c\", b.configPath)\n\t}\n\n\tif len(b.args) != 0 {\n\t\targuments = append(arguments, b.args...)\n\t}\n\n\tif b.target != \"\" {\n\t\targuments = append(arguments, b.target)\n\t}\n\n\treturn &Runner{\n\t\tbinPath: b.binPath,\n\t\tlog:     b.log,\n\t\ttb:      b.tb,\n\t\tenv:     b.env,\n\t\tcommand: b.command,\n\t\targs:    arguments,\n\t}\n}\n\ntype Runner struct {\n\tlog logutils.Log\n\ttb  testing.TB\n\n\tbinPath string\n\tenv     []string\n\tcommand string\n\targs    []string\n\n\tinstallOnce sync.Once\n}\n\nfunc (r *Runner) Install() *Runner {\n\tr.tb.Helper()\n\n\tr.installOnce.Do(func() {\n\t\tr.binPath = InstallGolangciLint(r.tb)\n\t})\n\n\treturn r\n}\n\nfunc (r *Runner) Run() *RunnerResult {\n\tr.tb.Helper()\n\n\trunArgs := append([]string{r.command}, r.args...)\n\n\tdefer func(startedAt time.Time) {\n\t\tr.log.Infof(\"ran [%s %s] in %s\", r.binPath, strings.Join(runArgs, \" \"), time.Since(startedAt))\n\t}(time.Now())\n\n\tcmd := r.Command()\n\n\tout, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tif exitError, ok := err.(*exec.ExitError); ok {\n\t\t\tif len(exitError.Stderr) != 0 {\n\t\t\t\tr.log.Infof(\"stderr: %s\", exitError.Stderr)\n\t\t\t}\n\n\t\t\tws := exitError.Sys().(syscall.WaitStatus)\n\n\t\t\treturn &RunnerResult{\n\t\t\t\ttb:       r.tb,\n\t\t\t\toutput:   string(out),\n\t\t\t\texitCode: ws.ExitStatus(),\n\t\t\t}\n\t\t}\n\n\t\tr.tb.Errorf(\"can't get error code from %s\", err)\n\n\t\treturn nil\n\t}\n\n\t// success, exitCode should be 0 if go is ok\n\tws := cmd.ProcessState.Sys().(syscall.WaitStatus)\n\n\treturn &RunnerResult{\n\t\ttb:       r.tb,\n\t\toutput:   string(out),\n\t\texitCode: ws.ExitStatus(),\n\t}\n}\n\nfunc (r *Runner) Command() *exec.Cmd {\n\tr.tb.Helper()\n\n\trunArgs := append([]string{r.command}, r.args...)\n\n\t//nolint:gosec // we don't use user input here\n\tcmd := exec.CommandContext(r.tb.Context(), r.binPath, runArgs...)\n\tcmd.Env = append(os.Environ(), r.env...)\n\tcmd.Env = append(cmd.Env, \"GOLANGCI_LINT_CACHE=\"+r.tb.TempDir())\n\n\treturn cmd\n}\n\ntype RunnerResult struct {\n\ttb testing.TB\n\n\toutput   string\n\texitCode int\n}\n\nfunc (r *RunnerResult) ExpectNoIssues() {\n\tr.tb.Helper()\n\n\tassert.Empty(r.tb, r.output, \"exit code is %d\", r.exitCode)\n\tassert.Equal(r.tb, exitcodes.Success, r.exitCode, \"output is %s\", r.output)\n}\n\nfunc (r *RunnerResult) ExpectExitCode(possibleCodes ...int) *RunnerResult {\n\tr.tb.Helper()\n\n\tif slices.Contains(possibleCodes, r.exitCode) {\n\t\treturn r\n\t}\n\n\tassert.Fail(r.tb, \"invalid exit code\", \"exit code (%d) must be one of %v: %s\", r.exitCode, possibleCodes, r.output)\n\treturn r\n}\n\n// ExpectOutputRegexp can be called with either a string or compiled regexp\nfunc (r *RunnerResult) ExpectOutputRegexp(s string) *RunnerResult {\n\tr.tb.Helper()\n\n\tassert.Regexp(r.tb, fsutils.NormalizePathInRegex(s), r.output, \"exit code is %d\", r.exitCode)\n\treturn r\n}\n\nfunc (r *RunnerResult) ExpectOutputContains(s ...string) *RunnerResult {\n\tr.tb.Helper()\n\n\tfor _, expected := range s {\n\t\tassert.Contains(r.tb, r.output, normalizeFilePath(expected), \"exit code is %d\", r.exitCode)\n\t}\n\n\treturn r\n}\n\nfunc (r *RunnerResult) ExpectOutputNotContains(s string) *RunnerResult {\n\tr.tb.Helper()\n\n\tassert.NotContains(r.tb, r.output, s, \"exit code is %d\", r.exitCode)\n\treturn r\n}\n\nfunc (r *RunnerResult) ExpectOutputEq(s string) *RunnerResult {\n\tr.tb.Helper()\n\n\tassert.Equal(r.tb, normalizeFilePath(s), r.output, \"exit code is %d\", r.exitCode)\n\treturn r\n}\n\nfunc (r *RunnerResult) ExpectHasIssue(issueText string) *RunnerResult {\n\tr.tb.Helper()\n\n\treturn r.ExpectExitCode(exitcodes.IssuesFound).ExpectOutputContains(issueText)\n}\n"
  },
  {
    "path": "test/testshared/runner_test.go",
    "content": "package testshared\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/golangci/golangci-lint/v2/pkg/exitcodes\"\n)\n\nfunc TestRunnerBuilder_Runner(t *testing.T) {\n\ttestCases := []struct {\n\t\tdesc     string\n\t\tbuilder  *RunnerBuilder\n\t\texpected *Runner\n\t}{\n\t\t{\n\t\t\tdesc:    \"default\",\n\t\t\tbuilder: NewRunnerBuilder(t),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with non run command\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithCommand(\"example\"),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"example\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with run command\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithCommand(\"run\"),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with no-config\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithNoConfig(),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t\t\"--no-config\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with config file\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithConfigFile(\"./testdata/example.yml\"),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t\t\"-c\",\n\t\t\t\t\tfilepath.FromSlash(\"./testdata/example.yml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with directives\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithDirectives(\"./testdata/all.go\"),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t\t\"-c\",\n\t\t\t\t\tfilepath.FromSlash(\"testdata/example.yml\"),\n\t\t\t\t\t\"-Efoo\",\n\t\t\t\t\t\"--simple\",\n\t\t\t\t\t\"--hello=world\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with environ\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithEnviron(\"FOO=BAR\", \"FII=BIR\"),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string{\"FOO=BAR\", \"FII=BIR\"},\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with no parallel runners\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithNoParallelRunners(),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with args\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithArgs(\"-Efoo\", \"--simple\", \"--hello=world\"),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t\t\"-Efoo\",\n\t\t\t\t\t\"--simple\",\n\t\t\t\t\t\"--hello=world\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:    \"with target path\",\n\t\t\tbuilder: NewRunnerBuilder(t).WithTargetPath(\"./testdata/all.go\"),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t\tfilepath.FromSlash(\"testdata/all.go\"),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"with RunContext (directives)\",\n\t\t\tbuilder: NewRunnerBuilder(t).\n\t\t\t\tWithRunContext(&RunContext{\n\t\t\t\t\tArgs:           []string{\"-Efoo\", \"--simple\", \"--hello=world\"},\n\t\t\t\t\tConfigPath:     filepath.FromSlash(\"testdata/example.yml\"),\n\t\t\t\t\tExpectedLinter: \"test\",\n\t\t\t\t}),\n\t\t\texpected: &Runner{\n\t\t\t\tenv:     []string(nil),\n\t\t\t\tcommand: \"run\",\n\t\t\t\targs: []string{\n\t\t\t\t\t\"--internal-cmd-test\",\n\t\t\t\t\t\"--allow-parallel-runners\",\n\t\t\t\t\t\"-c\",\n\t\t\t\t\tfilepath.FromSlash(\"testdata/example.yml\"),\n\t\t\t\t\t\"-Efoo\",\n\t\t\t\t\t\"--simple\",\n\t\t\t\t\t\"--hello=world\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tt.Run(test.desc, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\trunner := test.builder.Runner()\n\n\t\t\tassert.NotNil(t, runner.log)\n\t\t\tassert.NotNil(t, runner.tb)\n\t\t\tassert.Equal(t, test.expected.env, runner.env)\n\t\t\tassert.Equal(t, test.expected.command, runner.command)\n\t\t\tassert.Equal(t, test.expected.args, runner.args)\n\t\t})\n\t}\n}\n\nfunc TestRunnerResult_ExpectExitCode(t *testing.T) {\n\tr := &RunnerResult{tb: t, exitCode: exitcodes.Success}\n\tr.ExpectExitCode(exitcodes.Failure, exitcodes.Success)\n}\n\nfunc TestRunnerResult_ExpectNoIssues(t *testing.T) {\n\tr := &RunnerResult{tb: t}\n\tr.ExpectNoIssues()\n}\n\nfunc TestRunnerResult_ExpectOutputContains(t *testing.T) {\n\tr := &RunnerResult{tb: t, output: \"this is an output\"}\n\tr.ExpectOutputContains(\"an\")\n}\n\nfunc TestRunnerResult_ExpectHasIssue(t *testing.T) {\n\tr := &RunnerResult{tb: t, exitCode: exitcodes.IssuesFound, output: \"this is an output\"}\n\tr.ExpectHasIssue(\"an\")\n}\n\nfunc TestRunnerResult_ExpectOutputEq(t *testing.T) {\n\tr := &RunnerResult{tb: t, output: \"this is an output\"}\n\tr.ExpectOutputEq(\"this is an output\")\n}\n\nfunc TestRunnerResult_ExpectOutputNotContains(t *testing.T) {\n\tr := &RunnerResult{tb: t, output: \"this is an output\"}\n\tr.ExpectOutputNotContains(\"one\")\n}\n\nfunc TestRunnerResult_ExpectOutputRegexp(t *testing.T) {\n\tr := &RunnerResult{tb: t, output: \"this is an output\"}\n\tr.ExpectOutputRegexp(`an.+`)\n\tr.ExpectOutputRegexp(\"an\")\n}\n"
  },
  {
    "path": "test/testshared/runner_unix.go",
    "content": "//go:build !windows\n\npackage testshared\n\nimport (\n\t\"testing\"\n)\n\nconst binaryName = \"golangci-lint\"\n\n// SkipOnWindows it's a noop function on Unix.\nfunc SkipOnWindows(_ testing.TB) {}\n\n// NormalizeFilePathInJSON it's a noop function on Unix.\nfunc NormalizeFilePathInJSON(in string) string {\n\treturn in\n}\n\n// NormalizeFileInString it's a noop function on Unix.\nfunc NormalizeFileInString(in string) string {\n\treturn in\n}\n\n// normalizeFilePath it's a noop function on Unix.\nfunc normalizeFilePath(in string) string {\n\treturn in\n}\n"
  },
  {
    "path": "test/testshared/runner_windows.go",
    "content": "//go:build windows\n\npackage testshared\n\nimport (\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"testing\"\n)\n\nconst binaryName = \"golangci-lint.exe\"\n\n// SkipOnWindows skip test on Windows.\nfunc SkipOnWindows(tb testing.TB) {\n\ttb.Skip(\"not supported on Windows\")\n}\n\n// NormalizeFilePathInJSON find Go file path and replace `/` with `\\\\\\\\`.\nfunc NormalizeFilePathInJSON(in string) string {\n\texp := regexp.MustCompile(`(?:^|\\b)[\\w-/.]+\\.go`)\n\n\treturn exp.ReplaceAllStringFunc(in, func(s string) string {\n\t\treturn strings.ReplaceAll(s, \"/\", \"\\\\\\\\\")\n\t})\n}\n\n// NormalizeFileInString normalizes in quoted string, ie. replace `\\\\` with `\\\\\\\\`.\nfunc NormalizeFileInString(in string) string {\n\treturn strings.ReplaceAll(filepath.FromSlash(in), \"\\\\\", \"\\\\\\\\\")\n}\n\n// normalizeFilePath find Go file path and replace `/` with `\\\\`.\nfunc normalizeFilePath(in string) string {\n\texp := regexp.MustCompile(`(?:^|\\b)[\\w-/.]+\\.go`)\n\n\treturn exp.ReplaceAllStringFunc(in, func(s string) string {\n\t\treturn strings.ReplaceAll(s, \"/\", \"\\\\\")\n\t})\n}\n"
  },
  {
    "path": "test/testshared/testdata/all.go",
    "content": "//golangcitest:args -Efoo --simple --hello=world\n//golangcitest:config_path testdata/example.yml\n//golangcitest:expected_linter bar\n//golangcitest:expected_exitcode 0\npackage testdata\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"Hello\")\n}\n"
  },
  {
    "path": "third_party/dogsled/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Alex Kohler\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "third_party/gochecknoglobals/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Leigh McCulloch\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "third_party/gochecknoinits/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Leigh McCulloch\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "third_party/gometalinter/LICENSE",
    "content": "Copyright (C) 2012 Alec Thomas\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "third_party/lll/LICENSE",
    "content": "Copyright (c) 2016 Fredrik Wallgren\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "third_party/nakedret/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Alex Kohler\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "third_party/x_tools/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  }
]